xref: /aosp_15_r20/external/minigbm/cros_gralloc/gralloc4/CrosGralloc4Mapper.cc (revision d95af8df99a05bcb8679a54dc3ab8e5cd312b38e)
1*d95af8dfSAndroid Build Coastguard Worker /*
2*d95af8dfSAndroid Build Coastguard Worker  * Copyright 2020 The Chromium OS Authors. All rights reserved.
3*d95af8dfSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
4*d95af8dfSAndroid Build Coastguard Worker  * found in the LICENSE file.
5*d95af8dfSAndroid Build Coastguard Worker  */
6*d95af8dfSAndroid Build Coastguard Worker 
7*d95af8dfSAndroid Build Coastguard Worker #include "cros_gralloc/gralloc4/CrosGralloc4Mapper.h"
8*d95af8dfSAndroid Build Coastguard Worker 
9*d95af8dfSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/BlendMode.h>
10*d95af8dfSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/Cta861_3.h>
11*d95af8dfSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/Dataspace.h>
12*d95af8dfSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/PlaneLayout.h>
13*d95af8dfSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/Rect.h>
14*d95af8dfSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/Smpte2086.h>
15*d95af8dfSAndroid Build Coastguard Worker 
16*d95af8dfSAndroid Build Coastguard Worker #include <cutils/native_handle.h>
17*d95af8dfSAndroid Build Coastguard Worker #include <gralloctypes/Gralloc4.h>
18*d95af8dfSAndroid Build Coastguard Worker 
19*d95af8dfSAndroid Build Coastguard Worker #include "cros_gralloc/cros_gralloc_helpers.h"
20*d95af8dfSAndroid Build Coastguard Worker #include "cros_gralloc/gralloc4/CrosGralloc4Utils.h"
21*d95af8dfSAndroid Build Coastguard Worker 
22*d95af8dfSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::BlendMode;
23*d95af8dfSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::Cta861_3;
24*d95af8dfSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::Dataspace;
25*d95af8dfSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::PlaneLayout;
26*d95af8dfSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::Rect;
27*d95af8dfSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::Smpte2086;
28*d95af8dfSAndroid Build Coastguard Worker using android::hardware::hidl_handle;
29*d95af8dfSAndroid Build Coastguard Worker using android::hardware::hidl_vec;
30*d95af8dfSAndroid Build Coastguard Worker using android::hardware::Return;
31*d95af8dfSAndroid Build Coastguard Worker using android::hardware::Void;
32*d95af8dfSAndroid Build Coastguard Worker using android::hardware::graphics::common::V1_2::BufferUsage;
33*d95af8dfSAndroid Build Coastguard Worker using android::hardware::graphics::common::V1_2::PixelFormat;
34*d95af8dfSAndroid Build Coastguard Worker using android::hardware::graphics::mapper::V4_0::Error;
35*d95af8dfSAndroid Build Coastguard Worker using android::hardware::graphics::mapper::V4_0::IMapper;
36*d95af8dfSAndroid Build Coastguard Worker 
createDescriptor(const BufferDescriptorInfo & description,createDescriptor_cb hidlCb)37*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::createDescriptor(const BufferDescriptorInfo& description,
38*d95af8dfSAndroid Build Coastguard Worker                                                   createDescriptor_cb hidlCb) {
39*d95af8dfSAndroid Build Coastguard Worker     hidl_vec<uint8_t> descriptor;
40*d95af8dfSAndroid Build Coastguard Worker 
41*d95af8dfSAndroid Build Coastguard Worker     if (description.width == 0) {
42*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to createDescriptor. Bad width: %d.", description.width);
43*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, descriptor);
44*d95af8dfSAndroid Build Coastguard Worker         return Void();
45*d95af8dfSAndroid Build Coastguard Worker     }
46*d95af8dfSAndroid Build Coastguard Worker 
47*d95af8dfSAndroid Build Coastguard Worker     if (description.height == 0) {
48*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to createDescriptor. Bad height: %d.", description.height);
49*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, descriptor);
50*d95af8dfSAndroid Build Coastguard Worker         return Void();
51*d95af8dfSAndroid Build Coastguard Worker     }
52*d95af8dfSAndroid Build Coastguard Worker 
53*d95af8dfSAndroid Build Coastguard Worker     if (description.layerCount == 0) {
54*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to createDescriptor. Bad layer count: %d.", description.layerCount);
55*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, descriptor);
56*d95af8dfSAndroid Build Coastguard Worker         return Void();
57*d95af8dfSAndroid Build Coastguard Worker     }
58*d95af8dfSAndroid Build Coastguard Worker 
59*d95af8dfSAndroid Build Coastguard Worker     int ret = android::gralloc4::encodeBufferDescriptorInfo(description, &descriptor);
60*d95af8dfSAndroid Build Coastguard Worker     if (ret) {
61*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to createDescriptor. Failed to encode: %d.", ret);
62*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, descriptor);
63*d95af8dfSAndroid Build Coastguard Worker         return Void();
64*d95af8dfSAndroid Build Coastguard Worker     }
65*d95af8dfSAndroid Build Coastguard Worker 
66*d95af8dfSAndroid Build Coastguard Worker     hidlCb(Error::NONE, descriptor);
67*d95af8dfSAndroid Build Coastguard Worker     return Void();
68*d95af8dfSAndroid Build Coastguard Worker }
69*d95af8dfSAndroid Build Coastguard Worker 
importBuffer(const hidl_handle & handle,importBuffer_cb hidlCb)70*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::importBuffer(const hidl_handle& handle, importBuffer_cb hidlCb) {
71*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
72*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to import buffer. Driver is uninitialized.");
73*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, nullptr);
74*d95af8dfSAndroid Build Coastguard Worker         return Void();
75*d95af8dfSAndroid Build Coastguard Worker     }
76*d95af8dfSAndroid Build Coastguard Worker 
77*d95af8dfSAndroid Build Coastguard Worker     const native_handle_t* bufferHandle = handle.getNativeHandle();
78*d95af8dfSAndroid Build Coastguard Worker     if (!bufferHandle || bufferHandle->numFds == 0) {
79*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to importBuffer. Bad handle.");
80*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, nullptr);
81*d95af8dfSAndroid Build Coastguard Worker         return Void();
82*d95af8dfSAndroid Build Coastguard Worker     }
83*d95af8dfSAndroid Build Coastguard Worker 
84*d95af8dfSAndroid Build Coastguard Worker     native_handle_t* importedBufferHandle = native_handle_clone(bufferHandle);
85*d95af8dfSAndroid Build Coastguard Worker     if (!importedBufferHandle) {
86*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to importBuffer. Handle clone failed: %s.", strerror(errno));
87*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, nullptr);
88*d95af8dfSAndroid Build Coastguard Worker         return Void();
89*d95af8dfSAndroid Build Coastguard Worker     }
90*d95af8dfSAndroid Build Coastguard Worker 
91*d95af8dfSAndroid Build Coastguard Worker     int ret = mDriver->retain(importedBufferHandle);
92*d95af8dfSAndroid Build Coastguard Worker     if (ret) {
93*d95af8dfSAndroid Build Coastguard Worker         native_handle_close(importedBufferHandle);
94*d95af8dfSAndroid Build Coastguard Worker         native_handle_delete(importedBufferHandle);
95*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, nullptr);
96*d95af8dfSAndroid Build Coastguard Worker         return Void();
97*d95af8dfSAndroid Build Coastguard Worker     }
98*d95af8dfSAndroid Build Coastguard Worker 
99*d95af8dfSAndroid Build Coastguard Worker     hidlCb(Error::NONE, importedBufferHandle);
100*d95af8dfSAndroid Build Coastguard Worker     return Void();
101*d95af8dfSAndroid Build Coastguard Worker }
102*d95af8dfSAndroid Build Coastguard Worker 
freeBuffer(void * rawHandle)103*d95af8dfSAndroid Build Coastguard Worker Return<Error> CrosGralloc4Mapper::freeBuffer(void* rawHandle) {
104*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
105*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to freeBuffer. Driver is uninitialized.");
106*d95af8dfSAndroid Build Coastguard Worker         return Error::NO_RESOURCES;
107*d95af8dfSAndroid Build Coastguard Worker     }
108*d95af8dfSAndroid Build Coastguard Worker 
109*d95af8dfSAndroid Build Coastguard Worker     native_handle_t* bufferHandle = reinterpret_cast<native_handle_t*>(rawHandle);
110*d95af8dfSAndroid Build Coastguard Worker     if (!bufferHandle) {
111*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to freeBuffer. Empty handle.");
112*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_BUFFER;
113*d95af8dfSAndroid Build Coastguard Worker     }
114*d95af8dfSAndroid Build Coastguard Worker 
115*d95af8dfSAndroid Build Coastguard Worker     int ret = mDriver->release(bufferHandle);
116*d95af8dfSAndroid Build Coastguard Worker     if (ret) {
117*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_BUFFER;
118*d95af8dfSAndroid Build Coastguard Worker     }
119*d95af8dfSAndroid Build Coastguard Worker 
120*d95af8dfSAndroid Build Coastguard Worker     native_handle_close(bufferHandle);
121*d95af8dfSAndroid Build Coastguard Worker     native_handle_delete(bufferHandle);
122*d95af8dfSAndroid Build Coastguard Worker     return Error::NONE;
123*d95af8dfSAndroid Build Coastguard Worker }
124*d95af8dfSAndroid Build Coastguard Worker 
validateBufferSize(void * rawHandle,const BufferDescriptorInfo & descriptor,uint32_t stride)125*d95af8dfSAndroid Build Coastguard Worker Return<Error> CrosGralloc4Mapper::validateBufferSize(void* rawHandle,
126*d95af8dfSAndroid Build Coastguard Worker                                                      const BufferDescriptorInfo& descriptor,
127*d95af8dfSAndroid Build Coastguard Worker                                                      uint32_t stride) {
128*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
129*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to validateBufferSize. Driver is uninitialized.");
130*d95af8dfSAndroid Build Coastguard Worker         return Error::NO_RESOURCES;
131*d95af8dfSAndroid Build Coastguard Worker     }
132*d95af8dfSAndroid Build Coastguard Worker 
133*d95af8dfSAndroid Build Coastguard Worker     native_handle_t* bufferHandle = reinterpret_cast<native_handle_t*>(rawHandle);
134*d95af8dfSAndroid Build Coastguard Worker     if (!bufferHandle) {
135*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to validateBufferSize. Empty handle.");
136*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_BUFFER;
137*d95af8dfSAndroid Build Coastguard Worker     }
138*d95af8dfSAndroid Build Coastguard Worker 
139*d95af8dfSAndroid Build Coastguard Worker     cros_gralloc_handle_t crosHandle = cros_gralloc_convert_handle(bufferHandle);
140*d95af8dfSAndroid Build Coastguard Worker     if (!crosHandle) {
141*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to validateBufferSize. Invalid handle.");
142*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_BUFFER;
143*d95af8dfSAndroid Build Coastguard Worker     }
144*d95af8dfSAndroid Build Coastguard Worker 
145*d95af8dfSAndroid Build Coastguard Worker     PixelFormat crosHandleFormat = static_cast<PixelFormat>(crosHandle->droid_format);
146*d95af8dfSAndroid Build Coastguard Worker     if (descriptor.format != crosHandleFormat) {
147*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to validateBufferSize. Format mismatch.");
148*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_BUFFER;
149*d95af8dfSAndroid Build Coastguard Worker     }
150*d95af8dfSAndroid Build Coastguard Worker 
151*d95af8dfSAndroid Build Coastguard Worker     if (descriptor.width != crosHandle->width) {
152*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to validateBufferSize. Width mismatch (%d vs %d).", descriptor.width,
153*d95af8dfSAndroid Build Coastguard Worker               crosHandle->width);
154*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_VALUE;
155*d95af8dfSAndroid Build Coastguard Worker     }
156*d95af8dfSAndroid Build Coastguard Worker 
157*d95af8dfSAndroid Build Coastguard Worker     if (descriptor.height != crosHandle->height) {
158*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to validateBufferSize. Height mismatch (%d vs %d).", descriptor.height,
159*d95af8dfSAndroid Build Coastguard Worker               crosHandle->height);
160*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_VALUE;
161*d95af8dfSAndroid Build Coastguard Worker     }
162*d95af8dfSAndroid Build Coastguard Worker 
163*d95af8dfSAndroid Build Coastguard Worker     if (crosHandle->droid_format == HAL_PIXEL_FORMAT_BLOB) {
164*d95af8dfSAndroid Build Coastguard Worker         if (stride > crosHandle->pixel_stride) {
165*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to validateBufferSize. Oversized stride (%d vs %d).", stride,
166*d95af8dfSAndroid Build Coastguard Worker                   crosHandle->pixel_stride);
167*d95af8dfSAndroid Build Coastguard Worker             return Error::BAD_VALUE;
168*d95af8dfSAndroid Build Coastguard Worker         }
169*d95af8dfSAndroid Build Coastguard Worker     } else if (stride != crosHandle->pixel_stride) {
170*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to validateBufferSize. Stride mismatch (%d vs %d).", stride,
171*d95af8dfSAndroid Build Coastguard Worker               crosHandle->pixel_stride);
172*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_VALUE;
173*d95af8dfSAndroid Build Coastguard Worker     }
174*d95af8dfSAndroid Build Coastguard Worker 
175*d95af8dfSAndroid Build Coastguard Worker     return Error::NONE;
176*d95af8dfSAndroid Build Coastguard Worker }
177*d95af8dfSAndroid Build Coastguard Worker 
getTransportSize(void * rawHandle,getTransportSize_cb hidlCb)178*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::getTransportSize(void* rawHandle, getTransportSize_cb hidlCb) {
179*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
180*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to getTransportSize. Driver is uninitialized.");
181*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, 0, 0);
182*d95af8dfSAndroid Build Coastguard Worker         return Void();
183*d95af8dfSAndroid Build Coastguard Worker     }
184*d95af8dfSAndroid Build Coastguard Worker 
185*d95af8dfSAndroid Build Coastguard Worker     native_handle_t* bufferHandle = reinterpret_cast<native_handle_t*>(rawHandle);
186*d95af8dfSAndroid Build Coastguard Worker     if (!bufferHandle) {
187*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to getTransportSize. Bad handle.");
188*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, 0, 0);
189*d95af8dfSAndroid Build Coastguard Worker         return Void();
190*d95af8dfSAndroid Build Coastguard Worker     }
191*d95af8dfSAndroid Build Coastguard Worker 
192*d95af8dfSAndroid Build Coastguard Worker     // No local process data is currently stored on the native handle.
193*d95af8dfSAndroid Build Coastguard Worker     hidlCb(Error::NONE, bufferHandle->numFds, bufferHandle->numInts);
194*d95af8dfSAndroid Build Coastguard Worker     return Void();
195*d95af8dfSAndroid Build Coastguard Worker }
196*d95af8dfSAndroid Build Coastguard Worker 
lock(void * rawBuffer,uint64_t cpuUsage,const Rect & region,const hidl_handle & acquireFence,lock_cb hidlCb)197*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::lock(void* rawBuffer, uint64_t cpuUsage, const Rect& region,
198*d95af8dfSAndroid Build Coastguard Worker                                       const hidl_handle& acquireFence, lock_cb hidlCb) {
199*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
200*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to lock. Driver is uninitialized.");
201*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, nullptr);
202*d95af8dfSAndroid Build Coastguard Worker         return Void();
203*d95af8dfSAndroid Build Coastguard Worker     }
204*d95af8dfSAndroid Build Coastguard Worker 
205*d95af8dfSAndroid Build Coastguard Worker     buffer_handle_t bufferHandle = reinterpret_cast<buffer_handle_t>(rawBuffer);
206*d95af8dfSAndroid Build Coastguard Worker     if (!bufferHandle) {
207*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to lock. Empty handle.");
208*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, nullptr);
209*d95af8dfSAndroid Build Coastguard Worker         return Void();
210*d95af8dfSAndroid Build Coastguard Worker     }
211*d95af8dfSAndroid Build Coastguard Worker 
212*d95af8dfSAndroid Build Coastguard Worker     if (cpuUsage == 0) {
213*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to lock. Bad cpu usage: %" PRIu64 ".", cpuUsage);
214*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, nullptr);
215*d95af8dfSAndroid Build Coastguard Worker         return Void();
216*d95af8dfSAndroid Build Coastguard Worker     }
217*d95af8dfSAndroid Build Coastguard Worker 
218*d95af8dfSAndroid Build Coastguard Worker     uint32_t mapUsage = 0;
219*d95af8dfSAndroid Build Coastguard Worker     int ret = convertToMapUsage(cpuUsage, &mapUsage);
220*d95af8dfSAndroid Build Coastguard Worker     if (ret) {
221*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to lock. Convert usage failed.");
222*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, nullptr);
223*d95af8dfSAndroid Build Coastguard Worker         return Void();
224*d95af8dfSAndroid Build Coastguard Worker     }
225*d95af8dfSAndroid Build Coastguard Worker 
226*d95af8dfSAndroid Build Coastguard Worker     cros_gralloc_handle_t crosHandle = cros_gralloc_convert_handle(bufferHandle);
227*d95af8dfSAndroid Build Coastguard Worker     if (crosHandle == nullptr) {
228*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to lock. Invalid handle.");
229*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, nullptr);
230*d95af8dfSAndroid Build Coastguard Worker         return Void();
231*d95af8dfSAndroid Build Coastguard Worker     }
232*d95af8dfSAndroid Build Coastguard Worker 
233*d95af8dfSAndroid Build Coastguard Worker     if (region.left < 0) {
234*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to lock. Invalid region: negative left value %d.", region.left);
235*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, nullptr);
236*d95af8dfSAndroid Build Coastguard Worker         return Void();
237*d95af8dfSAndroid Build Coastguard Worker     }
238*d95af8dfSAndroid Build Coastguard Worker 
239*d95af8dfSAndroid Build Coastguard Worker     if (region.top < 0) {
240*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to lock. Invalid region: negative top value %d.", region.top);
241*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, nullptr);
242*d95af8dfSAndroid Build Coastguard Worker         return Void();
243*d95af8dfSAndroid Build Coastguard Worker     }
244*d95af8dfSAndroid Build Coastguard Worker 
245*d95af8dfSAndroid Build Coastguard Worker     if (region.width < 0) {
246*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to lock. Invalid region: negative width value %d.", region.width);
247*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, nullptr);
248*d95af8dfSAndroid Build Coastguard Worker         return Void();
249*d95af8dfSAndroid Build Coastguard Worker     }
250*d95af8dfSAndroid Build Coastguard Worker 
251*d95af8dfSAndroid Build Coastguard Worker     if (region.height < 0) {
252*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to lock. Invalid region: negative height value %d.", region.height);
253*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, nullptr);
254*d95af8dfSAndroid Build Coastguard Worker         return Void();
255*d95af8dfSAndroid Build Coastguard Worker     }
256*d95af8dfSAndroid Build Coastguard Worker 
257*d95af8dfSAndroid Build Coastguard Worker     if (region.width > crosHandle->width) {
258*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to lock. Invalid region: width greater than buffer width (%d vs %d).",
259*d95af8dfSAndroid Build Coastguard Worker               region.width, crosHandle->width);
260*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, nullptr);
261*d95af8dfSAndroid Build Coastguard Worker         return Void();
262*d95af8dfSAndroid Build Coastguard Worker     }
263*d95af8dfSAndroid Build Coastguard Worker 
264*d95af8dfSAndroid Build Coastguard Worker     if (region.height > crosHandle->height) {
265*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to lock. Invalid region: height greater than buffer height (%d vs %d).",
266*d95af8dfSAndroid Build Coastguard Worker               region.height, crosHandle->height);
267*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, nullptr);
268*d95af8dfSAndroid Build Coastguard Worker         return Void();
269*d95af8dfSAndroid Build Coastguard Worker     }
270*d95af8dfSAndroid Build Coastguard Worker 
271*d95af8dfSAndroid Build Coastguard Worker     struct rectangle rect = {static_cast<uint32_t>(region.left), static_cast<uint32_t>(region.top),
272*d95af8dfSAndroid Build Coastguard Worker                              static_cast<uint32_t>(region.width),
273*d95af8dfSAndroid Build Coastguard Worker                              static_cast<uint32_t>(region.height)};
274*d95af8dfSAndroid Build Coastguard Worker 
275*d95af8dfSAndroid Build Coastguard Worker     // An access region of all zeros means the entire buffer.
276*d95af8dfSAndroid Build Coastguard Worker     if (rect.x == 0 && rect.y == 0 && rect.width == 0 && rect.height == 0) {
277*d95af8dfSAndroid Build Coastguard Worker         rect.width = crosHandle->width;
278*d95af8dfSAndroid Build Coastguard Worker         rect.height = crosHandle->height;
279*d95af8dfSAndroid Build Coastguard Worker     }
280*d95af8dfSAndroid Build Coastguard Worker 
281*d95af8dfSAndroid Build Coastguard Worker     int acquireFenceFd = -1;
282*d95af8dfSAndroid Build Coastguard Worker     ret = convertToFenceFd(acquireFence, &acquireFenceFd);
283*d95af8dfSAndroid Build Coastguard Worker     if (ret) {
284*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to lock. Bad acquire fence.");
285*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, nullptr);
286*d95af8dfSAndroid Build Coastguard Worker         return Void();
287*d95af8dfSAndroid Build Coastguard Worker     }
288*d95af8dfSAndroid Build Coastguard Worker 
289*d95af8dfSAndroid Build Coastguard Worker     uint8_t* addr[DRV_MAX_PLANES];
290*d95af8dfSAndroid Build Coastguard Worker     ret = mDriver->lock(bufferHandle, acquireFenceFd, /*close_acquire_fence=*/false, &rect,
291*d95af8dfSAndroid Build Coastguard Worker                         mapUsage, addr);
292*d95af8dfSAndroid Build Coastguard Worker     if (ret) {
293*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, nullptr);
294*d95af8dfSAndroid Build Coastguard Worker         return Void();
295*d95af8dfSAndroid Build Coastguard Worker     }
296*d95af8dfSAndroid Build Coastguard Worker 
297*d95af8dfSAndroid Build Coastguard Worker     hidlCb(Error::NONE, addr[0]);
298*d95af8dfSAndroid Build Coastguard Worker     return Void();
299*d95af8dfSAndroid Build Coastguard Worker }
300*d95af8dfSAndroid Build Coastguard Worker 
unlock(void * rawHandle,unlock_cb hidlCb)301*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::unlock(void* rawHandle, unlock_cb hidlCb) {
302*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
303*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to unlock. Driver is uninitialized.");
304*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, nullptr);
305*d95af8dfSAndroid Build Coastguard Worker         return Void();
306*d95af8dfSAndroid Build Coastguard Worker     }
307*d95af8dfSAndroid Build Coastguard Worker 
308*d95af8dfSAndroid Build Coastguard Worker     buffer_handle_t bufferHandle = reinterpret_cast<buffer_handle_t>(rawHandle);
309*d95af8dfSAndroid Build Coastguard Worker     if (!bufferHandle) {
310*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to unlock. Empty handle.");
311*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, nullptr);
312*d95af8dfSAndroid Build Coastguard Worker         return Void();
313*d95af8dfSAndroid Build Coastguard Worker     }
314*d95af8dfSAndroid Build Coastguard Worker 
315*d95af8dfSAndroid Build Coastguard Worker     int releaseFenceFd = -1;
316*d95af8dfSAndroid Build Coastguard Worker     int ret = mDriver->unlock(bufferHandle, &releaseFenceFd);
317*d95af8dfSAndroid Build Coastguard Worker     if (ret) {
318*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to unlock.");
319*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, nullptr);
320*d95af8dfSAndroid Build Coastguard Worker         return Void();
321*d95af8dfSAndroid Build Coastguard Worker     }
322*d95af8dfSAndroid Build Coastguard Worker 
323*d95af8dfSAndroid Build Coastguard Worker     NATIVE_HANDLE_DECLARE_STORAGE(releaseFenceHandleStorage, 1, 0);
324*d95af8dfSAndroid Build Coastguard Worker     hidlCb(Error::NONE, convertToFenceHandle(releaseFenceFd, releaseFenceHandleStorage));
325*d95af8dfSAndroid Build Coastguard Worker     return Void();
326*d95af8dfSAndroid Build Coastguard Worker }
327*d95af8dfSAndroid Build Coastguard Worker 
flushLockedBuffer(void * rawHandle,flushLockedBuffer_cb hidlCb)328*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::flushLockedBuffer(void* rawHandle, flushLockedBuffer_cb hidlCb) {
329*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
330*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to flushLockedBuffer. Driver is uninitialized.");
331*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, nullptr);
332*d95af8dfSAndroid Build Coastguard Worker         return Void();
333*d95af8dfSAndroid Build Coastguard Worker     }
334*d95af8dfSAndroid Build Coastguard Worker 
335*d95af8dfSAndroid Build Coastguard Worker     buffer_handle_t bufferHandle = reinterpret_cast<buffer_handle_t>(rawHandle);
336*d95af8dfSAndroid Build Coastguard Worker     if (!bufferHandle) {
337*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to flushLockedBuffer. Empty handle.");
338*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, nullptr);
339*d95af8dfSAndroid Build Coastguard Worker         return Void();
340*d95af8dfSAndroid Build Coastguard Worker     }
341*d95af8dfSAndroid Build Coastguard Worker 
342*d95af8dfSAndroid Build Coastguard Worker     /*
343*d95af8dfSAndroid Build Coastguard Worker      * From the ANativeWindow::dequeueBuffer documentation:
344*d95af8dfSAndroid Build Coastguard Worker      *
345*d95af8dfSAndroid Build Coastguard Worker      * "A value of -1 indicates that the caller may access the buffer immediately without
346*d95af8dfSAndroid Build Coastguard Worker      * waiting on a fence."
347*d95af8dfSAndroid Build Coastguard Worker      */
348*d95af8dfSAndroid Build Coastguard Worker     int releaseFenceFd = -1;
349*d95af8dfSAndroid Build Coastguard Worker     int ret = mDriver->flush(bufferHandle);
350*d95af8dfSAndroid Build Coastguard Worker     if (ret) {
351*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to flushLockedBuffer. Flush failed.");
352*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, nullptr);
353*d95af8dfSAndroid Build Coastguard Worker         return Void();
354*d95af8dfSAndroid Build Coastguard Worker     }
355*d95af8dfSAndroid Build Coastguard Worker 
356*d95af8dfSAndroid Build Coastguard Worker     NATIVE_HANDLE_DECLARE_STORAGE(releaseFenceHandleStorage, 1, 0);
357*d95af8dfSAndroid Build Coastguard Worker     hidlCb(Error::NONE, convertToFenceHandle(releaseFenceFd, releaseFenceHandleStorage));
358*d95af8dfSAndroid Build Coastguard Worker     return Void();
359*d95af8dfSAndroid Build Coastguard Worker }
360*d95af8dfSAndroid Build Coastguard Worker 
rereadLockedBuffer(void * rawHandle)361*d95af8dfSAndroid Build Coastguard Worker Return<Error> CrosGralloc4Mapper::rereadLockedBuffer(void* rawHandle) {
362*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
363*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to rereadLockedBuffer. Driver is uninitialized.");
364*d95af8dfSAndroid Build Coastguard Worker         return Error::NO_RESOURCES;
365*d95af8dfSAndroid Build Coastguard Worker     }
366*d95af8dfSAndroid Build Coastguard Worker 
367*d95af8dfSAndroid Build Coastguard Worker     buffer_handle_t bufferHandle = reinterpret_cast<buffer_handle_t>(rawHandle);
368*d95af8dfSAndroid Build Coastguard Worker     if (!bufferHandle) {
369*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to rereadLockedBuffer. Empty handle.");
370*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_BUFFER;
371*d95af8dfSAndroid Build Coastguard Worker     }
372*d95af8dfSAndroid Build Coastguard Worker 
373*d95af8dfSAndroid Build Coastguard Worker     int ret = mDriver->invalidate(bufferHandle);
374*d95af8dfSAndroid Build Coastguard Worker     if (ret) {
375*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to rereadLockedBuffer. Failed to invalidate.");
376*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_BUFFER;
377*d95af8dfSAndroid Build Coastguard Worker     }
378*d95af8dfSAndroid Build Coastguard Worker 
379*d95af8dfSAndroid Build Coastguard Worker     return Error::NONE;
380*d95af8dfSAndroid Build Coastguard Worker }
381*d95af8dfSAndroid Build Coastguard Worker 
isSupported(const BufferDescriptorInfo & descriptor,isSupported_cb hidlCb)382*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::isSupported(const BufferDescriptorInfo& descriptor,
383*d95af8dfSAndroid Build Coastguard Worker                                              isSupported_cb hidlCb) {
384*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
385*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to isSupported. Driver is uninitialized.");
386*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_VALUE, false);
387*d95af8dfSAndroid Build Coastguard Worker         return Void();
388*d95af8dfSAndroid Build Coastguard Worker     }
389*d95af8dfSAndroid Build Coastguard Worker 
390*d95af8dfSAndroid Build Coastguard Worker     struct cros_gralloc_buffer_descriptor crosDescriptor;
391*d95af8dfSAndroid Build Coastguard Worker     if (convertToCrosDescriptor(descriptor, &crosDescriptor)) {
392*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NONE, false);
393*d95af8dfSAndroid Build Coastguard Worker         return Void();
394*d95af8dfSAndroid Build Coastguard Worker     }
395*d95af8dfSAndroid Build Coastguard Worker 
396*d95af8dfSAndroid Build Coastguard Worker     hidlCb(Error::NONE, mDriver->is_supported(&crosDescriptor));
397*d95af8dfSAndroid Build Coastguard Worker     return Void();
398*d95af8dfSAndroid Build Coastguard Worker }
399*d95af8dfSAndroid Build Coastguard Worker 
get(void * rawHandle,const MetadataType & metadataType,get_cb hidlCb)400*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::get(void* rawHandle, const MetadataType& metadataType,
401*d95af8dfSAndroid Build Coastguard Worker                                      get_cb hidlCb) {
402*d95af8dfSAndroid Build Coastguard Worker     hidl_vec<uint8_t> encodedMetadata;
403*d95af8dfSAndroid Build Coastguard Worker 
404*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
405*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to get. Driver is uninitialized.");
406*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, encodedMetadata);
407*d95af8dfSAndroid Build Coastguard Worker         return Void();
408*d95af8dfSAndroid Build Coastguard Worker     }
409*d95af8dfSAndroid Build Coastguard Worker 
410*d95af8dfSAndroid Build Coastguard Worker     buffer_handle_t bufferHandle = reinterpret_cast<buffer_handle_t>(rawHandle);
411*d95af8dfSAndroid Build Coastguard Worker     if (!bufferHandle) {
412*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to get. Empty handle.");
413*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, encodedMetadata);
414*d95af8dfSAndroid Build Coastguard Worker         return Void();
415*d95af8dfSAndroid Build Coastguard Worker     }
416*d95af8dfSAndroid Build Coastguard Worker 
417*d95af8dfSAndroid Build Coastguard Worker     cros_gralloc_handle_t crosHandle = cros_gralloc_convert_handle(bufferHandle);
418*d95af8dfSAndroid Build Coastguard Worker     if (!crosHandle) {
419*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to get. Invalid handle.");
420*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, encodedMetadata);
421*d95af8dfSAndroid Build Coastguard Worker         return Void();
422*d95af8dfSAndroid Build Coastguard Worker     }
423*d95af8dfSAndroid Build Coastguard Worker 
424*d95af8dfSAndroid Build Coastguard Worker     mDriver->with_buffer(crosHandle, [&, this](cros_gralloc_buffer* crosBuffer) {
425*d95af8dfSAndroid Build Coastguard Worker         get(crosBuffer, metadataType, hidlCb);
426*d95af8dfSAndroid Build Coastguard Worker     });
427*d95af8dfSAndroid Build Coastguard Worker     return Void();
428*d95af8dfSAndroid Build Coastguard Worker }
429*d95af8dfSAndroid Build Coastguard Worker 
get(const cros_gralloc_buffer * crosBuffer,const MetadataType & metadataType,get_cb hidlCb)430*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::get(const cros_gralloc_buffer* crosBuffer,
431*d95af8dfSAndroid Build Coastguard Worker                                      const MetadataType& metadataType, get_cb hidlCb) {
432*d95af8dfSAndroid Build Coastguard Worker     hidl_vec<uint8_t> encodedMetadata;
433*d95af8dfSAndroid Build Coastguard Worker 
434*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
435*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to get. Driver is uninitialized.");
436*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, encodedMetadata);
437*d95af8dfSAndroid Build Coastguard Worker         return Void();
438*d95af8dfSAndroid Build Coastguard Worker     }
439*d95af8dfSAndroid Build Coastguard Worker 
440*d95af8dfSAndroid Build Coastguard Worker     if (!crosBuffer) {
441*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to get. Invalid buffer.");
442*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, encodedMetadata);
443*d95af8dfSAndroid Build Coastguard Worker         return Void();
444*d95af8dfSAndroid Build Coastguard Worker     }
445*d95af8dfSAndroid Build Coastguard Worker 
446*d95af8dfSAndroid Build Coastguard Worker     android::status_t status = android::NO_ERROR;
447*d95af8dfSAndroid Build Coastguard Worker     if (metadataType == android::gralloc4::MetadataType_BufferId) {
448*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeBufferId(crosBuffer->get_id(), &encodedMetadata);
449*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Name) {
450*d95af8dfSAndroid Build Coastguard Worker         std::optional<std::string> name;
451*d95af8dfSAndroid Build Coastguard Worker         int ret = crosBuffer->get_name(&name);
452*d95af8dfSAndroid Build Coastguard Worker         if (ret) {
453*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to get. Failed to get name internal.");
454*d95af8dfSAndroid Build Coastguard Worker             status = android::UNKNOWN_ERROR;
455*d95af8dfSAndroid Build Coastguard Worker         } else {
456*d95af8dfSAndroid Build Coastguard Worker             status = android::gralloc4::encodeName(*name, &encodedMetadata);
457*d95af8dfSAndroid Build Coastguard Worker         }
458*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Width) {
459*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeWidth(crosBuffer->get_width(), &encodedMetadata);
460*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Height) {
461*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeHeight(crosBuffer->get_height(), &encodedMetadata);
462*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_LayerCount) {
463*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeLayerCount(1, &encodedMetadata);
464*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_PixelFormatRequested) {
465*d95af8dfSAndroid Build Coastguard Worker         PixelFormat pixelFormat = static_cast<PixelFormat>(crosBuffer->get_android_format());
466*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodePixelFormatRequested(pixelFormat, &encodedMetadata);
467*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_PixelFormatFourCC) {
468*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodePixelFormatFourCC(
469*d95af8dfSAndroid Build Coastguard Worker                 drv_get_standard_fourcc(crosBuffer->get_format()), &encodedMetadata);
470*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_PixelFormatModifier) {
471*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodePixelFormatModifier(crosBuffer->get_format_modifier(),
472*d95af8dfSAndroid Build Coastguard Worker                                                               &encodedMetadata);
473*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Usage) {
474*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeUsage(crosBuffer->get_android_usage(), &encodedMetadata);
475*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_AllocationSize) {
476*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeAllocationSize(crosBuffer->get_total_size(),
477*d95af8dfSAndroid Build Coastguard Worker                                                          &encodedMetadata);
478*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_ProtectedContent) {
479*d95af8dfSAndroid Build Coastguard Worker         uint64_t hasProtectedContent =
480*d95af8dfSAndroid Build Coastguard Worker                 crosBuffer->get_android_usage() & BufferUsage::PROTECTED ? 1 : 0;
481*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeProtectedContent(hasProtectedContent, &encodedMetadata);
482*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Compression) {
483*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeCompression(android::gralloc4::Compression_None,
484*d95af8dfSAndroid Build Coastguard Worker                                                       &encodedMetadata);
485*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Interlaced) {
486*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeInterlaced(android::gralloc4::Interlaced_None,
487*d95af8dfSAndroid Build Coastguard Worker                                                      &encodedMetadata);
488*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_ChromaSiting) {
489*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeChromaSiting(android::gralloc4::ChromaSiting_None,
490*d95af8dfSAndroid Build Coastguard Worker                                                        &encodedMetadata);
491*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_PlaneLayouts) {
492*d95af8dfSAndroid Build Coastguard Worker         std::vector<PlaneLayout> planeLayouts;
493*d95af8dfSAndroid Build Coastguard Worker         getPlaneLayouts(crosBuffer->get_format(), &planeLayouts);
494*d95af8dfSAndroid Build Coastguard Worker 
495*d95af8dfSAndroid Build Coastguard Worker         for (size_t plane = 0; plane < planeLayouts.size(); plane++) {
496*d95af8dfSAndroid Build Coastguard Worker             PlaneLayout& planeLayout = planeLayouts[plane];
497*d95af8dfSAndroid Build Coastguard Worker             planeLayout.offsetInBytes = crosBuffer->get_plane_offset(plane);
498*d95af8dfSAndroid Build Coastguard Worker             planeLayout.strideInBytes = crosBuffer->get_plane_stride(plane);
499*d95af8dfSAndroid Build Coastguard Worker             planeLayout.totalSizeInBytes = crosBuffer->get_plane_size(plane);
500*d95af8dfSAndroid Build Coastguard Worker             planeLayout.widthInSamples =
501*d95af8dfSAndroid Build Coastguard Worker                     crosBuffer->get_width() / planeLayout.horizontalSubsampling;
502*d95af8dfSAndroid Build Coastguard Worker             planeLayout.heightInSamples =
503*d95af8dfSAndroid Build Coastguard Worker                     crosBuffer->get_height() / planeLayout.verticalSubsampling;
504*d95af8dfSAndroid Build Coastguard Worker         }
505*d95af8dfSAndroid Build Coastguard Worker 
506*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodePlaneLayouts(planeLayouts, &encodedMetadata);
507*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Crop) {
508*d95af8dfSAndroid Build Coastguard Worker         const uint32_t numPlanes = crosBuffer->get_num_planes();
509*d95af8dfSAndroid Build Coastguard Worker         const uint32_t w = crosBuffer->get_width();
510*d95af8dfSAndroid Build Coastguard Worker         const uint32_t h = crosBuffer->get_height();
511*d95af8dfSAndroid Build Coastguard Worker         std::vector<aidl::android::hardware::graphics::common::Rect> crops;
512*d95af8dfSAndroid Build Coastguard Worker         for (uint32_t plane = 0; plane < numPlanes; plane++) {
513*d95af8dfSAndroid Build Coastguard Worker             aidl::android::hardware::graphics::common::Rect crop;
514*d95af8dfSAndroid Build Coastguard Worker             crop.left = 0;
515*d95af8dfSAndroid Build Coastguard Worker             crop.top = 0;
516*d95af8dfSAndroid Build Coastguard Worker             crop.right = w;
517*d95af8dfSAndroid Build Coastguard Worker             crop.bottom = h;
518*d95af8dfSAndroid Build Coastguard Worker             crops.push_back(crop);
519*d95af8dfSAndroid Build Coastguard Worker         }
520*d95af8dfSAndroid Build Coastguard Worker 
521*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeCrop(crops, &encodedMetadata);
522*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Dataspace) {
523*d95af8dfSAndroid Build Coastguard Worker         std::optional<Dataspace> dataspace;
524*d95af8dfSAndroid Build Coastguard Worker         int ret = crosBuffer->get_dataspace(&dataspace);
525*d95af8dfSAndroid Build Coastguard Worker         if (ret) {
526*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to get. Failed to get dataspace internal.");
527*d95af8dfSAndroid Build Coastguard Worker             status = android::UNKNOWN_ERROR;
528*d95af8dfSAndroid Build Coastguard Worker         } else {
529*d95af8dfSAndroid Build Coastguard Worker             status = android::gralloc4::encodeDataspace(*dataspace, &encodedMetadata);
530*d95af8dfSAndroid Build Coastguard Worker         }
531*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_BlendMode) {
532*d95af8dfSAndroid Build Coastguard Worker         std::optional<BlendMode> blend;
533*d95af8dfSAndroid Build Coastguard Worker         int ret = crosBuffer->get_blend_mode(&blend);
534*d95af8dfSAndroid Build Coastguard Worker         if (ret) {
535*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to get. Failed to get blend mode internal.");
536*d95af8dfSAndroid Build Coastguard Worker             status = android::UNKNOWN_ERROR;
537*d95af8dfSAndroid Build Coastguard Worker         } else {
538*d95af8dfSAndroid Build Coastguard Worker             status = android::gralloc4::encodeBlendMode(*blend, &encodedMetadata);
539*d95af8dfSAndroid Build Coastguard Worker         }
540*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Smpte2086) {
541*d95af8dfSAndroid Build Coastguard Worker         std::optional<Smpte2086> smpte;
542*d95af8dfSAndroid Build Coastguard Worker         int ret = crosBuffer->get_smpte2086(&smpte);
543*d95af8dfSAndroid Build Coastguard Worker         if (ret) {
544*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to get. Failed to get smpte2086 internal.");
545*d95af8dfSAndroid Build Coastguard Worker             status = android::UNKNOWN_ERROR;
546*d95af8dfSAndroid Build Coastguard Worker         } else {
547*d95af8dfSAndroid Build Coastguard Worker             status = android::gralloc4::encodeSmpte2086(smpte, &encodedMetadata);
548*d95af8dfSAndroid Build Coastguard Worker         }
549*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Cta861_3) {
550*d95af8dfSAndroid Build Coastguard Worker         std::optional<Cta861_3> cta;
551*d95af8dfSAndroid Build Coastguard Worker         int ret = crosBuffer->get_cta861_3(&cta);
552*d95af8dfSAndroid Build Coastguard Worker         if (ret) {
553*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to get. Failed to get cta861_3 internal.");
554*d95af8dfSAndroid Build Coastguard Worker             status = android::UNKNOWN_ERROR;
555*d95af8dfSAndroid Build Coastguard Worker         } else {
556*d95af8dfSAndroid Build Coastguard Worker             status = android::gralloc4::encodeCta861_3(cta, &encodedMetadata);
557*d95af8dfSAndroid Build Coastguard Worker         }
558*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Smpte2094_40) {
559*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeSmpte2094_40(std::nullopt, &encodedMetadata);
560*d95af8dfSAndroid Build Coastguard Worker     } else {
561*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::UNSUPPORTED, encodedMetadata);
562*d95af8dfSAndroid Build Coastguard Worker         return Void();
563*d95af8dfSAndroid Build Coastguard Worker     }
564*d95af8dfSAndroid Build Coastguard Worker 
565*d95af8dfSAndroid Build Coastguard Worker     if (status != android::NO_ERROR) {
566*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, encodedMetadata);
567*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to get. Failed to encode metadata.");
568*d95af8dfSAndroid Build Coastguard Worker         return Void();
569*d95af8dfSAndroid Build Coastguard Worker     }
570*d95af8dfSAndroid Build Coastguard Worker 
571*d95af8dfSAndroid Build Coastguard Worker     hidlCb(Error::NONE, encodedMetadata);
572*d95af8dfSAndroid Build Coastguard Worker     return Void();
573*d95af8dfSAndroid Build Coastguard Worker }
574*d95af8dfSAndroid Build Coastguard Worker 
set(void * rawHandle,const MetadataType & metadataType,const hidl_vec<uint8_t> & encodedMetadata)575*d95af8dfSAndroid Build Coastguard Worker Return<Error> CrosGralloc4Mapper::set(void* rawHandle, const MetadataType& metadataType,
576*d95af8dfSAndroid Build Coastguard Worker                                       const hidl_vec<uint8_t>& encodedMetadata) {
577*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
578*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to set. Driver is uninitialized.");
579*d95af8dfSAndroid Build Coastguard Worker         return Error::NO_RESOURCES;
580*d95af8dfSAndroid Build Coastguard Worker     }
581*d95af8dfSAndroid Build Coastguard Worker 
582*d95af8dfSAndroid Build Coastguard Worker     buffer_handle_t bufferHandle = reinterpret_cast<buffer_handle_t>(rawHandle);
583*d95af8dfSAndroid Build Coastguard Worker     if (!bufferHandle) {
584*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to set. Empty handle.");
585*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_BUFFER;
586*d95af8dfSAndroid Build Coastguard Worker     }
587*d95af8dfSAndroid Build Coastguard Worker 
588*d95af8dfSAndroid Build Coastguard Worker     cros_gralloc_handle_t crosHandle = cros_gralloc_convert_handle(bufferHandle);
589*d95af8dfSAndroid Build Coastguard Worker     if (!crosHandle) {
590*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to set. Invalid handle.");
591*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_BUFFER;
592*d95af8dfSAndroid Build Coastguard Worker     }
593*d95af8dfSAndroid Build Coastguard Worker 
594*d95af8dfSAndroid Build Coastguard Worker     if (metadataType == android::gralloc4::MetadataType_BufferId) {
595*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_VALUE;
596*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Name) {
597*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_VALUE;
598*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Width) {
599*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_VALUE;
600*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Height) {
601*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_VALUE;
602*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_LayerCount) {
603*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_VALUE;
604*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_PixelFormatRequested) {
605*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_VALUE;
606*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Usage) {
607*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_VALUE;
608*d95af8dfSAndroid Build Coastguard Worker     }
609*d95af8dfSAndroid Build Coastguard Worker 
610*d95af8dfSAndroid Build Coastguard Worker     if (metadataType != android::gralloc4::MetadataType_BlendMode &&
611*d95af8dfSAndroid Build Coastguard Worker         metadataType != android::gralloc4::MetadataType_Cta861_3 &&
612*d95af8dfSAndroid Build Coastguard Worker         metadataType != android::gralloc4::MetadataType_Dataspace &&
613*d95af8dfSAndroid Build Coastguard Worker         metadataType != android::gralloc4::MetadataType_Smpte2086) {
614*d95af8dfSAndroid Build Coastguard Worker         return Error::UNSUPPORTED;
615*d95af8dfSAndroid Build Coastguard Worker     }
616*d95af8dfSAndroid Build Coastguard Worker 
617*d95af8dfSAndroid Build Coastguard Worker     Error error = Error::NONE;
618*d95af8dfSAndroid Build Coastguard Worker     mDriver->with_buffer(crosHandle, [&, this](cros_gralloc_buffer* crosBuffer) {
619*d95af8dfSAndroid Build Coastguard Worker         error = set(crosBuffer, metadataType, encodedMetadata);
620*d95af8dfSAndroid Build Coastguard Worker     });
621*d95af8dfSAndroid Build Coastguard Worker 
622*d95af8dfSAndroid Build Coastguard Worker     return error;
623*d95af8dfSAndroid Build Coastguard Worker }
624*d95af8dfSAndroid Build Coastguard Worker 
set(cros_gralloc_buffer * crosBuffer,const MetadataType & metadataType,const android::hardware::hidl_vec<uint8_t> & encodedMetadata)625*d95af8dfSAndroid Build Coastguard Worker Error CrosGralloc4Mapper::set(cros_gralloc_buffer* crosBuffer, const MetadataType& metadataType,
626*d95af8dfSAndroid Build Coastguard Worker                               const android::hardware::hidl_vec<uint8_t>& encodedMetadata) {
627*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
628*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to set. Driver is uninitialized.");
629*d95af8dfSAndroid Build Coastguard Worker         return Error::NO_RESOURCES;
630*d95af8dfSAndroid Build Coastguard Worker     }
631*d95af8dfSAndroid Build Coastguard Worker 
632*d95af8dfSAndroid Build Coastguard Worker     if (!crosBuffer) {
633*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to set. Invalid buffer.");
634*d95af8dfSAndroid Build Coastguard Worker         return Error::BAD_BUFFER;
635*d95af8dfSAndroid Build Coastguard Worker     }
636*d95af8dfSAndroid Build Coastguard Worker 
637*d95af8dfSAndroid Build Coastguard Worker     if (metadataType == android::gralloc4::MetadataType_BlendMode) {
638*d95af8dfSAndroid Build Coastguard Worker         BlendMode blend;
639*d95af8dfSAndroid Build Coastguard Worker         auto status = android::gralloc4::decodeBlendMode(encodedMetadata, &blend);
640*d95af8dfSAndroid Build Coastguard Worker         if (status != android::NO_ERROR) {
641*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to set. Failed to decode blend mode.");
642*d95af8dfSAndroid Build Coastguard Worker             return Error::UNSUPPORTED;
643*d95af8dfSAndroid Build Coastguard Worker         }
644*d95af8dfSAndroid Build Coastguard Worker         int ret = crosBuffer->set_blend_mode(blend);
645*d95af8dfSAndroid Build Coastguard Worker         if (ret) {
646*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to set. Failed to set blend mode internal.");
647*d95af8dfSAndroid Build Coastguard Worker             return Error::NO_RESOURCES;
648*d95af8dfSAndroid Build Coastguard Worker         }
649*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Cta861_3) {
650*d95af8dfSAndroid Build Coastguard Worker         std::optional<Cta861_3> cta;
651*d95af8dfSAndroid Build Coastguard Worker         auto status = android::gralloc4::decodeCta861_3(encodedMetadata, &cta);
652*d95af8dfSAndroid Build Coastguard Worker         if (status != android::NO_ERROR) {
653*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to set. Failed to decode cta861_3.");
654*d95af8dfSAndroid Build Coastguard Worker             return Error::UNSUPPORTED;
655*d95af8dfSAndroid Build Coastguard Worker         }
656*d95af8dfSAndroid Build Coastguard Worker         int ret = crosBuffer->set_cta861_3(cta);
657*d95af8dfSAndroid Build Coastguard Worker         if (ret) {
658*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to set. Failed to set cta861_3 internal.");
659*d95af8dfSAndroid Build Coastguard Worker             return Error::NO_RESOURCES;
660*d95af8dfSAndroid Build Coastguard Worker         }
661*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Dataspace) {
662*d95af8dfSAndroid Build Coastguard Worker         Dataspace dataspace;
663*d95af8dfSAndroid Build Coastguard Worker         auto status = android::gralloc4::decodeDataspace(encodedMetadata, &dataspace);
664*d95af8dfSAndroid Build Coastguard Worker         if (status != android::NO_ERROR) {
665*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to set. Failed to decode dataspace.");
666*d95af8dfSAndroid Build Coastguard Worker             return Error::UNSUPPORTED;
667*d95af8dfSAndroid Build Coastguard Worker         }
668*d95af8dfSAndroid Build Coastguard Worker         int ret = crosBuffer->set_dataspace(dataspace);
669*d95af8dfSAndroid Build Coastguard Worker         if (ret) {
670*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to set. Failed to set dataspace internal.");
671*d95af8dfSAndroid Build Coastguard Worker             return Error::NO_RESOURCES;
672*d95af8dfSAndroid Build Coastguard Worker         }
673*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Smpte2086) {
674*d95af8dfSAndroid Build Coastguard Worker         std::optional<Smpte2086> smpte;
675*d95af8dfSAndroid Build Coastguard Worker         auto status = android::gralloc4::decodeSmpte2086(encodedMetadata, &smpte);
676*d95af8dfSAndroid Build Coastguard Worker         if (status != android::NO_ERROR) {
677*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to set. Failed to decode smpte2086.");
678*d95af8dfSAndroid Build Coastguard Worker             return Error::UNSUPPORTED;
679*d95af8dfSAndroid Build Coastguard Worker         }
680*d95af8dfSAndroid Build Coastguard Worker         int ret = crosBuffer->set_smpte2086(smpte);
681*d95af8dfSAndroid Build Coastguard Worker         if (ret) {
682*d95af8dfSAndroid Build Coastguard Worker             ALOGE("Failed to set. Failed to set dataspace internal.");
683*d95af8dfSAndroid Build Coastguard Worker             return Error::NO_RESOURCES;
684*d95af8dfSAndroid Build Coastguard Worker         }
685*d95af8dfSAndroid Build Coastguard Worker     }
686*d95af8dfSAndroid Build Coastguard Worker 
687*d95af8dfSAndroid Build Coastguard Worker     return Error::NONE;
688*d95af8dfSAndroid Build Coastguard Worker }
689*d95af8dfSAndroid Build Coastguard Worker 
getResolvedDrmFormat(PixelFormat pixelFormat,uint64_t bufferUsage,uint32_t * outDrmFormat)690*d95af8dfSAndroid Build Coastguard Worker int CrosGralloc4Mapper::getResolvedDrmFormat(PixelFormat pixelFormat, uint64_t bufferUsage,
691*d95af8dfSAndroid Build Coastguard Worker                                              uint32_t* outDrmFormat) {
692*d95af8dfSAndroid Build Coastguard Worker     uint32_t drmFormat;
693*d95af8dfSAndroid Build Coastguard Worker     if (convertToDrmFormat(pixelFormat, &drmFormat)) {
694*d95af8dfSAndroid Build Coastguard Worker         std::string pixelFormatString = getPixelFormatString(pixelFormat);
695*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to getResolvedDrmFormat. Failed to convert format %s",
696*d95af8dfSAndroid Build Coastguard Worker               pixelFormatString.c_str());
697*d95af8dfSAndroid Build Coastguard Worker         return -EINVAL;
698*d95af8dfSAndroid Build Coastguard Worker     }
699*d95af8dfSAndroid Build Coastguard Worker 
700*d95af8dfSAndroid Build Coastguard Worker     uint64_t usage;
701*d95af8dfSAndroid Build Coastguard Worker     if (convertToBufferUsage(bufferUsage, &usage)) {
702*d95af8dfSAndroid Build Coastguard Worker         std::string usageString = getUsageString(bufferUsage);
703*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to getResolvedDrmFormat. Failed to convert usage %s", usageString.c_str());
704*d95af8dfSAndroid Build Coastguard Worker         return -EINVAL;
705*d95af8dfSAndroid Build Coastguard Worker     }
706*d95af8dfSAndroid Build Coastguard Worker 
707*d95af8dfSAndroid Build Coastguard Worker     uint32_t resolvedDrmFormat = mDriver->get_resolved_drm_format(drmFormat, usage);
708*d95af8dfSAndroid Build Coastguard Worker     if (resolvedDrmFormat == DRM_FORMAT_INVALID) {
709*d95af8dfSAndroid Build Coastguard Worker         std::string drmFormatString = get_drm_format_string(drmFormat);
710*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to getResolvedDrmFormat. Failed to resolve drm format %s",
711*d95af8dfSAndroid Build Coastguard Worker               drmFormatString.c_str());
712*d95af8dfSAndroid Build Coastguard Worker         return -EINVAL;
713*d95af8dfSAndroid Build Coastguard Worker     }
714*d95af8dfSAndroid Build Coastguard Worker 
715*d95af8dfSAndroid Build Coastguard Worker     *outDrmFormat = resolvedDrmFormat;
716*d95af8dfSAndroid Build Coastguard Worker 
717*d95af8dfSAndroid Build Coastguard Worker     return 0;
718*d95af8dfSAndroid Build Coastguard Worker }
719*d95af8dfSAndroid Build Coastguard Worker 
getFromBufferDescriptorInfo(const BufferDescriptorInfo & descriptor,const MetadataType & metadataType,getFromBufferDescriptorInfo_cb hidlCb)720*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::getFromBufferDescriptorInfo(
721*d95af8dfSAndroid Build Coastguard Worker         const BufferDescriptorInfo& descriptor, const MetadataType& metadataType,
722*d95af8dfSAndroid Build Coastguard Worker         getFromBufferDescriptorInfo_cb hidlCb) {
723*d95af8dfSAndroid Build Coastguard Worker     hidl_vec<uint8_t> encodedMetadata;
724*d95af8dfSAndroid Build Coastguard Worker 
725*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
726*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to getFromBufferDescriptorInfo. Driver is uninitialized.");
727*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, encodedMetadata);
728*d95af8dfSAndroid Build Coastguard Worker         return Void();
729*d95af8dfSAndroid Build Coastguard Worker     }
730*d95af8dfSAndroid Build Coastguard Worker 
731*d95af8dfSAndroid Build Coastguard Worker     android::status_t status = android::NO_ERROR;
732*d95af8dfSAndroid Build Coastguard Worker     if (metadataType == android::gralloc4::MetadataType_Name) {
733*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeName(descriptor.name, &encodedMetadata);
734*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Width) {
735*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeWidth(descriptor.width, &encodedMetadata);
736*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Height) {
737*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeHeight(descriptor.height, &encodedMetadata);
738*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_LayerCount) {
739*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeLayerCount(1, &encodedMetadata);
740*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_PixelFormatRequested) {
741*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodePixelFormatRequested(descriptor.format, &encodedMetadata);
742*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_PixelFormatFourCC) {
743*d95af8dfSAndroid Build Coastguard Worker         uint32_t drmFormat;
744*d95af8dfSAndroid Build Coastguard Worker         if (getResolvedDrmFormat(descriptor.format, descriptor.usage, &drmFormat)) {
745*d95af8dfSAndroid Build Coastguard Worker             hidlCb(Error::BAD_VALUE, encodedMetadata);
746*d95af8dfSAndroid Build Coastguard Worker             return Void();
747*d95af8dfSAndroid Build Coastguard Worker         }
748*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodePixelFormatFourCC(drv_get_standard_fourcc(drmFormat),
749*d95af8dfSAndroid Build Coastguard Worker                                                             &encodedMetadata);
750*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Usage) {
751*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeUsage(descriptor.usage, &encodedMetadata);
752*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_ProtectedContent) {
753*d95af8dfSAndroid Build Coastguard Worker         uint64_t hasProtectedContent = descriptor.usage & BufferUsage::PROTECTED ? 1 : 0;
754*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeProtectedContent(hasProtectedContent, &encodedMetadata);
755*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Compression) {
756*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeCompression(android::gralloc4::Compression_None,
757*d95af8dfSAndroid Build Coastguard Worker                                                       &encodedMetadata);
758*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Interlaced) {
759*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeInterlaced(android::gralloc4::Interlaced_None,
760*d95af8dfSAndroid Build Coastguard Worker                                                      &encodedMetadata);
761*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_ChromaSiting) {
762*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeChromaSiting(android::gralloc4::ChromaSiting_None,
763*d95af8dfSAndroid Build Coastguard Worker                                                        &encodedMetadata);
764*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Crop) {
765*d95af8dfSAndroid Build Coastguard Worker         uint32_t drmFormat;
766*d95af8dfSAndroid Build Coastguard Worker         if (getResolvedDrmFormat(descriptor.format, descriptor.usage, &drmFormat)) {
767*d95af8dfSAndroid Build Coastguard Worker             hidlCb(Error::BAD_VALUE, encodedMetadata);
768*d95af8dfSAndroid Build Coastguard Worker             return Void();
769*d95af8dfSAndroid Build Coastguard Worker         }
770*d95af8dfSAndroid Build Coastguard Worker 
771*d95af8dfSAndroid Build Coastguard Worker         size_t numPlanes = drv_num_planes_from_format(drmFormat);
772*d95af8dfSAndroid Build Coastguard Worker 
773*d95af8dfSAndroid Build Coastguard Worker         std::vector<aidl::android::hardware::graphics::common::Rect> crops;
774*d95af8dfSAndroid Build Coastguard Worker         for (size_t plane = 0; plane < numPlanes; plane++) {
775*d95af8dfSAndroid Build Coastguard Worker             aidl::android::hardware::graphics::common::Rect crop;
776*d95af8dfSAndroid Build Coastguard Worker             crop.left = 0;
777*d95af8dfSAndroid Build Coastguard Worker             crop.top = 0;
778*d95af8dfSAndroid Build Coastguard Worker             crop.right = descriptor.width;
779*d95af8dfSAndroid Build Coastguard Worker             crop.bottom = descriptor.height;
780*d95af8dfSAndroid Build Coastguard Worker             crops.push_back(crop);
781*d95af8dfSAndroid Build Coastguard Worker         }
782*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeCrop(crops, &encodedMetadata);
783*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Dataspace) {
784*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeDataspace(Dataspace::UNKNOWN, &encodedMetadata);
785*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_BlendMode) {
786*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeBlendMode(BlendMode::INVALID, &encodedMetadata);
787*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Smpte2086) {
788*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeSmpte2086(std::nullopt, &encodedMetadata);
789*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Cta861_3) {
790*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeCta861_3(std::nullopt, &encodedMetadata);
791*d95af8dfSAndroid Build Coastguard Worker     } else if (metadataType == android::gralloc4::MetadataType_Smpte2094_40) {
792*d95af8dfSAndroid Build Coastguard Worker         status = android::gralloc4::encodeSmpte2094_40(std::nullopt, &encodedMetadata);
793*d95af8dfSAndroid Build Coastguard Worker     } else {
794*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::UNSUPPORTED, encodedMetadata);
795*d95af8dfSAndroid Build Coastguard Worker         return Void();
796*d95af8dfSAndroid Build Coastguard Worker     }
797*d95af8dfSAndroid Build Coastguard Worker 
798*d95af8dfSAndroid Build Coastguard Worker     if (status != android::NO_ERROR) {
799*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, encodedMetadata);
800*d95af8dfSAndroid Build Coastguard Worker         return Void();
801*d95af8dfSAndroid Build Coastguard Worker     }
802*d95af8dfSAndroid Build Coastguard Worker 
803*d95af8dfSAndroid Build Coastguard Worker     hidlCb(Error::NONE, encodedMetadata);
804*d95af8dfSAndroid Build Coastguard Worker     return Void();
805*d95af8dfSAndroid Build Coastguard Worker }
806*d95af8dfSAndroid Build Coastguard Worker 
listSupportedMetadataTypes(listSupportedMetadataTypes_cb hidlCb)807*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::listSupportedMetadataTypes(listSupportedMetadataTypes_cb hidlCb) {
808*d95af8dfSAndroid Build Coastguard Worker     hidl_vec<MetadataTypeDescription> supported;
809*d95af8dfSAndroid Build Coastguard Worker 
810*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
811*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to listSupportedMetadataTypes. Driver is uninitialized.");
812*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, supported);
813*d95af8dfSAndroid Build Coastguard Worker         return Void();
814*d95af8dfSAndroid Build Coastguard Worker     }
815*d95af8dfSAndroid Build Coastguard Worker 
816*d95af8dfSAndroid Build Coastguard Worker     supported = hidl_vec<IMapper::MetadataTypeDescription>({
817*d95af8dfSAndroid Build Coastguard Worker             {
818*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_BufferId,
819*d95af8dfSAndroid Build Coastguard Worker                     "",
820*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
821*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
822*d95af8dfSAndroid Build Coastguard Worker             },
823*d95af8dfSAndroid Build Coastguard Worker             {
824*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_Name,
825*d95af8dfSAndroid Build Coastguard Worker                     "",
826*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
827*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
828*d95af8dfSAndroid Build Coastguard Worker             },
829*d95af8dfSAndroid Build Coastguard Worker             {
830*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_Width,
831*d95af8dfSAndroid Build Coastguard Worker                     "",
832*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
833*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
834*d95af8dfSAndroid Build Coastguard Worker             },
835*d95af8dfSAndroid Build Coastguard Worker             {
836*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_Height,
837*d95af8dfSAndroid Build Coastguard Worker                     "",
838*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
839*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
840*d95af8dfSAndroid Build Coastguard Worker             },
841*d95af8dfSAndroid Build Coastguard Worker             {
842*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_LayerCount,
843*d95af8dfSAndroid Build Coastguard Worker                     "",
844*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
845*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
846*d95af8dfSAndroid Build Coastguard Worker             },
847*d95af8dfSAndroid Build Coastguard Worker             {
848*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_PixelFormatRequested,
849*d95af8dfSAndroid Build Coastguard Worker                     "",
850*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
851*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
852*d95af8dfSAndroid Build Coastguard Worker             },
853*d95af8dfSAndroid Build Coastguard Worker             {
854*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_PixelFormatFourCC,
855*d95af8dfSAndroid Build Coastguard Worker                     "",
856*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
857*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
858*d95af8dfSAndroid Build Coastguard Worker             },
859*d95af8dfSAndroid Build Coastguard Worker             {
860*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_PixelFormatModifier,
861*d95af8dfSAndroid Build Coastguard Worker                     "",
862*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
863*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
864*d95af8dfSAndroid Build Coastguard Worker             },
865*d95af8dfSAndroid Build Coastguard Worker             {
866*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_Usage,
867*d95af8dfSAndroid Build Coastguard Worker                     "",
868*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
869*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
870*d95af8dfSAndroid Build Coastguard Worker             },
871*d95af8dfSAndroid Build Coastguard Worker             {
872*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_AllocationSize,
873*d95af8dfSAndroid Build Coastguard Worker                     "",
874*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
875*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
876*d95af8dfSAndroid Build Coastguard Worker             },
877*d95af8dfSAndroid Build Coastguard Worker             {
878*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_ProtectedContent,
879*d95af8dfSAndroid Build Coastguard Worker                     "",
880*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
881*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
882*d95af8dfSAndroid Build Coastguard Worker             },
883*d95af8dfSAndroid Build Coastguard Worker             {
884*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_Compression,
885*d95af8dfSAndroid Build Coastguard Worker                     "",
886*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
887*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
888*d95af8dfSAndroid Build Coastguard Worker             },
889*d95af8dfSAndroid Build Coastguard Worker             {
890*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_Interlaced,
891*d95af8dfSAndroid Build Coastguard Worker                     "",
892*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
893*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
894*d95af8dfSAndroid Build Coastguard Worker             },
895*d95af8dfSAndroid Build Coastguard Worker             {
896*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_ChromaSiting,
897*d95af8dfSAndroid Build Coastguard Worker                     "",
898*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
899*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
900*d95af8dfSAndroid Build Coastguard Worker             },
901*d95af8dfSAndroid Build Coastguard Worker             {
902*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_PlaneLayouts,
903*d95af8dfSAndroid Build Coastguard Worker                     "",
904*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
905*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
906*d95af8dfSAndroid Build Coastguard Worker             },
907*d95af8dfSAndroid Build Coastguard Worker             {
908*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_Crop,
909*d95af8dfSAndroid Build Coastguard Worker                     "",
910*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
911*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
912*d95af8dfSAndroid Build Coastguard Worker             },
913*d95af8dfSAndroid Build Coastguard Worker             {
914*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_Dataspace,
915*d95af8dfSAndroid Build Coastguard Worker                     "",
916*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
917*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/true,
918*d95af8dfSAndroid Build Coastguard Worker             },
919*d95af8dfSAndroid Build Coastguard Worker             {
920*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_BlendMode,
921*d95af8dfSAndroid Build Coastguard Worker                     "",
922*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
923*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/true,
924*d95af8dfSAndroid Build Coastguard Worker             },
925*d95af8dfSAndroid Build Coastguard Worker             {
926*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_Smpte2086,
927*d95af8dfSAndroid Build Coastguard Worker                     "",
928*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
929*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/true,
930*d95af8dfSAndroid Build Coastguard Worker             },
931*d95af8dfSAndroid Build Coastguard Worker             {
932*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_Cta861_3,
933*d95af8dfSAndroid Build Coastguard Worker                     "",
934*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
935*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/true,
936*d95af8dfSAndroid Build Coastguard Worker             },
937*d95af8dfSAndroid Build Coastguard Worker             {
938*d95af8dfSAndroid Build Coastguard Worker                     android::gralloc4::MetadataType_Smpte2094_40,
939*d95af8dfSAndroid Build Coastguard Worker                     "",
940*d95af8dfSAndroid Build Coastguard Worker                     /*isGettable=*/true,
941*d95af8dfSAndroid Build Coastguard Worker                     /*isSettable=*/false,
942*d95af8dfSAndroid Build Coastguard Worker             },
943*d95af8dfSAndroid Build Coastguard Worker     });
944*d95af8dfSAndroid Build Coastguard Worker 
945*d95af8dfSAndroid Build Coastguard Worker     hidlCb(Error::NONE, supported);
946*d95af8dfSAndroid Build Coastguard Worker     return Void();
947*d95af8dfSAndroid Build Coastguard Worker }
948*d95af8dfSAndroid Build Coastguard Worker 
dumpBuffer(void * rawHandle,dumpBuffer_cb hidlCb)949*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::dumpBuffer(void* rawHandle, dumpBuffer_cb hidlCb) {
950*d95af8dfSAndroid Build Coastguard Worker     BufferDump bufferDump;
951*d95af8dfSAndroid Build Coastguard Worker 
952*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
953*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to dumpBuffer. Driver is uninitialized.");
954*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, bufferDump);
955*d95af8dfSAndroid Build Coastguard Worker         return Void();
956*d95af8dfSAndroid Build Coastguard Worker     }
957*d95af8dfSAndroid Build Coastguard Worker 
958*d95af8dfSAndroid Build Coastguard Worker     buffer_handle_t bufferHandle = reinterpret_cast<buffer_handle_t>(rawHandle);
959*d95af8dfSAndroid Build Coastguard Worker     if (!bufferHandle) {
960*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to dumpBuffer. Empty handle.");
961*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, bufferDump);
962*d95af8dfSAndroid Build Coastguard Worker         return Void();
963*d95af8dfSAndroid Build Coastguard Worker     }
964*d95af8dfSAndroid Build Coastguard Worker 
965*d95af8dfSAndroid Build Coastguard Worker     cros_gralloc_handle_t crosHandle = cros_gralloc_convert_handle(bufferHandle);
966*d95af8dfSAndroid Build Coastguard Worker     if (!crosHandle) {
967*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to dumpBuffer. Invalid handle.");
968*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, bufferDump);
969*d95af8dfSAndroid Build Coastguard Worker         return Void();
970*d95af8dfSAndroid Build Coastguard Worker     }
971*d95af8dfSAndroid Build Coastguard Worker 
972*d95af8dfSAndroid Build Coastguard Worker     mDriver->with_buffer(crosHandle, [&, this](cros_gralloc_buffer* crosBuffer) {
973*d95af8dfSAndroid Build Coastguard Worker         dumpBuffer(crosBuffer, hidlCb);
974*d95af8dfSAndroid Build Coastguard Worker     });
975*d95af8dfSAndroid Build Coastguard Worker     return Void();
976*d95af8dfSAndroid Build Coastguard Worker }
977*d95af8dfSAndroid Build Coastguard Worker 
dumpBuffer(const cros_gralloc_buffer * crosBuffer,dumpBuffer_cb hidlCb)978*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::dumpBuffer(const cros_gralloc_buffer* crosBuffer,
979*d95af8dfSAndroid Build Coastguard Worker                                             dumpBuffer_cb hidlCb) {
980*d95af8dfSAndroid Build Coastguard Worker     BufferDump bufferDump;
981*d95af8dfSAndroid Build Coastguard Worker 
982*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
983*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to dumpBuffer. Driver is uninitialized.");
984*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, bufferDump);
985*d95af8dfSAndroid Build Coastguard Worker         return Void();
986*d95af8dfSAndroid Build Coastguard Worker     }
987*d95af8dfSAndroid Build Coastguard Worker 
988*d95af8dfSAndroid Build Coastguard Worker     std::vector<MetadataDump> metadataDumps;
989*d95af8dfSAndroid Build Coastguard Worker 
990*d95af8dfSAndroid Build Coastguard Worker     MetadataType metadataType = android::gralloc4::MetadataType_BufferId;
991*d95af8dfSAndroid Build Coastguard Worker     auto metadata_get_callback = [&](Error, hidl_vec<uint8_t> metadata) {
992*d95af8dfSAndroid Build Coastguard Worker         MetadataDump metadataDump;
993*d95af8dfSAndroid Build Coastguard Worker         metadataDump.metadataType = metadataType;
994*d95af8dfSAndroid Build Coastguard Worker         metadataDump.metadata = metadata;
995*d95af8dfSAndroid Build Coastguard Worker         metadataDumps.push_back(metadataDump);
996*d95af8dfSAndroid Build Coastguard Worker     };
997*d95af8dfSAndroid Build Coastguard Worker 
998*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_BufferId;
999*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1000*d95af8dfSAndroid Build Coastguard Worker 
1001*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_Name;
1002*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1003*d95af8dfSAndroid Build Coastguard Worker 
1004*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_Width;
1005*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1006*d95af8dfSAndroid Build Coastguard Worker 
1007*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_Height;
1008*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1009*d95af8dfSAndroid Build Coastguard Worker 
1010*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_LayerCount;
1011*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1012*d95af8dfSAndroid Build Coastguard Worker 
1013*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_PixelFormatRequested;
1014*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1015*d95af8dfSAndroid Build Coastguard Worker 
1016*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_PixelFormatFourCC;
1017*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1018*d95af8dfSAndroid Build Coastguard Worker 
1019*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_PixelFormatModifier;
1020*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1021*d95af8dfSAndroid Build Coastguard Worker 
1022*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_Usage;
1023*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1024*d95af8dfSAndroid Build Coastguard Worker 
1025*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_AllocationSize;
1026*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1027*d95af8dfSAndroid Build Coastguard Worker 
1028*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_ProtectedContent;
1029*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1030*d95af8dfSAndroid Build Coastguard Worker 
1031*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_Compression;
1032*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1033*d95af8dfSAndroid Build Coastguard Worker 
1034*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_Interlaced;
1035*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1036*d95af8dfSAndroid Build Coastguard Worker 
1037*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_ChromaSiting;
1038*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1039*d95af8dfSAndroid Build Coastguard Worker 
1040*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_PlaneLayouts;
1041*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1042*d95af8dfSAndroid Build Coastguard Worker 
1043*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_Dataspace;
1044*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1045*d95af8dfSAndroid Build Coastguard Worker 
1046*d95af8dfSAndroid Build Coastguard Worker     metadataType = android::gralloc4::MetadataType_BlendMode;
1047*d95af8dfSAndroid Build Coastguard Worker     get(crosBuffer, metadataType, metadata_get_callback);
1048*d95af8dfSAndroid Build Coastguard Worker 
1049*d95af8dfSAndroid Build Coastguard Worker     bufferDump.metadataDump = metadataDumps;
1050*d95af8dfSAndroid Build Coastguard Worker     hidlCb(Error::NONE, bufferDump);
1051*d95af8dfSAndroid Build Coastguard Worker     return Void();
1052*d95af8dfSAndroid Build Coastguard Worker }
1053*d95af8dfSAndroid Build Coastguard Worker 
dumpBuffers(dumpBuffers_cb hidlCb)1054*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::dumpBuffers(dumpBuffers_cb hidlCb) {
1055*d95af8dfSAndroid Build Coastguard Worker     std::vector<BufferDump> bufferDumps;
1056*d95af8dfSAndroid Build Coastguard Worker 
1057*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
1058*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to dumpBuffers. Driver is uninitialized.");
1059*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, bufferDumps);
1060*d95af8dfSAndroid Build Coastguard Worker         return Void();
1061*d95af8dfSAndroid Build Coastguard Worker     }
1062*d95af8dfSAndroid Build Coastguard Worker 
1063*d95af8dfSAndroid Build Coastguard Worker     Error error = Error::NONE;
1064*d95af8dfSAndroid Build Coastguard Worker 
1065*d95af8dfSAndroid Build Coastguard Worker     const auto dumpBufferCallback = [&](Error err, BufferDump bufferDump) {
1066*d95af8dfSAndroid Build Coastguard Worker         error = err;
1067*d95af8dfSAndroid Build Coastguard Worker         if (error == Error::NONE) {
1068*d95af8dfSAndroid Build Coastguard Worker             bufferDumps.push_back(bufferDump);
1069*d95af8dfSAndroid Build Coastguard Worker         }
1070*d95af8dfSAndroid Build Coastguard Worker     };
1071*d95af8dfSAndroid Build Coastguard Worker 
1072*d95af8dfSAndroid Build Coastguard Worker     mDriver->with_each_buffer(
1073*d95af8dfSAndroid Build Coastguard Worker             [&](cros_gralloc_buffer* crosBuffer) { dumpBuffer(crosBuffer, dumpBufferCallback); });
1074*d95af8dfSAndroid Build Coastguard Worker 
1075*d95af8dfSAndroid Build Coastguard Worker     hidlCb(error, bufferDumps);
1076*d95af8dfSAndroid Build Coastguard Worker     return Void();
1077*d95af8dfSAndroid Build Coastguard Worker }
1078*d95af8dfSAndroid Build Coastguard Worker 
getReservedRegion(void * rawHandle,getReservedRegion_cb hidlCb)1079*d95af8dfSAndroid Build Coastguard Worker Return<void> CrosGralloc4Mapper::getReservedRegion(void* rawHandle, getReservedRegion_cb hidlCb) {
1080*d95af8dfSAndroid Build Coastguard Worker     if (!mDriver) {
1081*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to getReservedRegion. Driver is uninitialized.");
1082*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::NO_RESOURCES, nullptr, 0);
1083*d95af8dfSAndroid Build Coastguard Worker         return Void();
1084*d95af8dfSAndroid Build Coastguard Worker     }
1085*d95af8dfSAndroid Build Coastguard Worker 
1086*d95af8dfSAndroid Build Coastguard Worker     buffer_handle_t bufferHandle = reinterpret_cast<buffer_handle_t>(rawHandle);
1087*d95af8dfSAndroid Build Coastguard Worker     if (!bufferHandle) {
1088*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to getReservedRegion. Empty handle.");
1089*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, nullptr, 0);
1090*d95af8dfSAndroid Build Coastguard Worker         return Void();
1091*d95af8dfSAndroid Build Coastguard Worker     }
1092*d95af8dfSAndroid Build Coastguard Worker 
1093*d95af8dfSAndroid Build Coastguard Worker     cros_gralloc_handle_t crosHandle = cros_gralloc_convert_handle(bufferHandle);
1094*d95af8dfSAndroid Build Coastguard Worker     if (!crosHandle) {
1095*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to getReservedRegion. Invalid handle.");
1096*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, nullptr, 0);
1097*d95af8dfSAndroid Build Coastguard Worker         return Void();
1098*d95af8dfSAndroid Build Coastguard Worker     }
1099*d95af8dfSAndroid Build Coastguard Worker 
1100*d95af8dfSAndroid Build Coastguard Worker     void* reservedRegionAddr = nullptr;
1101*d95af8dfSAndroid Build Coastguard Worker     uint64_t reservedRegionSize = 0;
1102*d95af8dfSAndroid Build Coastguard Worker 
1103*d95af8dfSAndroid Build Coastguard Worker     Error error = Error::NONE;
1104*d95af8dfSAndroid Build Coastguard Worker     mDriver->with_buffer(crosHandle, [&](cros_gralloc_buffer* crosBuffer) {
1105*d95af8dfSAndroid Build Coastguard Worker         int ret = crosBuffer->get_client_reserved_region(&reservedRegionAddr, &reservedRegionSize);
1106*d95af8dfSAndroid Build Coastguard Worker         if (ret) {
1107*d95af8dfSAndroid Build Coastguard Worker             reservedRegionAddr = nullptr;
1108*d95af8dfSAndroid Build Coastguard Worker             reservedRegionSize = 0;
1109*d95af8dfSAndroid Build Coastguard Worker             error = Error::NO_RESOURCES;
1110*d95af8dfSAndroid Build Coastguard Worker         }
1111*d95af8dfSAndroid Build Coastguard Worker     });
1112*d95af8dfSAndroid Build Coastguard Worker 
1113*d95af8dfSAndroid Build Coastguard Worker     if (error != Error::NONE) {
1114*d95af8dfSAndroid Build Coastguard Worker         ALOGE("Failed to getReservedRegion.");
1115*d95af8dfSAndroid Build Coastguard Worker         hidlCb(Error::BAD_BUFFER, nullptr, 0);
1116*d95af8dfSAndroid Build Coastguard Worker         return Void();
1117*d95af8dfSAndroid Build Coastguard Worker     }
1118*d95af8dfSAndroid Build Coastguard Worker 
1119*d95af8dfSAndroid Build Coastguard Worker     hidlCb(Error::NONE, reservedRegionAddr, reservedRegionSize);
1120*d95af8dfSAndroid Build Coastguard Worker     return Void();
1121*d95af8dfSAndroid Build Coastguard Worker }
1122*d95af8dfSAndroid Build Coastguard Worker 
HIDL_FETCH_IMapper(const char *)1123*d95af8dfSAndroid Build Coastguard Worker android::hardware::graphics::mapper::V4_0::IMapper* HIDL_FETCH_IMapper(const char* /*name*/) {
1124*d95af8dfSAndroid Build Coastguard Worker     return static_cast<android::hardware::graphics::mapper::V4_0::IMapper*>(new CrosGralloc4Mapper);
1125*d95af8dfSAndroid Build Coastguard Worker }
1126