xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/android/GrallocEmulated.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2024 Google LLC
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #include "GrallocEmulated.h"
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #include <optional>
9*61046927SAndroid Build Coastguard Worker #include <unordered_map>
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include "drm_fourcc.h"
12*61046927SAndroid Build Coastguard Worker #include "util/log.h"
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker namespace gfxstream {
15*61046927SAndroid Build Coastguard Worker namespace {
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker static constexpr int numFds = 0;
18*61046927SAndroid Build Coastguard Worker static constexpr int numInts = 1;
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker #define DRM_FORMAT_R8_BLOB fourcc_code('9', '9', '9', '9')
21*61046927SAndroid Build Coastguard Worker 
22*61046927SAndroid Build Coastguard Worker template <typename T, typename N>
DivideRoundUp(T n,N divisor)23*61046927SAndroid Build Coastguard Worker T DivideRoundUp(T n, N divisor) {
24*61046927SAndroid Build Coastguard Worker     const T div = static_cast<T>(divisor);
25*61046927SAndroid Build Coastguard Worker     const T q = n / div;
26*61046927SAndroid Build Coastguard Worker     return n % div == 0 ? q : q + 1;
27*61046927SAndroid Build Coastguard Worker }
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker template <typename T, typename N>
Align(T number,N n)30*61046927SAndroid Build Coastguard Worker T Align(T number, N n) {
31*61046927SAndroid Build Coastguard Worker     return DivideRoundUp(number, n) * n;
32*61046927SAndroid Build Coastguard Worker }
33*61046927SAndroid Build Coastguard Worker 
GlFormatToDrmFormat(uint32_t glFormat)34*61046927SAndroid Build Coastguard Worker std::optional<uint32_t> GlFormatToDrmFormat(uint32_t glFormat) {
35*61046927SAndroid Build Coastguard Worker     switch (glFormat) {
36*61046927SAndroid Build Coastguard Worker         case kGlRGB:
37*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_BGR888;
38*61046927SAndroid Build Coastguard Worker         case kGlRGB565:
39*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_BGR565;
40*61046927SAndroid Build Coastguard Worker         case kGlRGBA:
41*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_ABGR8888;
42*61046927SAndroid Build Coastguard Worker     }
43*61046927SAndroid Build Coastguard Worker     return std::nullopt;
44*61046927SAndroid Build Coastguard Worker }
45*61046927SAndroid Build Coastguard Worker 
AhbToDrmFormat(uint32_t ahbFormat)46*61046927SAndroid Build Coastguard Worker std::optional<uint32_t> AhbToDrmFormat(uint32_t ahbFormat) {
47*61046927SAndroid Build Coastguard Worker     switch (ahbFormat) {
48*61046927SAndroid Build Coastguard Worker         case GFXSTREAM_AHB_FORMAT_R8G8B8A8_UNORM:
49*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_ABGR8888;
50*61046927SAndroid Build Coastguard Worker         case GFXSTREAM_AHB_FORMAT_R8G8B8X8_UNORM:
51*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_XBGR8888;
52*61046927SAndroid Build Coastguard Worker         case GFXSTREAM_AHB_FORMAT_R8G8B8_UNORM:
53*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_BGR888;
54*61046927SAndroid Build Coastguard Worker         /*
55*61046927SAndroid Build Coastguard Worker         * Confusingly, AHARDWAREBUFFER_FORMAT_RGB_565 is defined as:
56*61046927SAndroid Build Coastguard Worker         *
57*61046927SAndroid Build Coastguard Worker         * "16-bit packed format that has 5-bit R, 6-bit G, and 5-bit B components, in that
58*61046927SAndroid Build Coastguard Worker         *  order, from the  most-sigfinicant bits to the least-significant bits."
59*61046927SAndroid Build Coastguard Worker         *
60*61046927SAndroid Build Coastguard Worker         * so the order of the components is intentionally not flipped between the pixel
61*61046927SAndroid Build Coastguard Worker         * format and the DRM format.
62*61046927SAndroid Build Coastguard Worker         */
63*61046927SAndroid Build Coastguard Worker         case GFXSTREAM_AHB_FORMAT_R5G6B5_UNORM:
64*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_RGB565;
65*61046927SAndroid Build Coastguard Worker         case GFXSTREAM_AHB_FORMAT_B8G8R8A8_UNORM:
66*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_ARGB8888;
67*61046927SAndroid Build Coastguard Worker         case GFXSTREAM_AHB_FORMAT_BLOB:
68*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_R8_BLOB;
69*61046927SAndroid Build Coastguard Worker         case GFXSTREAM_AHB_FORMAT_R8_UNORM:
70*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_R8;
71*61046927SAndroid Build Coastguard Worker         case GFXSTREAM_AHB_FORMAT_YV12:
72*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_YVU420;
73*61046927SAndroid Build Coastguard Worker         case GFXSTREAM_AHB_FORMAT_R16G16B16A16_FLOAT:
74*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_ABGR16161616F;
75*61046927SAndroid Build Coastguard Worker         case GFXSTREAM_AHB_FORMAT_R10G10B10A2_UNORM:
76*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_ABGR2101010;
77*61046927SAndroid Build Coastguard Worker         case GFXSTREAM_AHB_FORMAT_Y8Cb8Cr8_420:
78*61046927SAndroid Build Coastguard Worker             return DRM_FORMAT_NV12;
79*61046927SAndroid Build Coastguard Worker     }
80*61046927SAndroid Build Coastguard Worker     return std::nullopt;
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker struct DrmFormatPlaneInfo {
84*61046927SAndroid Build Coastguard Worker     uint32_t horizontalSubsampling;
85*61046927SAndroid Build Coastguard Worker     uint32_t verticalSubsampling;
86*61046927SAndroid Build Coastguard Worker     uint32_t bytesPerPixel;
87*61046927SAndroid Build Coastguard Worker };
88*61046927SAndroid Build Coastguard Worker struct DrmFormatInfo {
89*61046927SAndroid Build Coastguard Worker     uint32_t androidFormat;
90*61046927SAndroid Build Coastguard Worker     uint32_t virglFormat;
91*61046927SAndroid Build Coastguard Worker     bool isYuv;
92*61046927SAndroid Build Coastguard Worker     uint32_t horizontalAlignmentPixels;
93*61046927SAndroid Build Coastguard Worker     uint32_t verticalAlignmentPixels;
94*61046927SAndroid Build Coastguard Worker     std::vector<DrmFormatPlaneInfo> planes;
95*61046927SAndroid Build Coastguard Worker };
GetDrmFormatInfoMap()96*61046927SAndroid Build Coastguard Worker const std::unordered_map<uint32_t, DrmFormatInfo>& GetDrmFormatInfoMap() {
97*61046927SAndroid Build Coastguard Worker     static const auto* kFormatInfoMap = new std::unordered_map<uint32_t, DrmFormatInfo>({
98*61046927SAndroid Build Coastguard Worker         {DRM_FORMAT_ABGR8888,
99*61046927SAndroid Build Coastguard Worker          {
100*61046927SAndroid Build Coastguard Worker              .androidFormat = GFXSTREAM_AHB_FORMAT_R8G8B8A8_UNORM,
101*61046927SAndroid Build Coastguard Worker              .virglFormat = VIRGL_FORMAT_R8G8B8A8_UNORM,
102*61046927SAndroid Build Coastguard Worker              .isYuv = false,
103*61046927SAndroid Build Coastguard Worker              .horizontalAlignmentPixels = 1,
104*61046927SAndroid Build Coastguard Worker              .verticalAlignmentPixels = 1,
105*61046927SAndroid Build Coastguard Worker              .planes =
106*61046927SAndroid Build Coastguard Worker                  {
107*61046927SAndroid Build Coastguard Worker                      {
108*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 1,
109*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 1,
110*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 4,
111*61046927SAndroid Build Coastguard Worker                      },
112*61046927SAndroid Build Coastguard Worker                  },
113*61046927SAndroid Build Coastguard Worker          }},
114*61046927SAndroid Build Coastguard Worker         {DRM_FORMAT_ARGB8888,
115*61046927SAndroid Build Coastguard Worker          {
116*61046927SAndroid Build Coastguard Worker              .androidFormat = GFXSTREAM_AHB_FORMAT_B8G8R8A8_UNORM,
117*61046927SAndroid Build Coastguard Worker              .virglFormat = VIRGL_FORMAT_B8G8R8A8_UNORM,
118*61046927SAndroid Build Coastguard Worker              .isYuv = false,
119*61046927SAndroid Build Coastguard Worker              .horizontalAlignmentPixels = 1,
120*61046927SAndroid Build Coastguard Worker              .verticalAlignmentPixels = 1,
121*61046927SAndroid Build Coastguard Worker              .planes =
122*61046927SAndroid Build Coastguard Worker                  {
123*61046927SAndroid Build Coastguard Worker                      {
124*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 1,
125*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 1,
126*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 4,
127*61046927SAndroid Build Coastguard Worker                      },
128*61046927SAndroid Build Coastguard Worker                  },
129*61046927SAndroid Build Coastguard Worker          }},
130*61046927SAndroid Build Coastguard Worker         {DRM_FORMAT_BGR888,
131*61046927SAndroid Build Coastguard Worker          {
132*61046927SAndroid Build Coastguard Worker              .androidFormat = GFXSTREAM_AHB_FORMAT_R8G8B8_UNORM,
133*61046927SAndroid Build Coastguard Worker              .virglFormat = VIRGL_FORMAT_R8G8B8_UNORM,
134*61046927SAndroid Build Coastguard Worker              .isYuv = false,
135*61046927SAndroid Build Coastguard Worker              .horizontalAlignmentPixels = 1,
136*61046927SAndroid Build Coastguard Worker              .verticalAlignmentPixels = 1,
137*61046927SAndroid Build Coastguard Worker              .planes =
138*61046927SAndroid Build Coastguard Worker                  {
139*61046927SAndroid Build Coastguard Worker                      {
140*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 1,
141*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 1,
142*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 3,
143*61046927SAndroid Build Coastguard Worker                      },
144*61046927SAndroid Build Coastguard Worker                  },
145*61046927SAndroid Build Coastguard Worker          }},
146*61046927SAndroid Build Coastguard Worker         {DRM_FORMAT_BGR565,
147*61046927SAndroid Build Coastguard Worker          {
148*61046927SAndroid Build Coastguard Worker              .androidFormat = GFXSTREAM_AHB_FORMAT_R5G6B5_UNORM,
149*61046927SAndroid Build Coastguard Worker              .virglFormat = VIRGL_FORMAT_B5G6R5_UNORM,
150*61046927SAndroid Build Coastguard Worker              .isYuv = false,
151*61046927SAndroid Build Coastguard Worker              .horizontalAlignmentPixels = 1,
152*61046927SAndroid Build Coastguard Worker              .verticalAlignmentPixels = 1,
153*61046927SAndroid Build Coastguard Worker              .planes =
154*61046927SAndroid Build Coastguard Worker                  {
155*61046927SAndroid Build Coastguard Worker                      {
156*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 1,
157*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 1,
158*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 2,
159*61046927SAndroid Build Coastguard Worker                      },
160*61046927SAndroid Build Coastguard Worker                  },
161*61046927SAndroid Build Coastguard Worker          }},
162*61046927SAndroid Build Coastguard Worker         {DRM_FORMAT_R8,
163*61046927SAndroid Build Coastguard Worker          {
164*61046927SAndroid Build Coastguard Worker              .androidFormat = GFXSTREAM_AHB_FORMAT_R8_UNORM,
165*61046927SAndroid Build Coastguard Worker              .virglFormat = VIRGL_FORMAT_R8_UNORM,
166*61046927SAndroid Build Coastguard Worker              .isYuv = false,
167*61046927SAndroid Build Coastguard Worker              .horizontalAlignmentPixels = 1,
168*61046927SAndroid Build Coastguard Worker              .verticalAlignmentPixels = 1,
169*61046927SAndroid Build Coastguard Worker              .planes =
170*61046927SAndroid Build Coastguard Worker                  {
171*61046927SAndroid Build Coastguard Worker                      {
172*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 1,
173*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 1,
174*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 1,
175*61046927SAndroid Build Coastguard Worker                      },
176*61046927SAndroid Build Coastguard Worker                  },
177*61046927SAndroid Build Coastguard Worker          }},
178*61046927SAndroid Build Coastguard Worker         {DRM_FORMAT_R8_BLOB,
179*61046927SAndroid Build Coastguard Worker          {
180*61046927SAndroid Build Coastguard Worker              .androidFormat = GFXSTREAM_AHB_FORMAT_BLOB,
181*61046927SAndroid Build Coastguard Worker              .virglFormat = VIRGL_FORMAT_R8_UNORM,
182*61046927SAndroid Build Coastguard Worker              .isYuv = false,
183*61046927SAndroid Build Coastguard Worker              .horizontalAlignmentPixels = 1,
184*61046927SAndroid Build Coastguard Worker              .verticalAlignmentPixels = 1,
185*61046927SAndroid Build Coastguard Worker              .planes =
186*61046927SAndroid Build Coastguard Worker                  {
187*61046927SAndroid Build Coastguard Worker                      {
188*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 1,
189*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 1,
190*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 1,
191*61046927SAndroid Build Coastguard Worker                      },
192*61046927SAndroid Build Coastguard Worker                  },
193*61046927SAndroid Build Coastguard Worker          }},
194*61046927SAndroid Build Coastguard Worker         {DRM_FORMAT_ABGR16161616F,
195*61046927SAndroid Build Coastguard Worker          {
196*61046927SAndroid Build Coastguard Worker              .androidFormat = GFXSTREAM_AHB_FORMAT_R16G16B16A16_FLOAT,
197*61046927SAndroid Build Coastguard Worker              .virglFormat = VIRGL_FORMAT_R16G16B16A16_FLOAT,
198*61046927SAndroid Build Coastguard Worker              .isYuv = false,
199*61046927SAndroid Build Coastguard Worker              .horizontalAlignmentPixels = 1,
200*61046927SAndroid Build Coastguard Worker              .verticalAlignmentPixels = 1,
201*61046927SAndroid Build Coastguard Worker              .planes =
202*61046927SAndroid Build Coastguard Worker                  {
203*61046927SAndroid Build Coastguard Worker                      {
204*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 1,
205*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 1,
206*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 8,
207*61046927SAndroid Build Coastguard Worker                      },
208*61046927SAndroid Build Coastguard Worker                  },
209*61046927SAndroid Build Coastguard Worker          }},
210*61046927SAndroid Build Coastguard Worker         {DRM_FORMAT_ABGR2101010,
211*61046927SAndroid Build Coastguard Worker          {
212*61046927SAndroid Build Coastguard Worker              .androidFormat = GFXSTREAM_AHB_FORMAT_R10G10B10A2_UNORM,
213*61046927SAndroid Build Coastguard Worker              .virglFormat = VIRGL_FORMAT_R10G10B10A2_UNORM,
214*61046927SAndroid Build Coastguard Worker              .isYuv = false,
215*61046927SAndroid Build Coastguard Worker              .horizontalAlignmentPixels = 1,
216*61046927SAndroid Build Coastguard Worker              .verticalAlignmentPixels = 1,
217*61046927SAndroid Build Coastguard Worker              .planes =
218*61046927SAndroid Build Coastguard Worker                  {
219*61046927SAndroid Build Coastguard Worker                      {
220*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 1,
221*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 1,
222*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 4,
223*61046927SAndroid Build Coastguard Worker                      },
224*61046927SAndroid Build Coastguard Worker                  },
225*61046927SAndroid Build Coastguard Worker          }},
226*61046927SAndroid Build Coastguard Worker         {DRM_FORMAT_NV12,
227*61046927SAndroid Build Coastguard Worker          {
228*61046927SAndroid Build Coastguard Worker              .androidFormat = GFXSTREAM_AHB_FORMAT_Y8Cb8Cr8_420,
229*61046927SAndroid Build Coastguard Worker              .virglFormat = VIRGL_FORMAT_NV12,
230*61046927SAndroid Build Coastguard Worker              .isYuv = true,
231*61046927SAndroid Build Coastguard Worker              .horizontalAlignmentPixels = 2,
232*61046927SAndroid Build Coastguard Worker              .verticalAlignmentPixels = 1,
233*61046927SAndroid Build Coastguard Worker              .planes =
234*61046927SAndroid Build Coastguard Worker                  {
235*61046927SAndroid Build Coastguard Worker                      {
236*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 1,
237*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 1,
238*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 1,
239*61046927SAndroid Build Coastguard Worker                      },
240*61046927SAndroid Build Coastguard Worker                      {
241*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 2,
242*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 2,
243*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 2,
244*61046927SAndroid Build Coastguard Worker                      },
245*61046927SAndroid Build Coastguard Worker                  },
246*61046927SAndroid Build Coastguard Worker          }},
247*61046927SAndroid Build Coastguard Worker         {DRM_FORMAT_YVU420,
248*61046927SAndroid Build Coastguard Worker          {
249*61046927SAndroid Build Coastguard Worker              .androidFormat = GFXSTREAM_AHB_FORMAT_YV12,
250*61046927SAndroid Build Coastguard Worker              .virglFormat = VIRGL_FORMAT_YV12,
251*61046927SAndroid Build Coastguard Worker              .isYuv = true,
252*61046927SAndroid Build Coastguard Worker              .horizontalAlignmentPixels = 32,
253*61046927SAndroid Build Coastguard Worker              .verticalAlignmentPixels = 1,
254*61046927SAndroid Build Coastguard Worker              .planes =
255*61046927SAndroid Build Coastguard Worker                  {
256*61046927SAndroid Build Coastguard Worker                      {
257*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 1,
258*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 1,
259*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 1,
260*61046927SAndroid Build Coastguard Worker                      },
261*61046927SAndroid Build Coastguard Worker                      {
262*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 2,
263*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 2,
264*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 1,
265*61046927SAndroid Build Coastguard Worker                      },
266*61046927SAndroid Build Coastguard Worker                      {
267*61046927SAndroid Build Coastguard Worker                          .horizontalSubsampling = 2,
268*61046927SAndroid Build Coastguard Worker                          .verticalSubsampling = 2,
269*61046927SAndroid Build Coastguard Worker                          .bytesPerPixel = 1,
270*61046927SAndroid Build Coastguard Worker                      },
271*61046927SAndroid Build Coastguard Worker                  },
272*61046927SAndroid Build Coastguard Worker          }},
273*61046927SAndroid Build Coastguard Worker     });
274*61046927SAndroid Build Coastguard Worker     return *kFormatInfoMap;
275*61046927SAndroid Build Coastguard Worker }
276*61046927SAndroid Build Coastguard Worker 
277*61046927SAndroid Build Coastguard Worker }  // namespace
278*61046927SAndroid Build Coastguard Worker 
EmulatedAHardwareBuffer(uint32_t width,uint32_t height,uint32_t drmFormat,VirtGpuResourcePtr resource)279*61046927SAndroid Build Coastguard Worker EmulatedAHardwareBuffer::EmulatedAHardwareBuffer(uint32_t width, uint32_t height,
280*61046927SAndroid Build Coastguard Worker                                                  uint32_t drmFormat, VirtGpuResourcePtr resource)
281*61046927SAndroid Build Coastguard Worker     : mRefCount(1), mWidth(width), mHeight(height), mDrmFormat(drmFormat), mResource(resource) {}
282*61046927SAndroid Build Coastguard Worker 
~EmulatedAHardwareBuffer()283*61046927SAndroid Build Coastguard Worker EmulatedAHardwareBuffer::~EmulatedAHardwareBuffer() {}
284*61046927SAndroid Build Coastguard Worker 
getResourceId() const285*61046927SAndroid Build Coastguard Worker uint32_t EmulatedAHardwareBuffer::getResourceId() const { return mResource->getResourceHandle(); }
286*61046927SAndroid Build Coastguard Worker 
getWidth() const287*61046927SAndroid Build Coastguard Worker uint32_t EmulatedAHardwareBuffer::getWidth() const { return mWidth; }
288*61046927SAndroid Build Coastguard Worker 
getHeight() const289*61046927SAndroid Build Coastguard Worker uint32_t EmulatedAHardwareBuffer::getHeight() const { return mHeight; }
290*61046927SAndroid Build Coastguard Worker 
getAndroidFormat() const291*61046927SAndroid Build Coastguard Worker int EmulatedAHardwareBuffer::getAndroidFormat() const {
292*61046927SAndroid Build Coastguard Worker     const auto& formatInfosMap = GetDrmFormatInfoMap();
293*61046927SAndroid Build Coastguard Worker     auto formatInfoIt = formatInfosMap.find(mDrmFormat);
294*61046927SAndroid Build Coastguard Worker     if (formatInfoIt == formatInfosMap.end()) {
295*61046927SAndroid Build Coastguard Worker         mesa_loge("Unhandled DRM format:%u", mDrmFormat);
296*61046927SAndroid Build Coastguard Worker         return -1;
297*61046927SAndroid Build Coastguard Worker     }
298*61046927SAndroid Build Coastguard Worker     const auto& formatInfo = formatInfoIt->second;
299*61046927SAndroid Build Coastguard Worker     return formatInfo.androidFormat;
300*61046927SAndroid Build Coastguard Worker }
301*61046927SAndroid Build Coastguard Worker 
getDrmFormat() const302*61046927SAndroid Build Coastguard Worker uint32_t EmulatedAHardwareBuffer::getDrmFormat() const { return mDrmFormat; }
303*61046927SAndroid Build Coastguard Worker 
asAHardwareBuffer()304*61046927SAndroid Build Coastguard Worker AHardwareBuffer* EmulatedAHardwareBuffer::asAHardwareBuffer() {
305*61046927SAndroid Build Coastguard Worker     return reinterpret_cast<AHardwareBuffer*>(this);
306*61046927SAndroid Build Coastguard Worker }
307*61046927SAndroid Build Coastguard Worker 
asBufferHandle()308*61046927SAndroid Build Coastguard Worker buffer_handle_t EmulatedAHardwareBuffer::asBufferHandle() {
309*61046927SAndroid Build Coastguard Worker     return reinterpret_cast<buffer_handle_t>(this);
310*61046927SAndroid Build Coastguard Worker }
311*61046927SAndroid Build Coastguard Worker 
asEglClientBuffer()312*61046927SAndroid Build Coastguard Worker EGLClientBuffer EmulatedAHardwareBuffer::asEglClientBuffer() {
313*61046927SAndroid Build Coastguard Worker     return reinterpret_cast<EGLClientBuffer>(this);
314*61046927SAndroid Build Coastguard Worker }
315*61046927SAndroid Build Coastguard Worker 
acquire()316*61046927SAndroid Build Coastguard Worker void EmulatedAHardwareBuffer::acquire() { ++mRefCount; }
317*61046927SAndroid Build Coastguard Worker 
release()318*61046927SAndroid Build Coastguard Worker void EmulatedAHardwareBuffer::release() {
319*61046927SAndroid Build Coastguard Worker     --mRefCount;
320*61046927SAndroid Build Coastguard Worker     if (mRefCount == 0) {
321*61046927SAndroid Build Coastguard Worker         delete this;
322*61046927SAndroid Build Coastguard Worker     }
323*61046927SAndroid Build Coastguard Worker }
324*61046927SAndroid Build Coastguard Worker 
lock(uint8_t ** ptr)325*61046927SAndroid Build Coastguard Worker int EmulatedAHardwareBuffer::lock(uint8_t** ptr) {
326*61046927SAndroid Build Coastguard Worker     if (!mMapped) {
327*61046927SAndroid Build Coastguard Worker         mMapped = mResource->createMapping();
328*61046927SAndroid Build Coastguard Worker         if (!mMapped) {
329*61046927SAndroid Build Coastguard Worker             mesa_loge("Failed to lock EmulatedAHardwareBuffer: failed to create mapping.");
330*61046927SAndroid Build Coastguard Worker             return -1;
331*61046927SAndroid Build Coastguard Worker         }
332*61046927SAndroid Build Coastguard Worker 
333*61046927SAndroid Build Coastguard Worker         mResource->transferFromHost(0, 0, mWidth, mHeight);
334*61046927SAndroid Build Coastguard Worker         mResource->wait();
335*61046927SAndroid Build Coastguard Worker     }
336*61046927SAndroid Build Coastguard Worker 
337*61046927SAndroid Build Coastguard Worker     *ptr = (*mMapped)->asRawPtr();
338*61046927SAndroid Build Coastguard Worker     return 0;
339*61046927SAndroid Build Coastguard Worker }
340*61046927SAndroid Build Coastguard Worker 
lockPlanes(std::vector<Gralloc::LockedPlane> * ahbPlanes)341*61046927SAndroid Build Coastguard Worker int EmulatedAHardwareBuffer::lockPlanes(std::vector<Gralloc::LockedPlane>* ahbPlanes) {
342*61046927SAndroid Build Coastguard Worker     uint8_t* data = 0;
343*61046927SAndroid Build Coastguard Worker     int ret = lock(&data);
344*61046927SAndroid Build Coastguard Worker     if (ret) {
345*61046927SAndroid Build Coastguard Worker         return ret;
346*61046927SAndroid Build Coastguard Worker     }
347*61046927SAndroid Build Coastguard Worker 
348*61046927SAndroid Build Coastguard Worker     const auto& formatInfosMap = GetDrmFormatInfoMap();
349*61046927SAndroid Build Coastguard Worker     auto formatInfoIt = formatInfosMap.find(mDrmFormat);
350*61046927SAndroid Build Coastguard Worker     if (formatInfoIt == formatInfosMap.end()) {
351*61046927SAndroid Build Coastguard Worker         mesa_loge("Failed to lock: failed to find format info for drm format:%u", mDrmFormat);
352*61046927SAndroid Build Coastguard Worker         return -1;
353*61046927SAndroid Build Coastguard Worker     }
354*61046927SAndroid Build Coastguard Worker     const auto& formatInfo = formatInfoIt->second;
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker     const uint32_t alignedWidth = Align(mWidth, formatInfo.horizontalAlignmentPixels);
357*61046927SAndroid Build Coastguard Worker     const uint32_t alignedHeight = Align(mHeight, formatInfo.verticalAlignmentPixels);
358*61046927SAndroid Build Coastguard Worker     uint32_t cumulativeSize = 0;
359*61046927SAndroid Build Coastguard Worker     for (const DrmFormatPlaneInfo& planeInfo : formatInfo.planes) {
360*61046927SAndroid Build Coastguard Worker         const uint32_t planeWidth = DivideRoundUp(alignedWidth, planeInfo.horizontalSubsampling);
361*61046927SAndroid Build Coastguard Worker         const uint32_t planeHeight = DivideRoundUp(alignedHeight, planeInfo.verticalSubsampling);
362*61046927SAndroid Build Coastguard Worker         const uint32_t planeBpp = planeInfo.bytesPerPixel;
363*61046927SAndroid Build Coastguard Worker         const uint32_t planeStrideBytes = planeWidth * planeBpp;
364*61046927SAndroid Build Coastguard Worker         const uint32_t planeSizeBytes = planeHeight * planeStrideBytes;
365*61046927SAndroid Build Coastguard Worker         ahbPlanes->emplace_back(Gralloc::LockedPlane{
366*61046927SAndroid Build Coastguard Worker             .data = data + cumulativeSize,
367*61046927SAndroid Build Coastguard Worker             .pixelStrideBytes = planeBpp,
368*61046927SAndroid Build Coastguard Worker             .rowStrideBytes = planeStrideBytes,
369*61046927SAndroid Build Coastguard Worker         });
370*61046927SAndroid Build Coastguard Worker         cumulativeSize += planeSizeBytes;
371*61046927SAndroid Build Coastguard Worker     }
372*61046927SAndroid Build Coastguard Worker 
373*61046927SAndroid Build Coastguard Worker     if (mDrmFormat == DRM_FORMAT_NV12) {
374*61046927SAndroid Build Coastguard Worker         const auto& uPlane = (*ahbPlanes)[1];
375*61046927SAndroid Build Coastguard Worker         auto vPlane = uPlane;
376*61046927SAndroid Build Coastguard Worker         vPlane.data += 1;
377*61046927SAndroid Build Coastguard Worker 
378*61046927SAndroid Build Coastguard Worker         ahbPlanes->push_back(vPlane);
379*61046927SAndroid Build Coastguard Worker     } else if (mDrmFormat == DRM_FORMAT_YVU420) {
380*61046927SAndroid Build Coastguard Worker         // Note: lockPlanes() always returns Y, then U, then V but YV12 is Y, then V, then U.
381*61046927SAndroid Build Coastguard Worker         auto& plane1 = (*ahbPlanes)[1];
382*61046927SAndroid Build Coastguard Worker         auto& plane2 = (*ahbPlanes)[2];
383*61046927SAndroid Build Coastguard Worker         std::swap(plane1, plane2);
384*61046927SAndroid Build Coastguard Worker     }
385*61046927SAndroid Build Coastguard Worker 
386*61046927SAndroid Build Coastguard Worker     return 0;
387*61046927SAndroid Build Coastguard Worker }
388*61046927SAndroid Build Coastguard Worker 
unlock()389*61046927SAndroid Build Coastguard Worker int EmulatedAHardwareBuffer::unlock() {
390*61046927SAndroid Build Coastguard Worker     if (!mMapped) {
391*61046927SAndroid Build Coastguard Worker         mesa_loge("Failed to unlock EmulatedAHardwareBuffer: never locked?");
392*61046927SAndroid Build Coastguard Worker         return -1;
393*61046927SAndroid Build Coastguard Worker     }
394*61046927SAndroid Build Coastguard Worker     mResource->transferToHost(0, 0, mWidth, mHeight);
395*61046927SAndroid Build Coastguard Worker     mResource->wait();
396*61046927SAndroid Build Coastguard Worker     mMapped.reset();
397*61046927SAndroid Build Coastguard Worker     return 0;
398*61046927SAndroid Build Coastguard Worker }
399*61046927SAndroid Build Coastguard Worker 
EmulatedGralloc(int32_t descriptor)400*61046927SAndroid Build Coastguard Worker EmulatedGralloc::EmulatedGralloc(int32_t descriptor) {
401*61046927SAndroid Build Coastguard Worker     mDevice.reset(createPlatformVirtGpuDevice(kCapsetNone, descriptor));
402*61046927SAndroid Build Coastguard Worker }
403*61046927SAndroid Build Coastguard Worker 
~EmulatedGralloc()404*61046927SAndroid Build Coastguard Worker EmulatedGralloc::~EmulatedGralloc() { mOwned.clear(); }
405*61046927SAndroid Build Coastguard Worker 
getGrallocType()406*61046927SAndroid Build Coastguard Worker GrallocType EmulatedGralloc::getGrallocType() { return GRALLOC_TYPE_EMULATED; }
407*61046927SAndroid Build Coastguard Worker 
createColorBuffer(int width,int height,uint32_t glFormat)408*61046927SAndroid Build Coastguard Worker uint32_t EmulatedGralloc::createColorBuffer(int width, int height, uint32_t glFormat) {
409*61046927SAndroid Build Coastguard Worker     auto drmFormat = GlFormatToDrmFormat(glFormat);
410*61046927SAndroid Build Coastguard Worker     if (!drmFormat) {
411*61046927SAndroid Build Coastguard Worker         mesa_loge("Unhandled format");
412*61046927SAndroid Build Coastguard Worker         return -1;
413*61046927SAndroid Build Coastguard Worker     }
414*61046927SAndroid Build Coastguard Worker 
415*61046927SAndroid Build Coastguard Worker     auto ahb = allocate(width, height, *drmFormat);
416*61046927SAndroid Build Coastguard Worker     if (ahb == nullptr) {
417*61046927SAndroid Build Coastguard Worker         return -1;
418*61046927SAndroid Build Coastguard Worker     }
419*61046927SAndroid Build Coastguard Worker 
420*61046927SAndroid Build Coastguard Worker     EmulatedAHardwareBuffer* rahb = reinterpret_cast<EmulatedAHardwareBuffer*>(ahb);
421*61046927SAndroid Build Coastguard Worker 
422*61046927SAndroid Build Coastguard Worker     mOwned.emplace_back(rahb);
423*61046927SAndroid Build Coastguard Worker 
424*61046927SAndroid Build Coastguard Worker     return rahb->getResourceId();
425*61046927SAndroid Build Coastguard Worker }
426*61046927SAndroid Build Coastguard Worker 
allocate(uint32_t width,uint32_t height,uint32_t ahbFormat,uint64_t usage,AHardwareBuffer ** outputAhb)427*61046927SAndroid Build Coastguard Worker int EmulatedGralloc::allocate(uint32_t width, uint32_t height, uint32_t ahbFormat, uint64_t usage,
428*61046927SAndroid Build Coastguard Worker                               AHardwareBuffer** outputAhb) {
429*61046927SAndroid Build Coastguard Worker     (void)usage;
430*61046927SAndroid Build Coastguard Worker 
431*61046927SAndroid Build Coastguard Worker     auto drmFormat = AhbToDrmFormat(ahbFormat);
432*61046927SAndroid Build Coastguard Worker     if (!drmFormat) {
433*61046927SAndroid Build Coastguard Worker         mesa_loge("Unhandled AHB format:%u", ahbFormat);
434*61046927SAndroid Build Coastguard Worker         return -1;
435*61046927SAndroid Build Coastguard Worker     }
436*61046927SAndroid Build Coastguard Worker 
437*61046927SAndroid Build Coastguard Worker     *outputAhb = allocate(width, height, *drmFormat);
438*61046927SAndroid Build Coastguard Worker     if (*outputAhb == nullptr) {
439*61046927SAndroid Build Coastguard Worker         return -1;
440*61046927SAndroid Build Coastguard Worker     }
441*61046927SAndroid Build Coastguard Worker 
442*61046927SAndroid Build Coastguard Worker     return 0;
443*61046927SAndroid Build Coastguard Worker }
444*61046927SAndroid Build Coastguard Worker 
allocate(uint32_t width,uint32_t height,uint32_t drmFormat)445*61046927SAndroid Build Coastguard Worker AHardwareBuffer* EmulatedGralloc::allocate(uint32_t width, uint32_t height, uint32_t drmFormat) {
446*61046927SAndroid Build Coastguard Worker     mesa_loge("Allocating AHB w:%u, h:%u, format %u", width, height, drmFormat);
447*61046927SAndroid Build Coastguard Worker 
448*61046927SAndroid Build Coastguard Worker     const auto& formatInfosMap = GetDrmFormatInfoMap();
449*61046927SAndroid Build Coastguard Worker     auto formatInfoIt = formatInfosMap.find(drmFormat);
450*61046927SAndroid Build Coastguard Worker     if (formatInfoIt == formatInfosMap.end()) {
451*61046927SAndroid Build Coastguard Worker         mesa_loge("Failed to allocate: failed to find format info for drm format:%u", drmFormat);
452*61046927SAndroid Build Coastguard Worker         return nullptr;
453*61046927SAndroid Build Coastguard Worker     }
454*61046927SAndroid Build Coastguard Worker     const auto& formatInfo = formatInfoIt->second;
455*61046927SAndroid Build Coastguard Worker 
456*61046927SAndroid Build Coastguard Worker     const uint32_t alignedWidth = Align(width, formatInfo.horizontalAlignmentPixels);
457*61046927SAndroid Build Coastguard Worker     const uint32_t alignedHeight = Align(height, formatInfo.verticalAlignmentPixels);
458*61046927SAndroid Build Coastguard Worker     uint32_t stride = 0;
459*61046927SAndroid Build Coastguard Worker     uint32_t size = 0;
460*61046927SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < formatInfo.planes.size(); i++) {
461*61046927SAndroid Build Coastguard Worker         const DrmFormatPlaneInfo& planeInfo = formatInfo.planes[i];
462*61046927SAndroid Build Coastguard Worker         const uint32_t planeWidth = DivideRoundUp(alignedWidth, planeInfo.horizontalSubsampling);
463*61046927SAndroid Build Coastguard Worker         const uint32_t planeHeight = DivideRoundUp(alignedHeight, planeInfo.verticalSubsampling);
464*61046927SAndroid Build Coastguard Worker         const uint32_t planeBpp = planeInfo.bytesPerPixel;
465*61046927SAndroid Build Coastguard Worker         const uint32_t planeStrideBytes = planeWidth * planeBpp;
466*61046927SAndroid Build Coastguard Worker         const uint32_t planeSizeBytes = planeHeight * planeStrideBytes;
467*61046927SAndroid Build Coastguard Worker         size += planeSizeBytes;
468*61046927SAndroid Build Coastguard Worker         if (i == 0) stride = planeStrideBytes;
469*61046927SAndroid Build Coastguard Worker     }
470*61046927SAndroid Build Coastguard Worker 
471*61046927SAndroid Build Coastguard Worker     const uint32_t bind = (drmFormat == DRM_FORMAT_R8_BLOB || drmFormat == DRM_FORMAT_NV12 ||
472*61046927SAndroid Build Coastguard Worker                            drmFormat == DRM_FORMAT_YVU420)
473*61046927SAndroid Build Coastguard Worker                               ? VIRGL_BIND_LINEAR
474*61046927SAndroid Build Coastguard Worker                               : VIRGL_BIND_RENDER_TARGET;
475*61046927SAndroid Build Coastguard Worker 
476*61046927SAndroid Build Coastguard Worker     auto resource = mDevice->createResource(width, height, stride, size, formatInfo.virglFormat,
477*61046927SAndroid Build Coastguard Worker                                             PIPE_TEXTURE_2D, bind);
478*61046927SAndroid Build Coastguard Worker     if (!resource) {
479*61046927SAndroid Build Coastguard Worker         mesa_loge("Failed to allocate: failed to create virtio resource.");
480*61046927SAndroid Build Coastguard Worker         return nullptr;
481*61046927SAndroid Build Coastguard Worker     }
482*61046927SAndroid Build Coastguard Worker 
483*61046927SAndroid Build Coastguard Worker     resource->wait();
484*61046927SAndroid Build Coastguard Worker 
485*61046927SAndroid Build Coastguard Worker     return reinterpret_cast<AHardwareBuffer*>(
486*61046927SAndroid Build Coastguard Worker         new EmulatedAHardwareBuffer(width, height, drmFormat, std::move(resource)));
487*61046927SAndroid Build Coastguard Worker }
488*61046927SAndroid Build Coastguard Worker 
acquire(AHardwareBuffer * ahb)489*61046927SAndroid Build Coastguard Worker void EmulatedGralloc::acquire(AHardwareBuffer* ahb) {
490*61046927SAndroid Build Coastguard Worker     auto* rahb = reinterpret_cast<EmulatedAHardwareBuffer*>(ahb);
491*61046927SAndroid Build Coastguard Worker     rahb->acquire();
492*61046927SAndroid Build Coastguard Worker }
493*61046927SAndroid Build Coastguard Worker 
release(AHardwareBuffer * ahb)494*61046927SAndroid Build Coastguard Worker void EmulatedGralloc::release(AHardwareBuffer* ahb) {
495*61046927SAndroid Build Coastguard Worker     auto* rahb = reinterpret_cast<EmulatedAHardwareBuffer*>(ahb);
496*61046927SAndroid Build Coastguard Worker     rahb->release();
497*61046927SAndroid Build Coastguard Worker }
498*61046927SAndroid Build Coastguard Worker 
lock(AHardwareBuffer * ahb,uint8_t ** ptr)499*61046927SAndroid Build Coastguard Worker int EmulatedGralloc::lock(AHardwareBuffer* ahb, uint8_t** ptr) {
500*61046927SAndroid Build Coastguard Worker     auto* rahb = reinterpret_cast<EmulatedAHardwareBuffer*>(ahb);
501*61046927SAndroid Build Coastguard Worker     return rahb->lock(ptr);
502*61046927SAndroid Build Coastguard Worker }
503*61046927SAndroid Build Coastguard Worker 
lockPlanes(AHardwareBuffer * ahb,std::vector<LockedPlane> * ahbPlanes)504*61046927SAndroid Build Coastguard Worker int EmulatedGralloc::lockPlanes(AHardwareBuffer* ahb, std::vector<LockedPlane>* ahbPlanes) {
505*61046927SAndroid Build Coastguard Worker     auto* rahb = reinterpret_cast<EmulatedAHardwareBuffer*>(ahb);
506*61046927SAndroid Build Coastguard Worker     return rahb->lockPlanes(ahbPlanes);
507*61046927SAndroid Build Coastguard Worker }
508*61046927SAndroid Build Coastguard Worker 
unlock(AHardwareBuffer * ahb)509*61046927SAndroid Build Coastguard Worker int EmulatedGralloc::unlock(AHardwareBuffer* ahb) {
510*61046927SAndroid Build Coastguard Worker     auto* rahb = reinterpret_cast<EmulatedAHardwareBuffer*>(ahb);
511*61046927SAndroid Build Coastguard Worker     return rahb->unlock();
512*61046927SAndroid Build Coastguard Worker }
513*61046927SAndroid Build Coastguard Worker 
getHostHandle(const native_handle_t * handle)514*61046927SAndroid Build Coastguard Worker uint32_t EmulatedGralloc::getHostHandle(const native_handle_t* handle) {
515*61046927SAndroid Build Coastguard Worker     const auto* ahb = reinterpret_cast<const EmulatedAHardwareBuffer*>(handle);
516*61046927SAndroid Build Coastguard Worker     return ahb->getResourceId();
517*61046927SAndroid Build Coastguard Worker }
518*61046927SAndroid Build Coastguard Worker 
getHostHandle(const AHardwareBuffer * handle)519*61046927SAndroid Build Coastguard Worker uint32_t EmulatedGralloc::getHostHandle(const AHardwareBuffer* handle) {
520*61046927SAndroid Build Coastguard Worker     const auto* ahb = reinterpret_cast<const EmulatedAHardwareBuffer*>(handle);
521*61046927SAndroid Build Coastguard Worker     return ahb->getResourceId();
522*61046927SAndroid Build Coastguard Worker }
523*61046927SAndroid Build Coastguard Worker 
getNativeHandle(const AHardwareBuffer * ahb)524*61046927SAndroid Build Coastguard Worker const native_handle_t* EmulatedGralloc::getNativeHandle(const AHardwareBuffer* ahb) {
525*61046927SAndroid Build Coastguard Worker     return reinterpret_cast<const native_handle_t*>(ahb);
526*61046927SAndroid Build Coastguard Worker }
527*61046927SAndroid Build Coastguard Worker 
getFormat(const native_handle_t * handle)528*61046927SAndroid Build Coastguard Worker int EmulatedGralloc::getFormat(const native_handle_t* handle) {
529*61046927SAndroid Build Coastguard Worker     const auto* ahb = reinterpret_cast<const EmulatedAHardwareBuffer*>(handle);
530*61046927SAndroid Build Coastguard Worker     return ahb->getAndroidFormat();
531*61046927SAndroid Build Coastguard Worker }
532*61046927SAndroid Build Coastguard Worker 
getFormat(const AHardwareBuffer * handle)533*61046927SAndroid Build Coastguard Worker int EmulatedGralloc::getFormat(const AHardwareBuffer* handle) {
534*61046927SAndroid Build Coastguard Worker     const auto* ahb = reinterpret_cast<const EmulatedAHardwareBuffer*>(handle);
535*61046927SAndroid Build Coastguard Worker     return ahb->getAndroidFormat();
536*61046927SAndroid Build Coastguard Worker }
537*61046927SAndroid Build Coastguard Worker 
getFormatDrmFourcc(const AHardwareBuffer * handle)538*61046927SAndroid Build Coastguard Worker uint32_t EmulatedGralloc::getFormatDrmFourcc(const AHardwareBuffer* handle) {
539*61046927SAndroid Build Coastguard Worker     const auto* ahb = reinterpret_cast<const EmulatedAHardwareBuffer*>(handle);
540*61046927SAndroid Build Coastguard Worker     return ahb->getDrmFormat();
541*61046927SAndroid Build Coastguard Worker }
542*61046927SAndroid Build Coastguard Worker 
getWidth(const AHardwareBuffer * handle)543*61046927SAndroid Build Coastguard Worker uint32_t EmulatedGralloc::getWidth(const AHardwareBuffer* handle) {
544*61046927SAndroid Build Coastguard Worker     const auto* ahb = reinterpret_cast<const EmulatedAHardwareBuffer*>(handle);
545*61046927SAndroid Build Coastguard Worker     return ahb->getWidth();
546*61046927SAndroid Build Coastguard Worker }
547*61046927SAndroid Build Coastguard Worker 
getHeight(const AHardwareBuffer * handle)548*61046927SAndroid Build Coastguard Worker uint32_t EmulatedGralloc::getHeight(const AHardwareBuffer* handle) {
549*61046927SAndroid Build Coastguard Worker     const auto* ahb = reinterpret_cast<const EmulatedAHardwareBuffer*>(handle);
550*61046927SAndroid Build Coastguard Worker     return ahb->getHeight();
551*61046927SAndroid Build Coastguard Worker }
552*61046927SAndroid Build Coastguard Worker 
getAllocatedSize(const native_handle_t *)553*61046927SAndroid Build Coastguard Worker size_t EmulatedGralloc::getAllocatedSize(const native_handle_t*) {
554*61046927SAndroid Build Coastguard Worker     mesa_loge("Unimplemented.");
555*61046927SAndroid Build Coastguard Worker     return 0;
556*61046927SAndroid Build Coastguard Worker }
557*61046927SAndroid Build Coastguard Worker 
getAllocatedSize(const AHardwareBuffer *)558*61046927SAndroid Build Coastguard Worker size_t EmulatedGralloc::getAllocatedSize(const AHardwareBuffer*) {
559*61046927SAndroid Build Coastguard Worker     mesa_loge("Unimplemented.");
560*61046927SAndroid Build Coastguard Worker     return 0;
561*61046927SAndroid Build Coastguard Worker }
562*61046927SAndroid Build Coastguard Worker 
getId(const AHardwareBuffer * ahb,uint64_t * id)563*61046927SAndroid Build Coastguard Worker int EmulatedGralloc::getId(const AHardwareBuffer* ahb, uint64_t* id) {
564*61046927SAndroid Build Coastguard Worker     const auto* rahb = reinterpret_cast<const EmulatedAHardwareBuffer*>(ahb);
565*61046927SAndroid Build Coastguard Worker     *id = rahb->getResourceId();
566*61046927SAndroid Build Coastguard Worker     return 0;
567*61046927SAndroid Build Coastguard Worker }
568*61046927SAndroid Build Coastguard Worker 
createPlatformGralloc(int32_t descriptor)569*61046927SAndroid Build Coastguard Worker Gralloc* createPlatformGralloc(int32_t descriptor) { return new EmulatedGralloc(descriptor); }
570*61046927SAndroid Build Coastguard Worker 
571*61046927SAndroid Build Coastguard Worker }  // namespace gfxstream
572