xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/android/include/gfxstream/guest/GfxStreamGralloc.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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