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