1 /* 2 * Copyright 2023 Google LLC 3 * SPDX-License-Identifier: MIT 4 */ 5 6 #pragma once 7 8 #if defined(ANDROID) 9 10 #include <cutils/native_handle.h> 11 #include <stddef.h> 12 #include <stdint.h> 13 14 #include <vector> 15 16 typedef struct AHardwareBuffer AHardwareBuffer; 17 18 namespace gfxstream { 19 20 constexpr uint32_t kGlRGB = 0x1907; 21 constexpr uint32_t kGlRGBA = 0x1908; 22 constexpr uint32_t kGlRGB565 = 0x8D62; 23 24 // Enums mirrored from Android to avoid extra build dependencies. 25 enum { 26 GFXSTREAM_AHB_FORMAT_R8G8B8A8_UNORM = 1, 27 GFXSTREAM_AHB_FORMAT_R8G8B8X8_UNORM = 2, 28 GFXSTREAM_AHB_FORMAT_R8G8B8_UNORM = 3, 29 GFXSTREAM_AHB_FORMAT_R5G6B5_UNORM = 4, 30 GFXSTREAM_AHB_FORMAT_B8G8R8A8_UNORM = 5, 31 GFXSTREAM_AHB_FORMAT_B5G5R5A1_UNORM = 6, 32 GFXSTREAM_AHB_FORMAT_B4G4R4A4_UNORM = 7, 33 GFXSTREAM_AHB_FORMAT_R16G16B16A16_FLOAT = 0x16, 34 GFXSTREAM_AHB_FORMAT_R10G10B10A2_UNORM = 0x2b, 35 GFXSTREAM_AHB_FORMAT_BLOB = 0x21, 36 GFXSTREAM_AHB_FORMAT_D16_UNORM = 0x30, 37 GFXSTREAM_AHB_FORMAT_D24_UNORM = 0x31, 38 GFXSTREAM_AHB_FORMAT_D24_UNORM_S8_UINT = 0x32, 39 GFXSTREAM_AHB_FORMAT_D32_FLOAT = 0x33, 40 GFXSTREAM_AHB_FORMAT_D32_FLOAT_S8_UINT = 0x34, 41 GFXSTREAM_AHB_FORMAT_S8_UINT = 0x35, 42 GFXSTREAM_AHB_FORMAT_Y8Cb8Cr8_420 = 0x23, 43 GFXSTREAM_AHB_FORMAT_YV12 = 0x32315659, 44 GFXSTREAM_AHB_FORMAT_IMPLEMENTATION_DEFINED = 0x22, 45 GFXSTREAM_AHB_FORMAT_R8_UNORM = 0x38, 46 }; 47 48 enum GfxstreamAhbDataspace { 49 GFXSTREAM_AHB_DATASPACE_UNKNOWN = 0, 50 GFXSTREAM_AHB_DATASPACE_ARBITRARY = 1, 51 GFXSTREAM_AHB_DATASPACE_STANDARD_SHIFT = 16, 52 GFXSTREAM_AHB_DATASPACE_STANDARD_MASK = 4128768, // (63 << STANDARD_SHIFT) 53 GFXSTREAM_AHB_DATASPACE_STANDARD_UNSPECIFIED = 0, // (0 << STANDARD_SHIFT) 54 GFXSTREAM_AHB_DATASPACE_STANDARD_BT709 = 65536, // (1 << STANDARD_SHIFT) 55 GFXSTREAM_AHB_DATASPACE_STANDARD_BT601_625 = 131072, // (2 << STANDARD_SHIFT) 56 GFXSTREAM_AHB_DATASPACE_STANDARD_BT601_625_UNADJUSTED = 196608, // (3 << STANDARD_SHIFT) 57 GFXSTREAM_AHB_DATASPACE_STANDARD_BT601_525 = 262144, // (4 << STANDARD_SHIFT) 58 GFXSTREAM_AHB_DATASPACE_STANDARD_BT601_525_UNADJUSTED = 327680, // (5 << STANDARD_SHIFT) 59 GFXSTREAM_AHB_DATASPACE_STANDARD_BT2020 = 393216, // (6 << STANDARD_SHIFT) 60 GFXSTREAM_AHB_DATASPACE_STANDARD_BT2020_CONSTANT_LUMINANCE = 458752, // (7 << STANDARD_SHIFT) 61 GFXSTREAM_AHB_DATASPACE_STANDARD_BT470M = 524288, // (8 << STANDARD_SHIFT) 62 GFXSTREAM_AHB_DATASPACE_STANDARD_FILM = 589824, // (9 << STANDARD_SHIFT) 63 GFXSTREAM_AHB_DATASPACE_STANDARD_DCI_P3 = 655360, // (10 << STANDARD_SHIFT) 64 GFXSTREAM_AHB_DATASPACE_STANDARD_ADOBE_RGB = 720896, // (11 << STANDARD_SHIFT) 65 GFXSTREAM_AHB_DATASPACE_TRANSFER_SHIFT = 22, 66 GFXSTREAM_AHB_DATASPACE_TRANSFER_MASK = 130023424, // (31 << TRANSFER_SHIFT) 67 GFXSTREAM_AHB_DATASPACE_TRANSFER_UNSPECIFIED = 0, // (0 << TRANSFER_SHIFT) 68 GFXSTREAM_AHB_DATASPACE_TRANSFER_LINEAR = 4194304, // (1 << TRANSFER_SHIFT) 69 GFXSTREAM_AHB_DATASPACE_TRANSFER_SRGB = 8388608, // (2 << TRANSFER_SHIFT) 70 GFXSTREAM_AHB_DATASPACE_TRANSFER_SMPTE_170M = 12582912, // (3 << TRANSFER_SHIFT) 71 GFXSTREAM_AHB_DATASPACE_TRANSFER_GAMMA2_2 = 16777216, // (4 << TRANSFER_SHIFT) 72 GFXSTREAM_AHB_DATASPACE_TRANSFER_GAMMA2_6 = 20971520, // (5 << TRANSFER_SHIFT) 73 GFXSTREAM_AHB_DATASPACE_TRANSFER_GAMMA2_8 = 25165824, // (6 << TRANSFER_SHIFT) 74 GFXSTREAM_AHB_DATASPACE_TRANSFER_ST2084 = 29360128, // (7 << TRANSFER_SHIFT) 75 GFXSTREAM_AHB_DATASPACE_TRANSFER_HLG = 33554432, // (8 << TRANSFER_SHIFT) 76 GFXSTREAM_AHB_DATASPACE_RANGE_SHIFT = 27, 77 GFXSTREAM_AHB_DATASPACE_RANGE_MASK = 939524096, // (7 << RANGE_SHIFT) 78 GFXSTREAM_AHB_DATASPACE_RANGE_UNSPECIFIED = 0, // (0 << RANGE_SHIFT) 79 GFXSTREAM_AHB_DATASPACE_RANGE_FULL = 134217728, // (1 << RANGE_SHIFT) 80 GFXSTREAM_AHB_DATASPACE_RANGE_LIMITED = 268435456, // (2 << RANGE_SHIFT) 81 GFXSTREAM_AHB_DATASPACE_RANGE_EXTENDED = 402653184, // (3 << RANGE_SHIFT) 82 GFXSTREAM_AHB_DATASPACE_SRGB_LINEAR = 512, 83 GFXSTREAM_AHB_DATASPACE_V0_SRGB_LINEAR = 84 138477568, // ((STANDARD_BT709 | TRANSFER_LINEAR) | RANGE_FULL) 85 GFXSTREAM_AHB_DATASPACE_V0_SCRGB_LINEAR = 86 406913024, // ((STANDARD_BT709 | TRANSFER_LINEAR) | RANGE_EXTENDED) 87 GFXSTREAM_AHB_DATASPACE_SRGB = 513, 88 GFXSTREAM_AHB_DATASPACE_V0_SRGB = 142671872, // ((STANDARD_BT709 | TRANSFER_SRGB) | RANGE_FULL) 89 GFXSTREAM_AHB_DATASPACE_V0_SCRGB = 90 411107328, // ((STANDARD_BT709 | TRANSFER_SRGB) | RANGE_EXTENDED) 91 GFXSTREAM_AHB_DATASPACE_JFIF = 257, 92 GFXSTREAM_AHB_DATASPACE_V0_JFIF = 93 146931712, // ((STANDARD_BT601_625 | TRANSFER_SMPTE_170M) | RANGE_FULL) 94 GFXSTREAM_AHB_DATASPACE_BT601_625 = 258, 95 GFXSTREAM_AHB_DATASPACE_V0_BT601_625 = 96 281149440, // ((STANDARD_BT601_625 | TRANSFER_SMPTE_170M) | RANGE_LIMITED) 97 GFXSTREAM_AHB_DATASPACE_BT601_525 = 259, 98 GFXSTREAM_AHB_DATASPACE_V0_BT601_525 = 99 281280512, // ((STANDARD_BT601_525 | TRANSFER_SMPTE_170M) | RANGE_LIMITED) 100 GFXSTREAM_AHB_DATASPACE_BT709 = 260, 101 GFXSTREAM_AHB_DATASPACE_V0_BT709 = 102 281083904, // ((STANDARD_BT709 | TRANSFER_SMPTE_170M) | RANGE_LIMITED) 103 GFXSTREAM_AHB_DATASPACE_DCI_P3_LINEAR = 104 139067392, // ((STANDARD_DCI_P3 | TRANSFER_LINEAR) | RANGE_FULL) 105 GFXSTREAM_AHB_DATASPACE_DCI_P3 = 106 155844608, // ((STANDARD_DCI_P3 | TRANSFER_GAMMA2_6) | RANGE_FULL) 107 GFXSTREAM_AHB_DATASPACE_DISPLAY_P3_LINEAR = 108 139067392, // ((STANDARD_DCI_P3 | TRANSFER_LINEAR) | RANGE_FULL) 109 GFXSTREAM_AHB_DATASPACE_DISPLAY_P3 = 110 143261696, // ((STANDARD_DCI_P3 | TRANSFER_SRGB) | RANGE_FULL) 111 GFXSTREAM_AHB_DATASPACE_ADOBE_RGB = 112 151715840, // ((STANDARD_ADOBE_RGB | TRANSFER_GAMMA2_2) | RANGE_FULL) 113 GFXSTREAM_AHB_DATASPACE_BT2020_LINEAR = 114 138805248, // ((STANDARD_BT2020 | TRANSFER_LINEAR) | RANGE_FULL) 115 GFXSTREAM_AHB_DATASPACE_BT2020 = 116 147193856, // ((STANDARD_BT2020 | TRANSFER_SMPTE_170M) | RANGE_FULL) 117 GFXSTREAM_AHB_DATASPACE_BT2020_PQ = 118 163971072, // ((STANDARD_BT2020 | TRANSFER_ST2084) | RANGE_FULL) 119 GFXSTREAM_AHB_DATASPACE_DEPTH = 4096, 120 GFXSTREAM_AHB_DATASPACE_SENSOR = 4097, 121 }; 122 123 enum GrallocType { 124 GRALLOC_TYPE_GOLDFISH = 1, 125 GRALLOC_TYPE_MINIGBM = 2, 126 GRALLOC_TYPE_EMULATED = 3, 127 }; 128 129 // Abstraction for gralloc handle conversion 130 class Gralloc { 131 public: ~Gralloc()132 virtual ~Gralloc() {} 133 134 virtual GrallocType getGrallocType() = 0; 135 virtual uint32_t createColorBuffer(int width, int height, uint32_t glformat) = 0; 136 137 virtual void acquire(AHardwareBuffer* ahb) = 0; 138 virtual void release(AHardwareBuffer* ahb) = 0; 139 140 virtual int allocate(uint32_t width, uint32_t height, uint32_t ahbFormat, uint64_t usage, 141 AHardwareBuffer** outputAhb) = 0; 142 143 virtual int lock(AHardwareBuffer* ahb, uint8_t** ptr) = 0; 144 struct LockedPlane { 145 uint8_t* data = nullptr; 146 uint32_t pixelStrideBytes = 0; 147 uint32_t rowStrideBytes = 0; 148 }; 149 // If AHB is a YUV format, always returns Y, then U, then V. 150 virtual int lockPlanes(AHardwareBuffer* ahb, std::vector<LockedPlane>* ahbPlanes) = 0; 151 virtual int unlock(AHardwareBuffer* ahb) = 0; 152 153 virtual const native_handle_t* getNativeHandle(const AHardwareBuffer* ahb) = 0; 154 155 virtual uint32_t getHostHandle(const native_handle_t* handle) = 0; 156 virtual uint32_t getHostHandle(const AHardwareBuffer* handle) = 0; 157 158 virtual int getFormat(const native_handle_t* handle) = 0; 159 virtual int getFormat(const AHardwareBuffer* handle) = 0; 160 getFormatDrmFourcc(const AHardwareBuffer *)161 virtual uint32_t getFormatDrmFourcc(const AHardwareBuffer* /*handle*/) { 162 // Equal to DRM_FORMAT_INVALID -- see <drm_fourcc.h> 163 return 0; 164 } getFormatDrmFourcc(const native_handle_t *)165 virtual uint32_t getFormatDrmFourcc(const native_handle_t* /*handle*/) { 166 // Equal to DRM_FORMAT_INVALID -- see <drm_fourcc.h> 167 return 0; 168 } 169 170 virtual uint32_t getWidth(const AHardwareBuffer* ahb) = 0; 171 virtual uint32_t getHeight(const AHardwareBuffer* ahb) = 0; 172 173 virtual size_t getAllocatedSize(const native_handle_t* handle) = 0; 174 virtual size_t getAllocatedSize(const AHardwareBuffer* handle) = 0; 175 176 virtual int getId(const AHardwareBuffer* ahb, uint64_t* id) = 0; 177 treatBlobAsImage()178 virtual bool treatBlobAsImage() { return false; } 179 getDataspace(const AHardwareBuffer * ahb)180 virtual int32_t getDataspace(const AHardwareBuffer* ahb) { 181 return GFXSTREAM_AHB_DATASPACE_UNKNOWN; 182 } 183 }; 184 185 Gralloc* createPlatformGralloc(int32_t descriptor = -1); 186 187 } // namespace gfxstream 188 189 #endif // defined(ANDROID) 190