blob: d5c181c18213e53fc2c2f06bfb2bb0a54b2fae9f [file] [log] [blame]
//
// 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 <string>
#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);
bool GetSystemProperty(const char *propertyName, std::string *value);
static constexpr const char *kManufacturerSystemPropertyName = "ro.product.manufacturer";
static constexpr const char *kModelSystemPropertyName = "ro.product.model";
static constexpr const char *kSDKSystemPropertyName = "ro.build.version.sdk";
} // namespace android
} // namespace angle
#endif // COMMON_ANDROIDUTIL_H_