| // | |
| // Copyright 2018 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // android_util.h: Utilities for the using the Android platform | |
| #ifndef COMMON_ANDROIDUTIL_H_ | |
| #define COMMON_ANDROIDUTIL_H_ | |
| #include <EGL/egl.h> | |
| #include <EGL/eglext.h> | |
| #include <array> | |
| #include <cstdint> | |
| #include "angle_gl.h" | |
| struct ANativeWindowBuffer; | |
| struct AHardwareBuffer; | |
| namespace angle | |
| { | |
| namespace android | |
| { | |
| // clang-format off | |
| /** | |
| * Buffer pixel formats mirrored from Android to avoid unnecessary complications | |
| * when trying to keep the enums defined, but not redefined, across various build | |
| * systems and across various releases/branches. | |
| * | |
| * Taken from | |
| * https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/master/graphics/common/aidl/android/hardware/graphics/common/PixelFormat.aidl | |
| */ | |
| enum { | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM | |
| * Vulkan: VK_FORMAT_R8G8B8A8_UNORM | |
| * OpenGL ES: GL_RGBA8 | |
| */ | |
| ANGLE_AHB_FORMAT_R8G8B8A8_UNORM = 1, | |
| /** | |
| * 32 bits per pixel, 8 bits per channel format where alpha values are | |
| * ignored (always opaque). | |
| * | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM | |
| * Vulkan: VK_FORMAT_R8G8B8A8_UNORM | |
| * OpenGL ES: GL_RGB8 | |
| */ | |
| ANGLE_AHB_FORMAT_R8G8B8X8_UNORM = 2, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM | |
| * Vulkan: VK_FORMAT_R8G8B8_UNORM | |
| * OpenGL ES: GL_RGB8 | |
| */ | |
| ANGLE_AHB_FORMAT_R8G8B8_UNORM = 3, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM | |
| * Vulkan: VK_FORMAT_R5G6B5_UNORM_PACK16 | |
| * OpenGL ES: GL_RGB565 | |
| */ | |
| ANGLE_AHB_FORMAT_R5G6B5_UNORM = 4, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM (deprecated) | |
| */ | |
| ANGLE_AHB_FORMAT_B8G8R8A8_UNORM = 5, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_B5G5R5A1_UNORM (deprecated) | |
| */ | |
| ANGLE_AHB_FORMAT_B5G5R5A1_UNORM = 6, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_B4G4R4A4_UNORM (deprecated) | |
| */ | |
| ANGLE_AHB_FORMAT_B4G4R4A4_UNORM = 7, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT | |
| * Vulkan: VK_FORMAT_R16G16B16A16_SFLOAT | |
| * OpenGL ES: GL_RGBA16F | |
| */ | |
| ANGLE_AHB_FORMAT_R16G16B16A16_FLOAT = 0x16, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM | |
| * Vulkan: VK_FORMAT_A2B10G10R10_UNORM_PACK32 | |
| * OpenGL ES: GL_RGB10_A2 | |
| */ | |
| ANGLE_AHB_FORMAT_R10G10B10A2_UNORM = 0x2b, | |
| /** | |
| * An opaque binary blob format that must have height 1, with width equal to | |
| * the buffer size in bytes. | |
| * | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_BLOB | |
| */ | |
| ANGLE_AHB_FORMAT_BLOB = 0x21, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_D16_UNORM | |
| * Vulkan: VK_FORMAT_D16_UNORM | |
| * OpenGL ES: GL_DEPTH_COMPONENT16 | |
| */ | |
| ANGLE_AHB_FORMAT_D16_UNORM = 0x30, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_D24_UNORM | |
| * Vulkan: VK_FORMAT_X8_D24_UNORM_PACK32 | |
| * OpenGL ES: GL_DEPTH_COMPONENT24 | |
| */ | |
| ANGLE_AHB_FORMAT_D24_UNORM = 0x31, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT | |
| * Vulkan: VK_FORMAT_D24_UNORM_S8_UINT | |
| * OpenGL ES: GL_DEPTH24_STENCIL8 | |
| */ | |
| ANGLE_AHB_FORMAT_D24_UNORM_S8_UINT = 0x32, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_D32_FLOAT | |
| * Vulkan: VK_FORMAT_D32_SFLOAT | |
| * OpenGL ES: GL_DEPTH_COMPONENT32F | |
| */ | |
| ANGLE_AHB_FORMAT_D32_FLOAT = 0x33, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT | |
| * Vulkan: VK_FORMAT_D32_SFLOAT_S8_UINT | |
| * OpenGL ES: GL_DEPTH32F_STENCIL8 | |
| */ | |
| ANGLE_AHB_FORMAT_D32_FLOAT_S8_UINT = 0x34, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT | |
| * Vulkan: VK_FORMAT_S8_UINT | |
| * OpenGL ES: GL_STENCIL_INDEX8 | |
| */ | |
| ANGLE_AHB_FORMAT_S8_UINT = 0x35, | |
| /** | |
| * YUV 420 888 format. | |
| * Must have an even width and height. Can be accessed in OpenGL | |
| * shaders through an external sampler. Does not support mip-maps | |
| * cube-maps or multi-layered textures. | |
| * | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420 | |
| */ | |
| ANGLE_AHB_FORMAT_Y8Cb8Cr8_420 = 0x23, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_YV12 | |
| * Vulkan: VK_FORMAT_S8_UINT | |
| * OpenGL ES: GL_STENCIL_INDEX8 | |
| */ | |
| ANGLE_AHB_FORMAT_YV12 = 0x32315659, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_IMPLEMENTATION_DEFINED | |
| * Vulkan: VK_FORMAT_S8_UINT | |
| * OpenGL ES: GL_STENCIL_INDEX8 | |
| */ | |
| ANGLE_AHB_FORMAT_IMPLEMENTATION_DEFINED = 0x22, | |
| /** | |
| * Corresponding formats: | |
| * Android: AHARDWAREBUFFER_FORMAT_R8_UNORM | |
| * Vulkan: VK_FORMAT_R8_UNORM | |
| * OpenGL ES: GL_R8 | |
| */ | |
| ANGLE_AHB_FORMAT_R8_UNORM = 0x38, | |
| }; | |
| // clang-format on | |
| constexpr std::array<GLenum, 3> kSupportedSizedInternalFormats = {GL_RGBA8, GL_RGB8, GL_RGB565}; | |
| ANativeWindowBuffer *ClientBufferToANativeWindowBuffer(EGLClientBuffer clientBuffer); | |
| EGLClientBuffer AHardwareBufferToClientBuffer(const AHardwareBuffer *hardwareBuffer); | |
| AHardwareBuffer *ClientBufferToAHardwareBuffer(EGLClientBuffer clientBuffer); | |
| EGLClientBuffer CreateEGLClientBufferFromAHardwareBuffer(int width, | |
| int height, | |
| int depth, | |
| int androidFormat, | |
| int usage); | |
| void GetANativeWindowBufferProperties(const ANativeWindowBuffer *buffer, | |
| int *width, | |
| int *height, | |
| int *depth, | |
| int *pixelFormat, | |
| uint64_t *usage); | |
| GLenum NativePixelFormatToGLInternalFormat(int pixelFormat); | |
| int GLInternalFormatToNativePixelFormat(GLenum internalFormat); | |
| bool NativePixelFormatIsYUV(int pixelFormat); | |
| AHardwareBuffer *ANativeWindowBufferToAHardwareBuffer(ANativeWindowBuffer *windowBuffer); | |
| uint64_t GetAHBUsage(int eglNativeBufferUsage); | |
| } // namespace android | |
| } // namespace angle | |
| #endif // COMMON_ANDROIDUTIL_H_ |