xref: /aosp_15_r20/external/angle/src/common/android_util.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // android_util.cpp: Utilities for the using the Android platform
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "common/android_util.h"
10*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_ANDROID)
13*8975f5c5SAndroid Build Coastguard Worker #    include <sys/system_properties.h>
14*8975f5c5SAndroid Build Coastguard Worker #endif
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_ANDROID) && __ANDROID_API__ >= 26
17*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_AHARDWARE_BUFFER_SUPPORT
18*8975f5c5SAndroid Build Coastguard Worker // NDK header file for access to Android Hardware Buffers
19*8975f5c5SAndroid Build Coastguard Worker #    include <android/hardware_buffer.h>
20*8975f5c5SAndroid Build Coastguard Worker #endif
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker // Taken from cutils/native_handle.h:
23*8975f5c5SAndroid Build Coastguard Worker // https://android.googlesource.com/platform/system/core/+/master/libcutils/include/cutils/native_handle.h
24*8975f5c5SAndroid Build Coastguard Worker typedef struct native_handle
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker     int version; /* sizeof(native_handle_t) */
27*8975f5c5SAndroid Build Coastguard Worker     int numFds;  /* number of file-descriptors at &data[0] */
28*8975f5c5SAndroid Build Coastguard Worker     int numInts; /* number of ints at &data[numFds] */
29*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__)
30*8975f5c5SAndroid Build Coastguard Worker #    pragma clang diagnostic push
31*8975f5c5SAndroid Build Coastguard Worker #    pragma clang diagnostic ignored "-Wzero-length-array"
32*8975f5c5SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
33*8975f5c5SAndroid Build Coastguard Worker #    pragma warning(push)
34*8975f5c5SAndroid Build Coastguard Worker #    pragma warning(disable : 4200)
35*8975f5c5SAndroid Build Coastguard Worker #endif
36*8975f5c5SAndroid Build Coastguard Worker     int data[0]; /* numFds + numInts ints */
37*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__)
38*8975f5c5SAndroid Build Coastguard Worker #    pragma clang diagnostic pop
39*8975f5c5SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
40*8975f5c5SAndroid Build Coastguard Worker #    pragma warning(pop)
41*8975f5c5SAndroid Build Coastguard Worker #endif
42*8975f5c5SAndroid Build Coastguard Worker } native_handle_t;
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker // Taken from nativebase/nativebase.h
45*8975f5c5SAndroid Build Coastguard Worker // https://android.googlesource.com/platform/frameworks/native/+/master/libs/nativebase/include/nativebase/nativebase.h
46*8975f5c5SAndroid Build Coastguard Worker typedef const native_handle_t *buffer_handle_t;
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker typedef struct android_native_base_t
49*8975f5c5SAndroid Build Coastguard Worker {
50*8975f5c5SAndroid Build Coastguard Worker     /* a magic value defined by the actual EGL native type */
51*8975f5c5SAndroid Build Coastguard Worker     int magic;
52*8975f5c5SAndroid Build Coastguard Worker     /* the sizeof() of the actual EGL native type */
53*8975f5c5SAndroid Build Coastguard Worker     int version;
54*8975f5c5SAndroid Build Coastguard Worker     void *reserved[4];
55*8975f5c5SAndroid Build Coastguard Worker     /* reference-counting interface */
56*8975f5c5SAndroid Build Coastguard Worker     void (*incRef)(struct android_native_base_t *base);
57*8975f5c5SAndroid Build Coastguard Worker     void (*decRef)(struct android_native_base_t *base);
58*8975f5c5SAndroid Build Coastguard Worker } android_native_base_t;
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker typedef struct ANativeWindowBuffer
61*8975f5c5SAndroid Build Coastguard Worker {
62*8975f5c5SAndroid Build Coastguard Worker     struct android_native_base_t common;
63*8975f5c5SAndroid Build Coastguard Worker     int width;
64*8975f5c5SAndroid Build Coastguard Worker     int height;
65*8975f5c5SAndroid Build Coastguard Worker     int stride;
66*8975f5c5SAndroid Build Coastguard Worker     int format;
67*8975f5c5SAndroid Build Coastguard Worker     int usage_deprecated;
68*8975f5c5SAndroid Build Coastguard Worker     uintptr_t layerCount;
69*8975f5c5SAndroid Build Coastguard Worker     void *reserved[1];
70*8975f5c5SAndroid Build Coastguard Worker     const native_handle_t *handle;
71*8975f5c5SAndroid Build Coastguard Worker     uint64_t usage;
72*8975f5c5SAndroid Build Coastguard Worker     // we needed extra space for storing the 64-bits usage flags
73*8975f5c5SAndroid Build Coastguard Worker     // the number of slots to use from reserved_proc depends on the
74*8975f5c5SAndroid Build Coastguard Worker     // architecture.
75*8975f5c5SAndroid Build Coastguard Worker     void *reserved_proc[8 - (sizeof(uint64_t) / sizeof(void *))];
76*8975f5c5SAndroid Build Coastguard Worker } ANativeWindowBuffer_t;
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker namespace angle
79*8975f5c5SAndroid Build Coastguard Worker {
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker namespace android
82*8975f5c5SAndroid Build Coastguard Worker {
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker namespace
85*8975f5c5SAndroid Build Coastguard Worker {
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker // In the Android system:
88*8975f5c5SAndroid Build Coastguard Worker // - AHardwareBuffer is essentially a typedef of GraphicBuffer. Conversion functions simply
89*8975f5c5SAndroid Build Coastguard Worker // reinterpret_cast.
90*8975f5c5SAndroid Build Coastguard Worker // - GraphicBuffer inherits from two base classes, ANativeWindowBuffer and RefBase.
91*8975f5c5SAndroid Build Coastguard Worker //
92*8975f5c5SAndroid Build Coastguard Worker // GraphicBuffer implements a getter for ANativeWindowBuffer (getNativeBuffer) by static_casting
93*8975f5c5SAndroid Build Coastguard Worker // itself to its base class ANativeWindowBuffer. The offset of the ANativeWindowBuffer pointer
94*8975f5c5SAndroid Build Coastguard Worker // from the GraphicBuffer pointer is 16 bytes. This is likely due to two pointers: The vtable of
95*8975f5c5SAndroid Build Coastguard Worker // GraphicBuffer and the one pointer member of the RefBase class.
96*8975f5c5SAndroid Build Coastguard Worker //
97*8975f5c5SAndroid Build Coastguard Worker // This is not future proof at all. We need to look into getting utilities added to Android to
98*8975f5c5SAndroid Build Coastguard Worker // perform this cast for us.
99*8975f5c5SAndroid Build Coastguard Worker constexpr int kAHardwareBufferToANativeWindowBufferOffset = static_cast<int>(sizeof(void *)) * 2;
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker template <typename T1, typename T2>
OffsetPointer(T2 * ptr,int bytes)102*8975f5c5SAndroid Build Coastguard Worker T1 *OffsetPointer(T2 *ptr, int bytes)
103*8975f5c5SAndroid Build Coastguard Worker {
104*8975f5c5SAndroid Build Coastguard Worker     return reinterpret_cast<T1 *>(reinterpret_cast<intptr_t>(ptr) + bytes);
105*8975f5c5SAndroid Build Coastguard Worker }
106*8975f5c5SAndroid Build Coastguard Worker 
GetPixelFormatInfo(int pixelFormat,bool * isYUV)107*8975f5c5SAndroid Build Coastguard Worker GLenum GetPixelFormatInfo(int pixelFormat, bool *isYUV)
108*8975f5c5SAndroid Build Coastguard Worker {
109*8975f5c5SAndroid Build Coastguard Worker     *isYUV = false;
110*8975f5c5SAndroid Build Coastguard Worker     switch (pixelFormat)
111*8975f5c5SAndroid Build Coastguard Worker     {
112*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_R8G8B8A8_UNORM:
113*8975f5c5SAndroid Build Coastguard Worker             return GL_RGBA8;
114*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_R8G8B8X8_UNORM:
115*8975f5c5SAndroid Build Coastguard Worker             return GL_RGB8;
116*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_R8G8B8_UNORM:
117*8975f5c5SAndroid Build Coastguard Worker             return GL_RGB8;
118*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_R5G6B5_UNORM:
119*8975f5c5SAndroid Build Coastguard Worker             return GL_RGB565;
120*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_B8G8R8A8_UNORM:
121*8975f5c5SAndroid Build Coastguard Worker             return GL_BGRA8_EXT;
122*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_B5G5R5A1_UNORM:
123*8975f5c5SAndroid Build Coastguard Worker             return GL_RGB5_A1;
124*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_B4G4R4A4_UNORM:
125*8975f5c5SAndroid Build Coastguard Worker             return GL_RGBA4;
126*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_R16G16B16A16_FLOAT:
127*8975f5c5SAndroid Build Coastguard Worker             return GL_RGBA16F;
128*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_R10G10B10A2_UNORM:
129*8975f5c5SAndroid Build Coastguard Worker             return GL_RGB10_A2;
130*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_BLOB:
131*8975f5c5SAndroid Build Coastguard Worker             return GL_NONE;
132*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_D16_UNORM:
133*8975f5c5SAndroid Build Coastguard Worker             return GL_DEPTH_COMPONENT16;
134*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_D24_UNORM:
135*8975f5c5SAndroid Build Coastguard Worker             return GL_DEPTH_COMPONENT24;
136*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_D24_UNORM_S8_UINT:
137*8975f5c5SAndroid Build Coastguard Worker             return GL_DEPTH24_STENCIL8;
138*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_D32_FLOAT:
139*8975f5c5SAndroid Build Coastguard Worker             return GL_DEPTH_COMPONENT32F;
140*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_D32_FLOAT_S8_UINT:
141*8975f5c5SAndroid Build Coastguard Worker             return GL_DEPTH32F_STENCIL8;
142*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_S8_UINT:
143*8975f5c5SAndroid Build Coastguard Worker             return GL_STENCIL_INDEX8;
144*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_R8_UNORM:
145*8975f5c5SAndroid Build Coastguard Worker             return GL_R8;
146*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_Y8Cb8Cr8_420:
147*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_YV12:
148*8975f5c5SAndroid Build Coastguard Worker         case ANGLE_AHB_FORMAT_IMPLEMENTATION_DEFINED:
149*8975f5c5SAndroid Build Coastguard Worker             *isYUV = true;
150*8975f5c5SAndroid Build Coastguard Worker             return GL_RGB8;
151*8975f5c5SAndroid Build Coastguard Worker         default:
152*8975f5c5SAndroid Build Coastguard Worker             // Treat unknown formats as RGB. They are vendor-specific YUV formats that would sample
153*8975f5c5SAndroid Build Coastguard Worker             // as RGB.
154*8975f5c5SAndroid Build Coastguard Worker             *isYUV = true;
155*8975f5c5SAndroid Build Coastguard Worker             return GL_RGB8;
156*8975f5c5SAndroid Build Coastguard Worker     }
157*8975f5c5SAndroid Build Coastguard Worker }
158*8975f5c5SAndroid Build Coastguard Worker 
159*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
160*8975f5c5SAndroid Build Coastguard Worker 
ClientBufferToANativeWindowBuffer(EGLClientBuffer clientBuffer)161*8975f5c5SAndroid Build Coastguard Worker ANativeWindowBuffer *ClientBufferToANativeWindowBuffer(EGLClientBuffer clientBuffer)
162*8975f5c5SAndroid Build Coastguard Worker {
163*8975f5c5SAndroid Build Coastguard Worker     return reinterpret_cast<ANativeWindowBuffer *>(clientBuffer);
164*8975f5c5SAndroid Build Coastguard Worker }
165*8975f5c5SAndroid Build Coastguard Worker 
GetAHBUsage(int eglNativeBufferUsage)166*8975f5c5SAndroid Build Coastguard Worker uint64_t GetAHBUsage(int eglNativeBufferUsage)
167*8975f5c5SAndroid Build Coastguard Worker {
168*8975f5c5SAndroid Build Coastguard Worker     uint64_t ahbUsage = 0;
169*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_AHARDWARE_BUFFER_SUPPORT)
170*8975f5c5SAndroid Build Coastguard Worker     if (eglNativeBufferUsage & EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID)
171*8975f5c5SAndroid Build Coastguard Worker     {
172*8975f5c5SAndroid Build Coastguard Worker         ahbUsage |= AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT;
173*8975f5c5SAndroid Build Coastguard Worker     }
174*8975f5c5SAndroid Build Coastguard Worker     if (eglNativeBufferUsage & EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID)
175*8975f5c5SAndroid Build Coastguard Worker     {
176*8975f5c5SAndroid Build Coastguard Worker         ahbUsage |= AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER;
177*8975f5c5SAndroid Build Coastguard Worker     }
178*8975f5c5SAndroid Build Coastguard Worker     if (eglNativeBufferUsage & EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID)
179*8975f5c5SAndroid Build Coastguard Worker     {
180*8975f5c5SAndroid Build Coastguard Worker         ahbUsage |= AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
181*8975f5c5SAndroid Build Coastguard Worker     }
182*8975f5c5SAndroid Build Coastguard Worker #endif  // ANGLE_AHARDWARE_BUFFER_SUPPORT
183*8975f5c5SAndroid Build Coastguard Worker     return ahbUsage;
184*8975f5c5SAndroid Build Coastguard Worker }
185*8975f5c5SAndroid Build Coastguard Worker 
CreateEGLClientBufferFromAHardwareBuffer(int width,int height,int depth,int androidFormat,int usage)186*8975f5c5SAndroid Build Coastguard Worker EGLClientBuffer CreateEGLClientBufferFromAHardwareBuffer(int width,
187*8975f5c5SAndroid Build Coastguard Worker                                                          int height,
188*8975f5c5SAndroid Build Coastguard Worker                                                          int depth,
189*8975f5c5SAndroid Build Coastguard Worker                                                          int androidFormat,
190*8975f5c5SAndroid Build Coastguard Worker                                                          int usage)
191*8975f5c5SAndroid Build Coastguard Worker {
192*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_AHARDWARE_BUFFER_SUPPORT)
193*8975f5c5SAndroid Build Coastguard Worker 
194*8975f5c5SAndroid Build Coastguard Worker     // The height and width are number of pixels of size format
195*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer_Desc aHardwareBufferDescription = {};
196*8975f5c5SAndroid Build Coastguard Worker     aHardwareBufferDescription.width                = static_cast<uint32_t>(width);
197*8975f5c5SAndroid Build Coastguard Worker     aHardwareBufferDescription.height               = static_cast<uint32_t>(height);
198*8975f5c5SAndroid Build Coastguard Worker     aHardwareBufferDescription.layers               = static_cast<uint32_t>(depth);
199*8975f5c5SAndroid Build Coastguard Worker     aHardwareBufferDescription.format               = androidFormat;
200*8975f5c5SAndroid Build Coastguard Worker     aHardwareBufferDescription.usage                = GetAHBUsage(usage);
201*8975f5c5SAndroid Build Coastguard Worker 
202*8975f5c5SAndroid Build Coastguard Worker     // Allocate memory from Android Hardware Buffer
203*8975f5c5SAndroid Build Coastguard Worker     AHardwareBuffer *aHardwareBuffer = nullptr;
204*8975f5c5SAndroid Build Coastguard Worker     int res = AHardwareBuffer_allocate(&aHardwareBufferDescription, &aHardwareBuffer);
205*8975f5c5SAndroid Build Coastguard Worker     if (res != 0)
206*8975f5c5SAndroid Build Coastguard Worker     {
207*8975f5c5SAndroid Build Coastguard Worker         return nullptr;
208*8975f5c5SAndroid Build Coastguard Worker     }
209*8975f5c5SAndroid Build Coastguard Worker 
210*8975f5c5SAndroid Build Coastguard Worker     return AHardwareBufferToClientBuffer(aHardwareBuffer);
211*8975f5c5SAndroid Build Coastguard Worker #else
212*8975f5c5SAndroid Build Coastguard Worker     return nullptr;
213*8975f5c5SAndroid Build Coastguard Worker #endif  // ANGLE_AHARDWARE_BUFFER_SUPPORT
214*8975f5c5SAndroid Build Coastguard Worker }
215*8975f5c5SAndroid Build Coastguard Worker 
GetANativeWindowBufferProperties(const ANativeWindowBuffer * buffer,int * width,int * height,int * depth,int * pixelFormat,uint64_t * usage)216*8975f5c5SAndroid Build Coastguard Worker void GetANativeWindowBufferProperties(const ANativeWindowBuffer *buffer,
217*8975f5c5SAndroid Build Coastguard Worker                                       int *width,
218*8975f5c5SAndroid Build Coastguard Worker                                       int *height,
219*8975f5c5SAndroid Build Coastguard Worker                                       int *depth,
220*8975f5c5SAndroid Build Coastguard Worker                                       int *pixelFormat,
221*8975f5c5SAndroid Build Coastguard Worker                                       uint64_t *usage)
222*8975f5c5SAndroid Build Coastguard Worker {
223*8975f5c5SAndroid Build Coastguard Worker     *width       = buffer->width;
224*8975f5c5SAndroid Build Coastguard Worker     *height      = buffer->height;
225*8975f5c5SAndroid Build Coastguard Worker     *depth       = static_cast<int>(buffer->layerCount);
226*8975f5c5SAndroid Build Coastguard Worker     *height      = buffer->height;
227*8975f5c5SAndroid Build Coastguard Worker     *pixelFormat = buffer->format;
228*8975f5c5SAndroid Build Coastguard Worker     *usage       = buffer->usage;
229*8975f5c5SAndroid Build Coastguard Worker }
230*8975f5c5SAndroid Build Coastguard Worker 
NativePixelFormatToGLInternalFormat(int pixelFormat)231*8975f5c5SAndroid Build Coastguard Worker GLenum NativePixelFormatToGLInternalFormat(int pixelFormat)
232*8975f5c5SAndroid Build Coastguard Worker {
233*8975f5c5SAndroid Build Coastguard Worker     bool isYuv = false;
234*8975f5c5SAndroid Build Coastguard Worker     return GetPixelFormatInfo(pixelFormat, &isYuv);
235*8975f5c5SAndroid Build Coastguard Worker }
236*8975f5c5SAndroid Build Coastguard Worker 
GLInternalFormatToNativePixelFormat(GLenum internalFormat)237*8975f5c5SAndroid Build Coastguard Worker int GLInternalFormatToNativePixelFormat(GLenum internalFormat)
238*8975f5c5SAndroid Build Coastguard Worker {
239*8975f5c5SAndroid Build Coastguard Worker     switch (internalFormat)
240*8975f5c5SAndroid Build Coastguard Worker     {
241*8975f5c5SAndroid Build Coastguard Worker         case GL_R8:
242*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_R8_UNORM;
243*8975f5c5SAndroid Build Coastguard Worker         case GL_RGBA8:
244*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_R8G8B8A8_UNORM;
245*8975f5c5SAndroid Build Coastguard Worker         case GL_RGB8:
246*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_R8G8B8X8_UNORM;
247*8975f5c5SAndroid Build Coastguard Worker         case GL_RGB565:
248*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_R5G6B5_UNORM;
249*8975f5c5SAndroid Build Coastguard Worker         case GL_BGRA8_EXT:
250*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_B8G8R8A8_UNORM;
251*8975f5c5SAndroid Build Coastguard Worker         case GL_RGB5_A1:
252*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_B5G5R5A1_UNORM;
253*8975f5c5SAndroid Build Coastguard Worker         case GL_RGBA4:
254*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_B4G4R4A4_UNORM;
255*8975f5c5SAndroid Build Coastguard Worker         case GL_RGBA16F:
256*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_R16G16B16A16_FLOAT;
257*8975f5c5SAndroid Build Coastguard Worker         case GL_RGB10_A2:
258*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_R10G10B10A2_UNORM;
259*8975f5c5SAndroid Build Coastguard Worker         case GL_NONE:
260*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_BLOB;
261*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_COMPONENT16:
262*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_D16_UNORM;
263*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_COMPONENT24:
264*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_D24_UNORM;
265*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH24_STENCIL8:
266*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_D24_UNORM_S8_UINT;
267*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_COMPONENT32F:
268*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_D32_FLOAT;
269*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH32F_STENCIL8:
270*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_D32_FLOAT_S8_UINT;
271*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_INDEX8:
272*8975f5c5SAndroid Build Coastguard Worker             return ANGLE_AHB_FORMAT_S8_UINT;
273*8975f5c5SAndroid Build Coastguard Worker         default:
274*8975f5c5SAndroid Build Coastguard Worker             WARN() << "Unknown internalFormat: " << internalFormat << ". Treating as 0";
275*8975f5c5SAndroid Build Coastguard Worker             return 0;
276*8975f5c5SAndroid Build Coastguard Worker     }
277*8975f5c5SAndroid Build Coastguard Worker }
278*8975f5c5SAndroid Build Coastguard Worker 
NativePixelFormatIsYUV(int pixelFormat)279*8975f5c5SAndroid Build Coastguard Worker bool NativePixelFormatIsYUV(int pixelFormat)
280*8975f5c5SAndroid Build Coastguard Worker {
281*8975f5c5SAndroid Build Coastguard Worker     bool isYuv = false;
282*8975f5c5SAndroid Build Coastguard Worker     GetPixelFormatInfo(pixelFormat, &isYuv);
283*8975f5c5SAndroid Build Coastguard Worker     return isYuv;
284*8975f5c5SAndroid Build Coastguard Worker }
285*8975f5c5SAndroid Build Coastguard Worker 
ANativeWindowBufferToAHardwareBuffer(ANativeWindowBuffer * windowBuffer)286*8975f5c5SAndroid Build Coastguard Worker AHardwareBuffer *ANativeWindowBufferToAHardwareBuffer(ANativeWindowBuffer *windowBuffer)
287*8975f5c5SAndroid Build Coastguard Worker {
288*8975f5c5SAndroid Build Coastguard Worker     return OffsetPointer<AHardwareBuffer>(windowBuffer,
289*8975f5c5SAndroid Build Coastguard Worker                                           -kAHardwareBufferToANativeWindowBufferOffset);
290*8975f5c5SAndroid Build Coastguard Worker }
291*8975f5c5SAndroid Build Coastguard Worker 
AHardwareBufferToClientBuffer(const AHardwareBuffer * hardwareBuffer)292*8975f5c5SAndroid Build Coastguard Worker EGLClientBuffer AHardwareBufferToClientBuffer(const AHardwareBuffer *hardwareBuffer)
293*8975f5c5SAndroid Build Coastguard Worker {
294*8975f5c5SAndroid Build Coastguard Worker     return OffsetPointer<EGLClientBuffer>(hardwareBuffer,
295*8975f5c5SAndroid Build Coastguard Worker                                           kAHardwareBufferToANativeWindowBufferOffset);
296*8975f5c5SAndroid Build Coastguard Worker }
297*8975f5c5SAndroid Build Coastguard Worker 
ClientBufferToAHardwareBuffer(EGLClientBuffer clientBuffer)298*8975f5c5SAndroid Build Coastguard Worker AHardwareBuffer *ClientBufferToAHardwareBuffer(EGLClientBuffer clientBuffer)
299*8975f5c5SAndroid Build Coastguard Worker {
300*8975f5c5SAndroid Build Coastguard Worker     return OffsetPointer<AHardwareBuffer>(clientBuffer,
301*8975f5c5SAndroid Build Coastguard Worker                                           -kAHardwareBufferToANativeWindowBufferOffset);
302*8975f5c5SAndroid Build Coastguard Worker }
303*8975f5c5SAndroid Build Coastguard Worker 
GetSystemProperty(const char * propertyName,std::string * value)304*8975f5c5SAndroid Build Coastguard Worker bool GetSystemProperty(const char *propertyName, std::string *value)
305*8975f5c5SAndroid Build Coastguard Worker {
306*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_ANDROID)
307*8975f5c5SAndroid Build Coastguard Worker     // PROP_VALUE_MAX from <sys/system_properties.h>
308*8975f5c5SAndroid Build Coastguard Worker     std::vector<char> propertyBuf(PROP_VALUE_MAX);
309*8975f5c5SAndroid Build Coastguard Worker     int len = __system_property_get(propertyName, propertyBuf.data());
310*8975f5c5SAndroid Build Coastguard Worker     if (len <= 0)
311*8975f5c5SAndroid Build Coastguard Worker     {
312*8975f5c5SAndroid Build Coastguard Worker         return false;
313*8975f5c5SAndroid Build Coastguard Worker     }
314*8975f5c5SAndroid Build Coastguard Worker     *value = std::string(propertyBuf.data());
315*8975f5c5SAndroid Build Coastguard Worker     return true;
316*8975f5c5SAndroid Build Coastguard Worker #else
317*8975f5c5SAndroid Build Coastguard Worker     return false;
318*8975f5c5SAndroid Build Coastguard Worker #endif
319*8975f5c5SAndroid Build Coastguard Worker }
320*8975f5c5SAndroid Build Coastguard Worker 
321*8975f5c5SAndroid Build Coastguard Worker }  // namespace android
322*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
323