blob: dd9a0297ac3875be2c9ebbfec757f4d6dabe85fc [file] [log] [blame]
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301/*
Tharaga Balachandran576571c2020-01-23 18:41:10 -05002 * Copyright (c) 2011-2018, 2020 The Linux Foundation. All rights reserved.
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05303 * Not a Contribution
4 *
5 * Copyright (C) 2010 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
Naseer Ahmed699b4572017-03-09 12:28:45 -050020#define DEBUG 0
Saurabh Shah14c8e5b2017-04-07 10:37:23 -070021
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050022#include "gr_buf_mgr.h"
23
24#include <QtiGralloc.h>
25#include <QtiGrallocPriv.h>
26#include <gralloctypes/Gralloc4.h>
27#include <sys/mman.h>
28
Naseer Ahmeddc918132017-03-07 15:25:14 -050029#include <iomanip>
Naseer Ahmede36f2242017-12-01 15:33:56 -050030#include <sstream>
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050031#include <string>
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053032#include <utility>
Naseer Ahmede69031e2016-11-22 20:05:16 -050033#include <vector>
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053034
Tharaga Balachandran576571c2020-01-23 18:41:10 -050035#include "gr_adreno_info.h"
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053036#include "gr_buf_descriptor.h"
Naseer Ahmede36f2242017-12-01 15:33:56 -050037#include "gr_priv_handle.h"
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050038#include "gr_utils.h"
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053039#include "qdMetaData.h"
Naseer Ahmede36f2242017-12-01 15:33:56 -050040#include "qd_utils.h"
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053041
Naseer Ahmede36f2242017-12-01 15:33:56 -050042namespace gralloc {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053043
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050044using aidl::android::hardware::graphics::common::BlendMode;
45using aidl::android::hardware::graphics::common::Cta861_3;
46using aidl::android::hardware::graphics::common::Dataspace;
47using aidl::android::hardware::graphics::common::PlaneLayout;
48using aidl::android::hardware::graphics::common::PlaneLayoutComponent;
49using aidl::android::hardware::graphics::common::Rect;
50using aidl::android::hardware::graphics::common::Smpte2086;
51using aidl::android::hardware::graphics::common::StandardMetadataType;
52using aidl::android::hardware::graphics::common::XyColor;
53using ::android::hardware::graphics::common::V1_2::PixelFormat;
Tharaga Balachandran40648032020-05-01 10:54:31 -040054
Saurabh Shah14c8e5b2017-04-07 10:37:23 -070055static BufferInfo GetBufferInfo(const BufferDescriptor &descriptor) {
56 return BufferInfo(descriptor.GetWidth(), descriptor.GetHeight(), descriptor.GetFormat(),
Naseer Ahmede36f2242017-12-01 15:33:56 -050057 descriptor.GetUsage());
Saurabh Shah14c8e5b2017-04-07 10:37:23 -070058}
59
Tharaga Balachandran40648032020-05-01 10:54:31 -040060static uint64_t getMetaDataSize(uint64_t reserved_region_size) {
61// Only include the reserved region size when using Metadata_t V2
62#ifndef METADATA_V2
63 reserved_region_size = 0;
64#endif
65 return static_cast<uint64_t>(ROUND_UP_PAGESIZE(sizeof(MetaData_t) +
66 static_cast<uint32_t>(reserved_region_size)));
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050067}
68
Tharaga Balachandran40648032020-05-01 10:54:31 -040069static void unmapAndReset(private_handle_t *handle, uint64_t reserved_region_size = 0) {
70 if (private_handle_t::validate(handle) == 0 && handle->base_metadata) {
71 munmap(reinterpret_cast<void *>(handle->base_metadata),
72 static_cast<uint32_t>(getMetaDataSize(reserved_region_size)));
73 handle->base_metadata = 0;
74 }
75}
76
77static int validateAndMap(private_handle_t *handle, uint64_t reserved_region_size = 0) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050078 if (private_handle_t::validate(handle)) {
79 ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
80 return -1;
81 }
82 if (handle->fd_metadata < 0) {
83 // Silently return, metadata cannot be used
84 return -1;
85 }
86
87 if (!handle->base_metadata) {
Tharaga Balachandran40648032020-05-01 10:54:31 -040088 uint64_t size = getMetaDataSize(reserved_region_size);
89 void *base = mmap(NULL, static_cast<uint32_t>(size), PROT_READ | PROT_WRITE,
90 MAP_SHARED, handle->fd_metadata, 0);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050091 if (base == reinterpret_cast<void *>(MAP_FAILED)) {
92 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s", __func__, handle,
93 handle->fd_metadata, strerror(errno));
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050094 return -1;
95 }
96 handle->base_metadata = (uintptr_t)base;
Tharaga Balachandran40648032020-05-01 10:54:31 -040097#ifdef METADATA_V2
98 // The allocator process gets the reserved region size from the BufferDescriptor.
99 // When importing to another process, the reserved size is unknown until mapping the metadata,
100 // hence the re-mapping below
101 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
102 if (reserved_region_size == 0 && metadata->reservedSize) {
103 size = getMetaDataSize(metadata->reservedSize);
104 unmapAndReset(handle);
105 void *new_base = mmap(NULL, static_cast<uint32_t>(size), PROT_READ | PROT_WRITE, MAP_SHARED, handle->fd_metadata, 0);
106 if (new_base == reinterpret_cast<void *>(MAP_FAILED)) {
107 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s", __func__, handle,
108 handle->fd_metadata, strerror(errno));
109 return -1;
110 }
111 handle->base_metadata = (uintptr_t)new_base;
112 }
113#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500114 }
115 return 0;
116}
117
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500118static Error dataspaceToColorMetadata(Dataspace dataspace, ColorMetaData *color_metadata) {
119 ColorMetaData out;
120 uint32_t primaries = (uint32_t)dataspace & (uint32_t)Dataspace::STANDARD_MASK;
121 uint32_t transfer = (uint32_t)dataspace & (uint32_t)Dataspace::TRANSFER_MASK;
122 uint32_t range = (uint32_t)dataspace & (uint32_t)Dataspace::RANGE_MASK;
123
124 switch (primaries) {
125 case (uint32_t)Dataspace::STANDARD_BT709:
126 out.colorPrimaries = ColorPrimaries_BT709_5;
127 break;
128 // TODO(tbalacha): verify this is equivalent
129 case (uint32_t)Dataspace::STANDARD_BT470M:
130 out.colorPrimaries = ColorPrimaries_BT470_6M;
131 break;
132 case (uint32_t)Dataspace::STANDARD_BT601_625:
133 case (uint32_t)Dataspace::STANDARD_BT601_625_UNADJUSTED:
134 out.colorPrimaries = ColorPrimaries_BT601_6_625;
135 break;
136 case (uint32_t)Dataspace::STANDARD_BT601_525:
137 case (uint32_t)Dataspace::STANDARD_BT601_525_UNADJUSTED:
138 out.colorPrimaries = ColorPrimaries_BT601_6_525;
139 break;
140 case (uint32_t)Dataspace::STANDARD_FILM:
141 out.colorPrimaries = ColorPrimaries_GenericFilm;
142 break;
143 case (uint32_t)Dataspace::STANDARD_BT2020:
144 out.colorPrimaries = ColorPrimaries_BT2020;
145 break;
146 case (uint32_t)Dataspace::STANDARD_ADOBE_RGB:
147 out.colorPrimaries = ColorPrimaries_AdobeRGB;
148 break;
149 case (uint32_t)Dataspace::STANDARD_DCI_P3:
150 out.colorPrimaries = ColorPrimaries_DCIP3;
151 break;
152 default:
153 return Error::UNSUPPORTED;
154 /*
155 ColorPrimaries_SMPTE_240M;
156 ColorPrimaries_SMPTE_ST428;
157 ColorPrimaries_EBU3213;
158 */
159 }
160
161 switch (transfer) {
162 case (uint32_t)Dataspace::TRANSFER_SRGB:
163 out.transfer = Transfer_sRGB;
164 break;
165 case (uint32_t)Dataspace::TRANSFER_GAMMA2_2:
166 out.transfer = Transfer_Gamma2_2;
167 break;
168 case (uint32_t)Dataspace::TRANSFER_GAMMA2_8:
169 out.transfer = Transfer_Gamma2_8;
170 break;
171 case (uint32_t)Dataspace::TRANSFER_SMPTE_170M:
172 out.transfer = Transfer_SMPTE_170M;
173 break;
174 case (uint32_t)Dataspace::TRANSFER_LINEAR:
175 out.transfer = Transfer_Linear;
176 break;
177 case (uint32_t)Dataspace::TRANSFER_HLG:
178 out.transfer = Transfer_HLG;
179 break;
180 default:
181 return Error::UNSUPPORTED;
182 /*
183 Transfer_SMPTE_240M
184 Transfer_Log
185 Transfer_Log_Sqrt
186 Transfer_XvYCC
187 Transfer_BT1361
188 Transfer_sYCC
189 Transfer_BT2020_2_1
190 Transfer_BT2020_2_2
191 Transfer_SMPTE_ST2084
192 Transfer_ST_428
193 */
194 }
195
196 switch (range) {
197 case (uint32_t)Dataspace::RANGE_FULL:
198 out.range = Range_Full;
199 break;
200 case (uint32_t)Dataspace::RANGE_LIMITED:
201 out.range = Range_Limited;
202 break;
203 case (uint32_t)Dataspace::RANGE_EXTENDED:
204 out.range = Range_Extended;
205 break;
206 default:
207 return Error::UNSUPPORTED;
208 }
209
210 color_metadata->colorPrimaries = out.colorPrimaries;
211 color_metadata->transfer = out.transfer;
212 color_metadata->range = out.range;
213 return Error::NONE;
214}
215static Error colorMetadataToDataspace(ColorMetaData color_metadata, Dataspace *dataspace) {
216 Dataspace primaries, transfer, range = Dataspace::UNKNOWN;
217
218 switch (color_metadata.colorPrimaries) {
219 case ColorPrimaries_BT709_5:
220 primaries = Dataspace::STANDARD_BT709;
221 break;
222 // TODO(tbalacha): verify this is equivalent
223 case ColorPrimaries_BT470_6M:
224 primaries = Dataspace::STANDARD_BT470M;
225 break;
226 case ColorPrimaries_BT601_6_625:
227 primaries = Dataspace::STANDARD_BT601_625;
228 break;
229 case ColorPrimaries_BT601_6_525:
230 primaries = Dataspace::STANDARD_BT601_525;
231 break;
232 case ColorPrimaries_GenericFilm:
233 primaries = Dataspace::STANDARD_FILM;
234 break;
235 case ColorPrimaries_BT2020:
236 primaries = Dataspace::STANDARD_BT2020;
237 break;
238 case ColorPrimaries_AdobeRGB:
239 primaries = Dataspace::STANDARD_ADOBE_RGB;
240 break;
241 case ColorPrimaries_DCIP3:
242 primaries = Dataspace::STANDARD_DCI_P3;
243 break;
244 default:
245 return Error::UNSUPPORTED;
246 /*
247 ColorPrimaries_SMPTE_240M;
248 ColorPrimaries_SMPTE_ST428;
249 ColorPrimaries_EBU3213;
250 */
251 }
252
253 switch (color_metadata.transfer) {
254 case Transfer_sRGB:
255 transfer = Dataspace::TRANSFER_SRGB;
256 break;
257 case Transfer_Gamma2_2:
258 transfer = Dataspace::TRANSFER_GAMMA2_2;
259 break;
260 case Transfer_Gamma2_8:
261 transfer = Dataspace::TRANSFER_GAMMA2_8;
262 break;
263 case Transfer_SMPTE_170M:
264 transfer = Dataspace::TRANSFER_SMPTE_170M;
265 break;
266 case Transfer_Linear:
267 transfer = Dataspace::TRANSFER_LINEAR;
268 break;
269 case Transfer_HLG:
270 transfer = Dataspace::TRANSFER_HLG;
271 break;
272 default:
273 return Error::UNSUPPORTED;
274 /*
275 Transfer_SMPTE_240M
276 Transfer_Log
277 Transfer_Log_Sqrt
278 Transfer_XvYCC
279 Transfer_BT1361
280 Transfer_sYCC
281 Transfer_BT2020_2_1
282 Transfer_BT2020_2_2
283 Transfer_SMPTE_ST2084
284 Transfer_ST_428
285 */
286 }
287
288 switch (color_metadata.range) {
289 case Range_Full:
290 range = Dataspace::RANGE_FULL;
291 break;
292 case Range_Limited:
293 range = Dataspace::RANGE_LIMITED;
294 break;
295 case Range_Extended:
296 range = Dataspace::RANGE_EXTENDED;
297 break;
298 default:
299 return Error::UNSUPPORTED;
300 }
301
302 *dataspace = (Dataspace)((uint32_t)primaries | (uint32_t)transfer | (uint32_t)range);
303 return Error::NONE;
304}
305
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400306static Error getComponentSizeAndOffset(int32_t format, PlaneLayoutComponent &comp) {
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400307 switch (format) {
308 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_8888):
309 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBX_8888):
310 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGB_888):
311 comp.sizeInBits = 8;
312 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
313 comp.offsetInBits = 0;
314 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
315 comp.offsetInBits = 8;
316 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
317 comp.offsetInBits = 16;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400318 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value &&
319 format != HAL_PIXEL_FORMAT_RGB_888) {
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400320 comp.offsetInBits = 24;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400321 } else {
322 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400323 }
324 break;
325 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGB_565):
326 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
327 comp.offsetInBits = 0;
328 comp.sizeInBits = 5;
329 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
330 comp.offsetInBits = 5;
331 comp.sizeInBits = 6;
332 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
333 comp.offsetInBits = 11;
334 comp.sizeInBits = 5;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400335 } else {
336 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400337 }
338 break;
339 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGR_565):
340 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
341 comp.offsetInBits = 11;
342 comp.sizeInBits = 5;
343 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
344 comp.offsetInBits = 5;
345 comp.sizeInBits = 6;
346 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
347 comp.offsetInBits = 0;
348 comp.sizeInBits = 5;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400349 } else {
350 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400351 }
352 break;
353 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRA_8888):
354 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRX_8888):
355 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGR_888):
356 comp.sizeInBits = 8;
357 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
358 comp.offsetInBits = 16;
359 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
360 comp.offsetInBits = 8;
361 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
362 comp.offsetInBits = 0;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400363 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value &&
364 format != HAL_PIXEL_FORMAT_BGR_888) {
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400365 comp.offsetInBits = 24;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400366 } else {
367 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400368 }
369 break;
370 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_5551):
371 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
372 comp.sizeInBits = 5;
373 comp.offsetInBits = 0;
374 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
375 comp.sizeInBits = 5;
376 comp.offsetInBits = 5;
377 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
378 comp.sizeInBits = 5;
379 comp.offsetInBits = 10;
380 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
381 comp.sizeInBits = 1;
382 comp.offsetInBits = 15;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400383 } else {
384 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400385 }
386 break;
387 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_4444):
388 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
389 comp.sizeInBits = 4;
390 comp.offsetInBits = 0;
391 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
392 comp.sizeInBits = 4;
393 comp.offsetInBits = 4;
394 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
395 comp.sizeInBits = 4;
396 comp.offsetInBits = 8;
397 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
398 comp.sizeInBits = 4;
399 comp.offsetInBits = 12;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400400 } else {
401 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400402 }
403 break;
404 case static_cast<int32_t>(HAL_PIXEL_FORMAT_R_8):
405 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RG_88):
406 comp.sizeInBits = 8;
407 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
408 comp.offsetInBits = 0;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400409 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value &&
410 format != HAL_PIXEL_FORMAT_R_8) {
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400411 comp.offsetInBits = 8;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400412 } else {
413 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400414 }
415 break;
416 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_1010102):
417 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBX_1010102):
418 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
419 comp.sizeInBits = 10;
420 comp.offsetInBits = 0;
421 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
422 comp.sizeInBits = 10;
423 comp.offsetInBits = 10;
424 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
425 comp.sizeInBits = 10;
426 comp.offsetInBits = 20;
427 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
428 comp.sizeInBits = 2;
429 comp.offsetInBits = 30;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400430 } else {
431 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400432 }
433 break;
434 case static_cast<int32_t>(HAL_PIXEL_FORMAT_ARGB_2101010):
435 case static_cast<int32_t>(HAL_PIXEL_FORMAT_XRGB_2101010):
436 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
437 comp.sizeInBits = 10;
438 comp.offsetInBits = 2;
439 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
440 comp.sizeInBits = 10;
441 comp.offsetInBits = 12;
442 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
443 comp.sizeInBits = 10;
444 comp.offsetInBits = 22;
445 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
446 comp.sizeInBits = 2;
447 comp.offsetInBits = 0;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400448 } else {
449 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400450 }
451 break;
452 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRA_1010102):
453 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRX_1010102):
454 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
455 comp.sizeInBits = 10;
456 comp.offsetInBits = 20;
457 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
458 comp.sizeInBits = 10;
459 comp.offsetInBits = 10;
460 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
461 comp.sizeInBits = 10;
462 comp.offsetInBits = 0;
463 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
464 comp.sizeInBits = 2;
465 comp.offsetInBits = 30;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400466 } else {
467 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400468 }
469 break;
470 case static_cast<int32_t>(HAL_PIXEL_FORMAT_ABGR_2101010):
471 case static_cast<int32_t>(HAL_PIXEL_FORMAT_XBGR_2101010):
472 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
473 comp.sizeInBits = 10;
474 comp.offsetInBits = 22;
475 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
476 comp.sizeInBits = 10;
477 comp.offsetInBits = 12;
478 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
479 comp.sizeInBits = 10;
480 comp.offsetInBits = 2;
481 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
482 comp.sizeInBits = 2;
483 comp.offsetInBits = 0;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400484 } else {
485 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400486 }
487 break;
488 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_FP16):
489 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
490 comp.sizeInBits = 16;
491 comp.offsetInBits = 0;
492 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
493 comp.sizeInBits = 16;
494 comp.offsetInBits = 16;
495 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
496 comp.sizeInBits = 16;
497 comp.offsetInBits = 32;
498 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
499 comp.sizeInBits = 16;
500 comp.offsetInBits = 48;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400501 } else {
502 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400503 }
504 break;
505 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_SP):
506 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_422_SP):
507 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS):
508 case static_cast<int32_t>(HAL_PIXEL_FORMAT_NV12_ENCODEABLE):
509 comp.sizeInBits = 8;
510 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
511 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value) {
512 comp.offsetInBits = 0;
513 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
514 comp.offsetInBits = 8;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400515 } else {
516 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400517 }
518 break;
519 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP):
520 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_422_SP):
521 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO):
522 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS):
523 case static_cast<int32_t>(HAL_PIXEL_FORMAT_NV21_ZSL):
524 comp.sizeInBits = 8;
525 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
526 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
527 comp.offsetInBits = 0;
528 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value) {
529 comp.offsetInBits = 8;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400530 } else {
531 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400532 }
533 break;
534 case static_cast<int32_t>(HAL_PIXEL_FORMAT_Y16):
535 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value) {
536 comp.offsetInBits = 0;
537 comp.sizeInBits = 16;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400538 } else {
539 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400540 }
541 break;
542 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YV12):
543 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
544 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value ||
545 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
546 comp.offsetInBits = 0;
547 comp.sizeInBits = 8;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400548 } else {
549 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400550 }
551 break;
552 case static_cast<int32_t>(HAL_PIXEL_FORMAT_Y8):
553 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value) {
554 comp.offsetInBits = 0;
555 comp.sizeInBits = 8;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400556 } else {
557 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400558 }
559 break;
560 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_P010):
561 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
562 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value ||
563 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
564 comp.offsetInBits = 0;
565 comp.sizeInBits = 10;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400566 } else {
567 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400568 }
569 break;
570 default:
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400571 ALOGI_IF(DEBUG, "Offset and size in bits unknown for format %d", format);
572 return Error::UNSUPPORTED;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400573 }
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400574 return Error::NONE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400575}
576
577static void grallocToStandardPlaneLayoutComponentType(uint32_t in,
578 std::vector<PlaneLayoutComponent> *components,
579 int32_t format) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500580 PlaneLayoutComponent comp;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400581 comp.offsetInBits = -1;
582 comp.sizeInBits = -1;
583
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500584 if (in & PLANE_COMPONENT_Y) {
585 comp.type = android::gralloc4::PlaneLayoutComponentType_Y;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400586 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
587 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500588 }
589
590 if (in & PLANE_COMPONENT_Cb) {
591 comp.type = android::gralloc4::PlaneLayoutComponentType_CB;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400592 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
593 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500594 }
595
596 if (in & PLANE_COMPONENT_Cr) {
597 comp.type = android::gralloc4::PlaneLayoutComponentType_CR;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400598 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
599 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500600 }
601
602 if (in & PLANE_COMPONENT_R) {
603 comp.type = android::gralloc4::PlaneLayoutComponentType_R;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400604 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
605 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500606 }
607
608 if (in & PLANE_COMPONENT_G) {
609 comp.type = android::gralloc4::PlaneLayoutComponentType_G;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400610 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
611 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500612 }
613
614 if (in & PLANE_COMPONENT_B) {
615 comp.type = android::gralloc4::PlaneLayoutComponentType_B;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400616 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
617 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500618 }
619
620 if (in & PLANE_COMPONENT_A) {
621 comp.type = android::gralloc4::PlaneLayoutComponentType_A;
Tharaga Balachandranecc58dc2020-06-25 11:54:58 -0400622 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
623 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500624 }
625
626 if (in & PLANE_COMPONENT_RAW) {
627 comp.type = qtigralloc::PlaneLayoutComponentType_Raw;
628 components->push_back(comp);
629 }
630
631 if (in & PLANE_COMPONENT_META) {
632 comp.type = qtigralloc::PlaneLayoutComponentType_Meta;
633 components->push_back(comp);
634 }
635}
636
Tharaga Balachandran95175bb2020-03-20 13:26:55 -0400637static Error getFormatLayout(private_handle_t *handle, std::vector<PlaneLayout> *out) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500638 std::vector<PlaneLayout> plane_info;
639 int plane_count = 0;
640 BufferInfo info(handle->unaligned_width, handle->unaligned_height, handle->format, handle->usage);
641
642 gralloc::PlaneLayoutInfo plane_layout[8] = {};
643 if (gralloc::IsYuvFormat(handle->format)) {
644 gralloc::GetYUVPlaneInfo(info, handle->format, handle->width, handle->height, handle->flags,
645 &plane_count, plane_layout);
646 } else if (gralloc::IsUncompressedRGBFormat(handle->format) ||
647 gralloc::IsCompressedRGBFormat(handle->format)) {
648 gralloc::GetRGBPlaneInfo(info, handle->format, handle->width, handle->height, handle->flags,
649 &plane_count, plane_layout);
650 } else {
651 return Error::BAD_BUFFER;
652 }
653 plane_info.resize(plane_count);
654 for (int i = 0; i < plane_count; i++) {
655 std::vector<PlaneLayoutComponent> components;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400656 grallocToStandardPlaneLayoutComponentType(plane_layout[i].component, &plane_info[i].components,
657 handle->format);
Yichi Chena8304132020-03-23 12:23:48 +0800658 plane_info[i].horizontalSubsampling = (1ull << plane_layout[i].h_subsampling);
659 plane_info[i].verticalSubsampling = (1ull << plane_layout[i].v_subsampling);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500660 plane_info[i].offsetInBytes = static_cast<int64_t>(plane_layout[i].offset);
661 plane_info[i].sampleIncrementInBits = static_cast<int64_t>(plane_layout[i].step * 8);
662 plane_info[i].strideInBytes = static_cast<int64_t>(plane_layout[i].stride_bytes);
663 plane_info[i].totalSizeInBytes = static_cast<int64_t>(plane_layout[i].size);
Tharaga Balachandran95175bb2020-03-20 13:26:55 -0400664 plane_info[i].widthInSamples = handle->unaligned_width;
665 plane_info[i].heightInSamples = handle->unaligned_height;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500666 }
667 *out = plane_info;
668 return Error::NONE;
669}
670
Naseer Ahmede69031e2016-11-22 20:05:16 -0500671BufferManager::BufferManager() : next_id_(0) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530672 handles_map_.clear();
Naseer Ahmede69031e2016-11-22 20:05:16 -0500673 allocator_ = new Allocator();
674 allocator_->Init();
675}
676
Naseer Ahmede36f2242017-12-01 15:33:56 -0500677BufferManager *BufferManager::GetInstance() {
678 static BufferManager *instance = new BufferManager();
679 return instance;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530680}
681
682BufferManager::~BufferManager() {
683 if (allocator_) {
684 delete allocator_;
685 }
686}
687
Tharaga Balachandran576571c2020-01-23 18:41:10 -0500688void BufferManager::SetGrallocDebugProperties(gralloc::GrallocProperties props) {
689 allocator_->SetProperties(props);
690 AdrenoMemInfo::GetInstance()->AdrenoSetProperties(props);
691}
692
Naseer Ahmede36f2242017-12-01 15:33:56 -0500693Error BufferManager::FreeBuffer(std::shared_ptr<Buffer> buf) {
Naseer Ahmede69031e2016-11-22 20:05:16 -0500694 auto hnd = buf->handle;
Naseer Ahmeda186b472017-07-07 18:50:49 -0400695 ALOGD_IF(DEBUG, "FreeBuffer handle:%p", hnd);
696
697 if (private_handle_t::validate(hnd) != 0) {
698 ALOGE("FreeBuffer: Invalid handle: %p", hnd);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500699 return Error::BAD_BUFFER;
Naseer Ahmeda186b472017-07-07 18:50:49 -0400700 }
701
Tharaga Balachandran40648032020-05-01 10:54:31 -0400702 auto meta_size = getMetaDataSize(buf->reserved_size);
703
Naseer Ahmede36f2242017-12-01 15:33:56 -0500704 if (allocator_->FreeBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset, hnd->fd,
705 buf->ion_handle_main) != 0) {
706 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530707 }
708
Tharaga Balachandran40648032020-05-01 10:54:31 -0400709 if (allocator_->FreeBuffer(reinterpret_cast<void *>(hnd->base_metadata),
710 static_cast<uint32_t>(meta_size), hnd->offset_metadata,
711 hnd->fd_metadata, buf->ion_handle_meta) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500712 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530713 }
714
Naseer Ahmede36f2242017-12-01 15:33:56 -0500715 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
Naseer Ahmed29a86dd2017-03-16 14:09:46 -0400716 handle->fd = -1;
717 handle->fd_metadata = -1;
Naseer Ahmed2f8f8d42017-06-09 18:17:26 -0400718 if (!(handle->flags & private_handle_t::PRIV_FLAGS_CLIENT_ALLOCATED)) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500719 delete handle;
Naseer Ahmed2f8f8d42017-06-09 18:17:26 -0400720 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500721 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530722}
723
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500724Error BufferManager::ValidateBufferSize(private_handle_t const *hnd, BufferInfo info) {
725 unsigned int size, alignedw, alignedh;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530726 info.format = GetImplDefinedFormat(info.usage, info.format);
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700727 int ret = GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh);
728 if (ret < 0) {
729 return Error::BAD_BUFFER;
730 }
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500731 auto ion_fd_size = static_cast<unsigned int>(lseek(hnd->fd, 0, SEEK_END));
732 if (size != ion_fd_size) {
733 return Error::BAD_VALUE;
734 }
735 return Error::NONE;
736}
737
Naseer Ahmede36f2242017-12-01 15:33:56 -0500738void BufferManager::RegisterHandleLocked(const private_handle_t *hnd, int ion_handle,
Naseer Ahmed378d8582017-03-28 21:56:08 -0400739 int ion_handle_meta) {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400740 auto buffer = std::make_shared<Buffer>(hnd, ion_handle, ion_handle_meta);
Tharaga Balachandran40648032020-05-01 10:54:31 -0400741
742 if (hnd->base_metadata) {
743 auto metadata = reinterpret_cast<MetaData_t *>(hnd->base_metadata);
744#ifdef METADATA_V2
745 buffer->reserved_size = metadata->reservedSize;
746 if (buffer->reserved_size > 0) {
747 buffer->reserved_region_ptr =
748 reinterpret_cast<void *>(hnd->base_metadata + sizeof(MetaData_t));
749 } else {
750 buffer->reserved_region_ptr = nullptr;
751 }
752#else
753 buffer->reserved_region_ptr = reinterpret_cast<void *>(&(metadata->reservedRegion.data));
754 buffer->reserved_size = metadata->reservedRegion.size;
755#endif
756 }
757
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400758 handles_map_.emplace(std::make_pair(hnd, buffer));
759}
760
Naseer Ahmede36f2242017-12-01 15:33:56 -0500761Error BufferManager::ImportHandleLocked(private_handle_t *hnd) {
Ramkumar Radhakrishnan372b5ee2018-09-20 13:17:36 -0700762 if (private_handle_t::validate(hnd) != 0) {
763 ALOGE("ImportHandleLocked: Invalid handle: %p", hnd);
764 return Error::BAD_BUFFER;
765 }
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400766 ALOGD_IF(DEBUG, "Importing handle:%p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400767 int ion_handle = allocator_->ImportBuffer(hnd->fd);
768 if (ion_handle < 0) {
769 ALOGE("Failed to import ion buffer: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500770 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400771 }
772 int ion_handle_meta = allocator_->ImportBuffer(hnd->fd_metadata);
773 if (ion_handle_meta < 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500774 ALOGE("Failed to import ion metadata buffer: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd,
775 hnd->id);
776 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400777 }
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500778 // Initialize members that aren't transported
779 hnd->size = static_cast<unsigned int>(lseek(hnd->fd, 0, SEEK_END));
780 hnd->offset = 0;
781 hnd->offset_metadata = 0;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400782 hnd->base = 0;
783 hnd->base_metadata = 0;
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500784 hnd->gpuaddr = 0;
Tharaga Balachandran40648032020-05-01 10:54:31 -0400785
786 if (validateAndMap(hnd)) {
787 ALOGE("Failed to map metadata: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd, hnd->id);
788 return Error::BAD_BUFFER;
789 }
790
Naseer Ahmed378d8582017-03-28 21:56:08 -0400791 RegisterHandleLocked(hnd, ion_handle, ion_handle_meta);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500792 return Error::NONE;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400793}
794
Naseer Ahmede36f2242017-12-01 15:33:56 -0500795std::shared_ptr<BufferManager::Buffer> BufferManager::GetBufferFromHandleLocked(
796 const private_handle_t *hnd) {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400797 auto it = handles_map_.find(hnd);
798 if (it != handles_map_.end()) {
799 return it->second;
800 } else {
801 return nullptr;
802 }
803}
804
Naseer Ahmede36f2242017-12-01 15:33:56 -0500805Error BufferManager::MapBuffer(private_handle_t const *handle) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530806 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400807 ALOGD_IF(DEBUG, "Map buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530808
809 hnd->base = 0;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530810 if (allocator_->MapBuffer(reinterpret_cast<void **>(&hnd->base), hnd->size, hnd->offset,
811 hnd->fd) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500812 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530813 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500814 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530815}
816
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500817Error BufferManager::IsBufferImported(const private_handle_t *hnd) {
818 std::lock_guard<std::mutex> lock(buffer_lock_);
819 auto buf = GetBufferFromHandleLocked(hnd);
820 if (buf != nullptr) {
821 return Error::NONE;
822 }
823 return Error::BAD_BUFFER;
824}
825
Naseer Ahmede36f2242017-12-01 15:33:56 -0500826Error BufferManager::RetainBuffer(private_handle_t const *hnd) {
Naseer Ahmed699b4572017-03-09 12:28:45 -0500827 ALOGD_IF(DEBUG, "Retain buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500828 auto err = Error::NONE;
Naseer Ahmed378d8582017-03-28 21:56:08 -0400829 std::lock_guard<std::mutex> lock(buffer_lock_);
830 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400831 if (buf != nullptr) {
832 buf->IncRef();
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530833 } else {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400834 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400835 err = ImportHandleLocked(handle);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530836 }
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400837 return err;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530838}
839
Naseer Ahmede36f2242017-12-01 15:33:56 -0500840Error BufferManager::ReleaseBuffer(private_handle_t const *hnd) {
Naseer Ahmeda186b472017-07-07 18:50:49 -0400841 ALOGD_IF(DEBUG, "Release buffer handle:%p", hnd);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400842 std::lock_guard<std::mutex> lock(buffer_lock_);
843 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400844 if (buf == nullptr) {
845 ALOGE("Could not find handle: %p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500846 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530847 } else {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400848 if (buf->DecRef()) {
849 handles_map_.erase(hnd);
850 // Unmap, close ion handle and close fd
Naseer Ahmede69031e2016-11-22 20:05:16 -0500851 FreeBuffer(buf);
852 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530853 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500854 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530855}
856
Naseer Ahmede36f2242017-12-01 15:33:56 -0500857Error BufferManager::LockBuffer(const private_handle_t *hnd, uint64_t usage) {
Naseer Ahmed378d8582017-03-28 21:56:08 -0400858 std::lock_guard<std::mutex> lock(buffer_lock_);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500859 auto err = Error::NONE;
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400860 ALOGD_IF(DEBUG, "LockBuffer buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530861
862 // If buffer is not meant for CPU return err
Naseer Ahmede36f2242017-12-01 15:33:56 -0500863 if (!CpuCanAccess(usage)) {
864 return Error::BAD_VALUE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530865 }
866
Naseer Ahmed378d8582017-03-28 21:56:08 -0400867 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400868 if (buf == nullptr) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500869 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530870 }
871
Naseer Ahmed67330702017-05-02 15:00:26 -0400872 if (hnd->base == 0) {
873 // we need to map for real
874 err = MapBuffer(hnd);
875 }
876
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530877 // Invalidate if CPU reads in software and there are non-CPU
878 // writers. No need to do this for the metadata buffer as it is
879 // only read/written in software.
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400880
881 // todo use handle here
Naseer Ahmede36f2242017-12-01 15:33:56 -0500882 if (err == Error::NONE && (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) &&
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530883 (hnd->flags & private_handle_t::PRIV_FLAGS_CACHED)) {
884 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
Rohit Kulkarni3ac98392017-10-20 12:04:34 -0700885 buf->ion_handle_main, CACHE_INVALIDATE, hnd->fd)) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500886 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530887 }
888 }
889
890 // Mark the buffer to be flushed after CPU write.
Naseer Ahmede36f2242017-12-01 15:33:56 -0500891 if (err == Error::NONE && CpuCanWrite(usage)) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530892 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
893 handle->flags |= private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
894 }
895
896 return err;
897}
Yichi Chena8304132020-03-23 12:23:48 +0800898
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500899Error BufferManager::FlushBuffer(const private_handle_t *handle) {
900 std::lock_guard<std::mutex> lock(buffer_lock_);
901 auto status = Error::NONE;
902
903 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
904 auto buf = GetBufferFromHandleLocked(hnd);
905 if (buf == nullptr) {
906 return Error::BAD_BUFFER;
907 }
908
909 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
910 buf->ion_handle_main, CACHE_CLEAN, hnd->fd) != 0) {
911 status = Error::BAD_BUFFER;
912 }
913
914 return status;
915}
916
917Error BufferManager::RereadBuffer(const private_handle_t *handle) {
918 std::lock_guard<std::mutex> lock(buffer_lock_);
919 auto status = Error::NONE;
920
921 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
922 auto buf = GetBufferFromHandleLocked(hnd);
923 if (buf == nullptr) {
924 return Error::BAD_BUFFER;
925 }
926
927 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
928 buf->ion_handle_main, CACHE_INVALIDATE, hnd->fd) != 0) {
929 status = Error::BAD_BUFFER;
930 }
931
932 return status;
933}
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530934
Naseer Ahmede36f2242017-12-01 15:33:56 -0500935Error BufferManager::UnlockBuffer(const private_handle_t *handle) {
Naseer Ahmed378d8582017-03-28 21:56:08 -0400936 std::lock_guard<std::mutex> lock(buffer_lock_);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500937 auto status = Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530938
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530939 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400940 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400941 if (buf == nullptr) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500942 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400943 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530944
945 if (hnd->flags & private_handle_t::PRIV_FLAGS_NEEDS_FLUSH) {
946 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
Rohit Kulkarni3ac98392017-10-20 12:04:34 -0700947 buf->ion_handle_main, CACHE_CLEAN, hnd->fd) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500948 status = Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530949 }
950 hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
Rohit Kulkarnib20abe72018-03-13 16:55:10 -0700951 } else {
952 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
953 buf->ion_handle_main, CACHE_READ_DONE, hnd->fd) != 0) {
954 status = Error::BAD_BUFFER;
955 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530956 }
957
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530958 return status;
959}
960
Naseer Ahmede36f2242017-12-01 15:33:56 -0500961Error BufferManager::AllocateBuffer(const BufferDescriptor &descriptor, buffer_handle_t *handle,
Tharaga Balachandranab150ab2019-09-26 19:17:58 -0400962 unsigned int bufferSize, bool testAlloc) {
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400963 if (!handle)
Naseer Ahmede36f2242017-12-01 15:33:56 -0500964 return Error::BAD_BUFFER;
965 std::lock_guard<std::mutex> buffer_lock(buffer_lock_);
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400966
Naseer Ahmede36f2242017-12-01 15:33:56 -0500967 uint64_t usage = descriptor.GetUsage();
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530968 int format = GetImplDefinedFormat(usage, descriptor.GetFormat());
Naseer Ahmedbaa39c52017-03-27 14:00:07 -0400969 uint32_t layer_count = descriptor.GetLayerCount();
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400970
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400971 unsigned int size;
972 unsigned int alignedw, alignedh;
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700973 int err = 0;
Naseer Ahmed95dc2882017-07-26 18:12:12 -0400974
975 int buffer_type = GetBufferType(format);
Saurabh Shah14c8e5b2017-04-07 10:37:23 -0700976 BufferInfo info = GetBufferInfo(descriptor);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500977 info.format = format;
Saurabh Dubey70957382018-05-15 16:05:32 +0530978 info.layer_count = layer_count;
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400979
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530980 GraphicsMetadata graphics_metadata = {};
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700981 err = GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh, &graphics_metadata);
982 if (err < 0) {
983 return Error::BAD_DESCRIPTOR;
984 }
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530985
Tharaga Balachandranab150ab2019-09-26 19:17:58 -0400986 if (testAlloc) {
987 return Error::NONE;
988 }
989
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530990 size = (bufferSize >= size) ? bufferSize : size;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530991 uint64_t flags = 0;
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400992 auto page_size = UINT(getpagesize());
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530993 AllocData data;
Naseer Ahmede36f2242017-12-01 15:33:56 -0500994 data.align = GetDataAlignment(format, usage);
Naseer Ahmedf8e9c432017-06-13 17:45:12 -0400995 data.size = size;
Naseer Ahmede36f2242017-12-01 15:33:56 -0500996 data.handle = (uintptr_t)handle;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530997 data.uncached = UseUncached(format, usage);
Naseer Ahmede69031e2016-11-22 20:05:16 -0500998
999 // Allocate buffer memory
Rohit Kulkarnib20abe72018-03-13 16:55:10 -07001000 err = allocator_->AllocateMem(&data, usage, format);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301001 if (err) {
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -07001002 ALOGE("gralloc failed to allocate err=%s format %d size %d WxH %dx%d usage %" PRIu64,
1003 strerror(-err), format, size, alignedw, alignedh, usage);
Naseer Ahmede36f2242017-12-01 15:33:56 -05001004 return Error::NO_RESOURCES;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301005 }
1006
Naseer Ahmede69031e2016-11-22 20:05:16 -05001007 // Allocate memory for MetaData
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301008 AllocData e_data;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001009 e_data.size = static_cast<unsigned int>(getMetaDataSize(descriptor.GetReservedSize()));
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301010 e_data.handle = data.handle;
Naseer Ahmede69031e2016-11-22 20:05:16 -05001011 e_data.align = page_size;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301012
Rohit Kulkarnib20abe72018-03-13 16:55:10 -07001013 err = allocator_->AllocateMem(&e_data, 0, 0);
Naseer Ahmede69031e2016-11-22 20:05:16 -05001014 if (err) {
1015 ALOGE("gralloc failed to allocate metadata error=%s", strerror(-err));
Naseer Ahmede36f2242017-12-01 15:33:56 -05001016 return Error::NO_RESOURCES;
Naseer Ahmede69031e2016-11-22 20:05:16 -05001017 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301018
Naseer Ahmede36f2242017-12-01 15:33:56 -05001019 flags = GetHandleFlags(format, usage);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301020 flags |= data.alloc_type;
1021
1022 // Create handle
Naseer Ahmede36f2242017-12-01 15:33:56 -05001023 private_handle_t *hnd = new private_handle_t(
Saurabh Dubey48b757d2018-05-24 19:13:53 +05301024 data.fd, e_data.fd, INT(flags), INT(alignedw), INT(alignedh), descriptor.GetWidth(),
Naseer Ahmede36f2242017-12-01 15:33:56 -05001025 descriptor.GetHeight(), format, buffer_type, data.size, usage);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301026
Naseer Ahmede69031e2016-11-22 20:05:16 -05001027 hnd->id = ++next_id_;
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -04001028 hnd->base = 0;
1029 hnd->base_metadata = 0;
Naseer Ahmedbaa39c52017-03-27 14:00:07 -04001030 hnd->layer_count = layer_count;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001031
Saurabh Dubeyefd7f9e2018-06-15 18:00:02 +05301032 bool use_adreno_for_size = CanUseAdrenoForSize(buffer_type, usage);
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +05301033 if (use_adreno_for_size) {
Praveen Chavancbaa5362018-07-06 18:19:46 -07001034 setMetaDataAndUnmap(hnd, SET_GRAPHICS_METADATA, reinterpret_cast<void *>(&graphics_metadata));
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +05301035 }
1036
Tharaga Balachandran40648032020-05-01 10:54:31 -04001037#ifdef METADATA_V2
1038 auto error = validateAndMap(hnd, descriptor.GetReservedSize());
1039#else
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001040 auto error = validateAndMap(hnd);
Tharaga Balachandran40648032020-05-01 10:54:31 -04001041#endif
1042
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001043 if (error != 0) {
1044 ALOGE("validateAndMap failed");
1045 return Error::BAD_BUFFER;
1046 }
1047 auto metadata = reinterpret_cast<MetaData_t *>(hnd->base_metadata);
Yichi Chena8304132020-03-23 12:23:48 +08001048 auto nameLength = std::min(descriptor.GetName().size(), size_t(MAX_NAME_LEN - 1));
1049 nameLength = descriptor.GetName().copy(metadata->name, nameLength);
1050 metadata->name[nameLength] = '\0';
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001051
Tharaga Balachandran40648032020-05-01 10:54:31 -04001052#ifdef METADATA_V2
1053 metadata->reservedSize = descriptor.GetReservedSize();
1054#else
1055 metadata->reservedRegion.size =
1056 static_cast<uint32_t>(std::min(descriptor.GetReservedSize(), (uint64_t)RESERVED_REGION_SIZE));
1057#endif
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001058 metadata->crop.top = 0;
1059 metadata->crop.left = 0;
1060 metadata->crop.right = hnd->width;
1061 metadata->crop.bottom = hnd->height;
1062
Tharaga Balachandran40648032020-05-01 10:54:31 -04001063 unmapAndReset(hnd, descriptor.GetReservedSize());
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001064
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301065 *handle = hnd;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001066
Naseer Ahmed378d8582017-03-28 21:56:08 -04001067 RegisterHandleLocked(hnd, data.ion_handle, e_data.ion_handle);
Naseer Ahmed699b4572017-03-09 12:28:45 -05001068 ALOGD_IF(DEBUG, "Allocated buffer handle: %p id: %" PRIu64, hnd, hnd->id);
1069 if (DEBUG) {
1070 private_handle_t::Dump(hnd);
1071 }
Naseer Ahmede36f2242017-12-01 15:33:56 -05001072 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301073}
1074
Naseer Ahmede36f2242017-12-01 15:33:56 -05001075Error BufferManager::Dump(std::ostringstream *os) {
Uday Kiran Pichikab58d8842018-04-10 15:37:35 +05301076 std::lock_guard<std::mutex> buffer_lock(buffer_lock_);
Naseer Ahmeddc918132017-03-07 15:25:14 -05001077 for (auto it : handles_map_) {
1078 auto buf = it.second;
1079 auto hnd = buf->handle;
1080 *os << "handle id: " << std::setw(4) << hnd->id;
Naseer Ahmede36f2242017-12-01 15:33:56 -05001081 *os << " fd: " << std::setw(3) << hnd->fd;
1082 *os << " fd_meta: " << std::setw(3) << hnd->fd_metadata;
1083 *os << " wxh: " << std::setw(4) << hnd->width << " x " << std::setw(4) << hnd->height;
1084 *os << " uwxuh: " << std::setw(4) << hnd->unaligned_width << " x ";
1085 *os << std::setw(4) << hnd->unaligned_height;
1086 *os << " size: " << std::setw(9) << hnd->size;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001087 *os << std::hex << std::setfill('0');
Naseer Ahmede36f2242017-12-01 15:33:56 -05001088 *os << " priv_flags: "
1089 << "0x" << std::setw(8) << hnd->flags;
1090 *os << " usage: "
1091 << "0x" << std::setw(8) << hnd->usage;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001092 // TODO(user): get format string from qdutils
Naseer Ahmede36f2242017-12-01 15:33:56 -05001093 *os << " format: "
1094 << "0x" << std::setw(8) << hnd->format;
1095 *os << std::dec << std::setfill(' ') << std::endl;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001096 }
Naseer Ahmede36f2242017-12-01 15:33:56 -05001097 return Error::NONE;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001098}
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001099
1100// Get list of private handles in handles_map_
1101Error BufferManager::GetAllHandles(std::vector<const private_handle_t *> *out_handle_list) {
1102 std::lock_guard<std::mutex> lock(buffer_lock_);
1103 if (handles_map_.empty()) {
1104 return Error::NO_RESOURCES;
1105 }
1106 out_handle_list->reserve(handles_map_.size());
1107 for (auto handle : handles_map_) {
1108 out_handle_list->push_back(handle.first);
1109 }
1110 return Error::NONE;
1111}
Yichi Chena8304132020-03-23 12:23:48 +08001112
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001113Error BufferManager::GetReservedRegion(private_handle_t *handle, void **reserved_region,
1114 uint64_t *reserved_region_size) {
1115 std::lock_guard<std::mutex> lock(buffer_lock_);
1116 if (!handle)
1117 return Error::BAD_BUFFER;
1118
1119 auto buf = GetBufferFromHandleLocked(handle);
1120 if (buf == nullptr)
1121 return Error::BAD_BUFFER;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001122 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001123 return Error::BAD_BUFFER;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001124 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001125
Tharaga Balachandran40648032020-05-01 10:54:31 -04001126 *reserved_region = buf->reserved_region_ptr;
1127 *reserved_region_size = buf->reserved_size;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001128
1129 return Error::NONE;
1130}
1131
1132Error BufferManager::GetMetadata(private_handle_t *handle, int64_t metadatatype_value,
1133 hidl_vec<uint8_t> *out) {
1134 std::lock_guard<std::mutex> lock(buffer_lock_);
1135 if (!handle)
1136 return Error::BAD_BUFFER;
1137 auto buf = GetBufferFromHandleLocked(handle);
1138 if (buf == nullptr)
1139 return Error::BAD_BUFFER;
1140
Tharaga Balachandran40648032020-05-01 10:54:31 -04001141 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001142 return Error::BAD_BUFFER;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001143 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001144
1145 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1146
1147 Error error = Error::NONE;
1148 switch (metadatatype_value) {
1149 case (int64_t)StandardMetadataType::BUFFER_ID:
1150 android::gralloc4::encodeBufferId((uint64_t)handle->id, out);
1151 break;
1152 case (int64_t)StandardMetadataType::NAME: {
1153 std::string name(metadata->name);
1154 android::gralloc4::encodeName(name, out);
1155 break;
1156 }
1157 case (int64_t)StandardMetadataType::WIDTH:
1158 android::gralloc4::encodeWidth((uint64_t)handle->unaligned_width, out);
1159 break;
1160 case (int64_t)StandardMetadataType::HEIGHT:
1161 android::gralloc4::encodeHeight((uint64_t)handle->unaligned_height, out);
1162 break;
1163 case (int64_t)StandardMetadataType::LAYER_COUNT:
1164 android::gralloc4::encodeLayerCount((uint64_t)handle->layer_count, out);
1165 break;
1166 case (int64_t)StandardMetadataType::PIXEL_FORMAT_REQUESTED:
1167 // TODO(tbalacha): need to return IMPLEMENTATION_DEFINED,
1168 // which wouldn't be known from private_handle_t
1169 android::gralloc4::encodePixelFormatRequested((PixelFormat)handle->format, out);
1170 break;
1171 case (int64_t)StandardMetadataType::PIXEL_FORMAT_FOURCC: {
1172 uint32_t drm_format = 0;
1173 uint64_t drm_format_modifier = 0;
1174 GetDRMFormat(handle->format, handle->flags, &drm_format, &drm_format_modifier);
1175 android::gralloc4::encodePixelFormatFourCC(drm_format, out);
1176 break;
1177 }
1178 case (int64_t)StandardMetadataType::PIXEL_FORMAT_MODIFIER: {
1179 uint32_t drm_format = 0;
1180 uint64_t drm_format_modifier = 0;
1181 GetDRMFormat(handle->format, handle->flags, &drm_format, &drm_format_modifier);
1182 android::gralloc4::encodePixelFormatModifier(drm_format_modifier, out);
1183 break;
1184 }
1185 case (int64_t)StandardMetadataType::USAGE:
1186 android::gralloc4::encodeUsage((uint64_t)handle->usage, out);
1187 break;
1188 case (int64_t)StandardMetadataType::ALLOCATION_SIZE:
1189 android::gralloc4::encodeAllocationSize((uint64_t)handle->size, out);
1190 break;
1191 case (int64_t)StandardMetadataType::PROTECTED_CONTENT: {
1192 uint64_t protected_content = (handle->flags & qtigralloc::PRIV_FLAGS_SECURE_BUFFER) ? 1 : 0;
1193 android::gralloc4::encodeProtectedContent(protected_content, out);
1194 break;
1195 }
1196 case (int64_t)StandardMetadataType::CHROMA_SITING:
Tharaga Balachandran676e3092020-04-27 15:30:03 -04001197 android::gralloc4::encodeChromaSiting(android::gralloc4::ChromaSiting_None, out);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001198 break;
1199 case (int64_t)StandardMetadataType::DATASPACE:
Tharaga Balachandran40648032020-05-01 10:54:31 -04001200#ifdef METADATA_V2
1201 if (metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)]) {
1202#endif
1203 Dataspace dataspace;
1204 colorMetadataToDataspace(metadata->color, &dataspace);
1205 android::gralloc4::encodeDataspace(dataspace, out);
1206#ifdef METADATA_V2
1207 } else {
1208 android::gralloc4::encodeDataspace(Dataspace::UNKNOWN, out);
1209 }
1210#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001211 break;
1212 case (int64_t)StandardMetadataType::INTERLACED:
Tharaga Balachandran4629b4e2020-05-13 17:18:25 -04001213 if (metadata->interlaced > 0) {
1214 android::gralloc4::encodeInterlaced(qtigralloc::Interlaced_Qti, out);
1215 } else {
1216 android::gralloc4::encodeInterlaced(android::gralloc4::Interlaced_None, out);
1217 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001218 break;
1219 case (int64_t)StandardMetadataType::COMPRESSION:
1220 if (handle->flags & qtigralloc::PRIV_FLAGS_UBWC_ALIGNED ||
1221 handle->flags & qtigralloc::PRIV_FLAGS_UBWC_ALIGNED_PI) {
1222 android::gralloc4::encodeCompression(qtigralloc::Compression_QtiUBWC, out);
1223 } else {
1224 android::gralloc4::encodeCompression(android::gralloc4::Compression_None, out);
1225 }
1226 break;
1227 case (int64_t)StandardMetadataType::PLANE_LAYOUTS: {
1228 std::vector<PlaneLayout> plane_layouts;
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001229 getFormatLayout(handle, &plane_layouts);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001230 android::gralloc4::encodePlaneLayouts(plane_layouts, out);
1231 break;
1232 }
1233 case (int64_t)StandardMetadataType::BLEND_MODE:
1234 android::gralloc4::encodeBlendMode((BlendMode)metadata->blendMode, out);
1235 break;
1236 case (int64_t)StandardMetadataType::SMPTE2086: {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001237 if (metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled) {
1238 Smpte2086 mastering_display_values;
1239 mastering_display_values.primaryRed = {
1240 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][0]) /
1241 50000.0f,
1242 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][1]) /
1243 50000.0f};
1244 mastering_display_values.primaryGreen = {
1245 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][0]) /
1246 50000.0f,
1247 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][1]) /
1248 50000.0f};
1249 mastering_display_values.primaryBlue = {
1250 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][0]) /
1251 50000.0f,
1252 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][1]) /
1253 50000.0f};
1254 mastering_display_values.whitePoint = {
1255 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.whitePoint[0]) /
1256 50000.0f,
1257 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.whitePoint[1]) /
1258 50000.0f};
1259 mastering_display_values.maxLuminance =
1260 static_cast<float>(metadata->color.masteringDisplayInfo.maxDisplayLuminance);
1261 mastering_display_values.minLuminance =
1262 static_cast<float>(metadata->color.masteringDisplayInfo.minDisplayLuminance) / 10000.0f;
1263 android::gralloc4::encodeSmpte2086(mastering_display_values, out);
1264 } else {
1265 android::gralloc4::encodeSmpte2086(std::nullopt, out);
1266 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001267 break;
1268 }
1269 case (int64_t)StandardMetadataType::CTA861_3: {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001270 if (metadata->color.contentLightLevel.lightLevelSEIEnabled) {
1271 Cta861_3 content_light_level;
1272 content_light_level.maxContentLightLevel =
1273 static_cast<float>(metadata->color.contentLightLevel.maxContentLightLevel);
1274 content_light_level.maxFrameAverageLightLevel =
1275 static_cast<float>(metadata->color.contentLightLevel.minPicAverageLightLevel) /
1276 10000.0f;
1277 android::gralloc4::encodeCta861_3(content_light_level, out);
1278 } else {
1279 android::gralloc4::encodeCta861_3(std::nullopt, out);
1280 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001281 break;
1282 }
1283 case (int64_t)StandardMetadataType::SMPTE2094_40: {
Tharaga Balachandran2c9873c2020-03-10 12:49:18 -04001284 if (metadata->color.dynamicMetaDataValid &&
1285 metadata->color.dynamicMetaDataLen <= HDR_DYNAMIC_META_DATA_SZ) {
Yichi Chena8304132020-03-23 12:23:48 +08001286 std::vector<uint8_t> dynamic_metadata_payload;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001287 dynamic_metadata_payload.resize(metadata->color.dynamicMetaDataLen);
Yichi Chena8304132020-03-23 12:23:48 +08001288 dynamic_metadata_payload.assign(
1289 metadata->color.dynamicMetaDataPayload,
1290 metadata->color.dynamicMetaDataPayload + metadata->color.dynamicMetaDataLen);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001291 android::gralloc4::encodeSmpte2094_40(dynamic_metadata_payload, out);
1292 } else {
1293 android::gralloc4::encodeSmpte2094_40(std::nullopt, out);
1294 }
1295 break;
1296 }
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001297 case (int64_t)StandardMetadataType::CROP: {
1298 // Crop is the same for all planes
1299 std::vector<Rect> out_crop = {{metadata->crop.left, metadata->crop.top, metadata->crop.right,
1300 metadata->crop.bottom}};
1301 android::gralloc4::encodeCrop(out_crop, out);
1302 break;
1303 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001304 case QTI_VT_TIMESTAMP:
1305 android::gralloc4::encodeUint64(qtigralloc::MetadataType_VTTimestamp, metadata->vtTimeStamp,
1306 out);
1307 break;
1308 case QTI_COLOR_METADATA:
1309 qtigralloc::encodeColorMetadata(metadata->color, out);
1310 break;
1311 case QTI_PP_PARAM_INTERLACED:
1312 android::gralloc4::encodeInt32(qtigralloc::MetadataType_PPParamInterlaced,
1313 metadata->interlaced, out);
1314 break;
1315 case QTI_VIDEO_PERF_MODE:
1316 android::gralloc4::encodeUint32(qtigralloc::MetadataType_VideoPerfMode,
1317 metadata->isVideoPerfMode, out);
1318 break;
1319 case QTI_GRAPHICS_METADATA:
1320 qtigralloc::encodeGraphicsMetadata(metadata->graphics_metadata, out);
1321 break;
1322 case QTI_UBWC_CR_STATS_INFO:
1323 qtigralloc::encodeUBWCStats(metadata->ubwcCRStats, out);
1324 break;
1325 case QTI_REFRESH_RATE:
1326 android::gralloc4::encodeFloat(qtigralloc::MetadataType_RefreshRate, metadata->refreshrate,
1327 out);
1328 break;
1329 case QTI_MAP_SECURE_BUFFER:
1330 android::gralloc4::encodeInt32(qtigralloc::MetadataType_MapSecureBuffer,
1331 metadata->mapSecureBuffer, out);
1332 break;
1333 case QTI_LINEAR_FORMAT:
1334 android::gralloc4::encodeUint32(qtigralloc::MetadataType_LinearFormat, metadata->linearFormat,
1335 out);
1336 break;
1337 case QTI_SINGLE_BUFFER_MODE:
1338 android::gralloc4::encodeUint32(qtigralloc::MetadataType_SingleBufferMode,
1339 metadata->isSingleBufferMode, out);
1340 break;
1341 case QTI_CVP_METADATA:
1342 qtigralloc::encodeCVPMetadata(metadata->cvpMetadata, out);
1343 break;
1344 case QTI_VIDEO_HISTOGRAM_STATS:
1345 qtigralloc::encodeVideoHistogramMetadata(metadata->video_histogram_stats, out);
1346 break;
1347 case QTI_FD:
1348 android::gralloc4::encodeInt32(qtigralloc::MetadataType_FD, handle->fd, out);
1349 break;
1350 case QTI_PRIVATE_FLAGS:
1351 android::gralloc4::encodeInt32(qtigralloc::MetadataType_PrivateFlags, handle->flags, out);
1352 break;
Tharaga Balachandran70b03c72020-03-10 14:00:15 -04001353 case QTI_ALIGNED_WIDTH_IN_PIXELS:
1354 android::gralloc4::encodeUint32(qtigralloc::MetadataType_AlignedWidthInPixels, handle->width,
1355 out);
1356 break;
1357 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
1358 android::gralloc4::encodeUint32(qtigralloc::MetadataType_AlignedHeightInPixels,
1359 handle->height, out);
1360 break;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001361#ifdef METADATA_V2
1362 case QTI_STANDARD_METADATA_STATUS:
1363 qtigralloc::encodeMetadataState(metadata->isStandardMetadataSet, out);
1364 break;
1365 case QTI_VENDOR_METADATA_STATUS:
1366 qtigralloc::encodeMetadataState(metadata->isVendorMetadataSet, out);
1367 break;
1368#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001369 default:
1370 error = Error::UNSUPPORTED;
1371 }
1372
1373 return error;
1374}
1375
1376Error BufferManager::SetMetadata(private_handle_t *handle, int64_t metadatatype_value,
1377 hidl_vec<uint8_t> in) {
1378 std::lock_guard<std::mutex> lock(buffer_lock_);
1379 if (!handle)
1380 return Error::BAD_BUFFER;
1381
1382 auto buf = GetBufferFromHandleLocked(handle);
1383 if (buf == nullptr)
1384 return Error::BAD_BUFFER;
1385
Tharaga Balachandran40648032020-05-01 10:54:31 -04001386 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001387 return Error::BAD_BUFFER;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001388 }
Tharaga Balachandran96f24d02020-03-31 12:46:02 -04001389 if (in.size() == 0) {
1390 return Error::UNSUPPORTED;
1391 }
1392
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001393 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1394
Tharaga Balachandran40648032020-05-01 10:54:31 -04001395#ifdef METADATA_V2
1396 // By default, set these to true
1397 // Reset to false for special cases below
1398 if (IS_VENDOR_METADATA_TYPE(metadatatype_value)) {
1399 metadata->isVendorMetadataSet[GET_VENDOR_METADATA_STATUS_INDEX(metadatatype_value)] = true;
1400 } else {
1401 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] = true;
1402 }
1403#endif
1404
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001405 switch (metadatatype_value) {
1406 // These are constant (unchanged after allocation)
1407 case (int64_t)StandardMetadataType::BUFFER_ID:
1408 case (int64_t)StandardMetadataType::NAME:
1409 case (int64_t)StandardMetadataType::WIDTH:
1410 case (int64_t)StandardMetadataType::HEIGHT:
1411 case (int64_t)StandardMetadataType::LAYER_COUNT:
1412 case (int64_t)StandardMetadataType::PIXEL_FORMAT_REQUESTED:
1413 case (int64_t)StandardMetadataType::USAGE:
1414 return Error::BAD_VALUE;
1415 case (int64_t)StandardMetadataType::PIXEL_FORMAT_FOURCC:
1416 case (int64_t)StandardMetadataType::PIXEL_FORMAT_MODIFIER:
1417 case (int64_t)StandardMetadataType::PROTECTED_CONTENT:
1418 case (int64_t)StandardMetadataType::ALLOCATION_SIZE:
1419 case (int64_t)StandardMetadataType::PLANE_LAYOUTS:
1420 case (int64_t)StandardMetadataType::CHROMA_SITING:
1421 case (int64_t)StandardMetadataType::INTERLACED:
1422 case (int64_t)StandardMetadataType::COMPRESSION:
1423 case QTI_FD:
1424 case QTI_PRIVATE_FLAGS:
Tharaga Balachandran70b03c72020-03-10 14:00:15 -04001425 case QTI_ALIGNED_WIDTH_IN_PIXELS:
1426 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001427 return Error::UNSUPPORTED;
1428 case (int64_t)StandardMetadataType::DATASPACE:
1429 Dataspace dataspace;
1430 android::gralloc4::decodeDataspace(in, &dataspace);
1431 dataspaceToColorMetadata(dataspace, &metadata->color);
1432 break;
1433 case (int64_t)StandardMetadataType::BLEND_MODE:
1434 BlendMode mode;
1435 android::gralloc4::decodeBlendMode(in, &mode);
1436 metadata->blendMode = (int32_t)mode;
1437 break;
1438 case (int64_t)StandardMetadataType::SMPTE2086: {
1439 std::optional<Smpte2086> mastering_display_values;
1440 android::gralloc4::decodeSmpte2086(in, &mastering_display_values);
1441 if (mastering_display_values != std::nullopt) {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001442 metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = true;
1443
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001444 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][0] =
1445 static_cast<uint32_t>(mastering_display_values->primaryRed.x * 50000.0f);
1446 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][1] =
1447 static_cast<uint32_t>(mastering_display_values->primaryRed.y * 50000.0f);
1448
1449 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][0] =
1450 static_cast<uint32_t>(mastering_display_values->primaryGreen.x * 50000.0f);
1451 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][1] =
1452 static_cast<uint32_t>(mastering_display_values->primaryGreen.y * 50000.0f);
1453
1454 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][0] =
1455 static_cast<uint32_t>(mastering_display_values->primaryBlue.x * 50000.0f);
1456 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][1] =
1457 static_cast<uint32_t>(mastering_display_values->primaryBlue.y * 50000.0f);
1458
1459 metadata->color.masteringDisplayInfo.primaries.whitePoint[0] =
1460 static_cast<uint32_t>(mastering_display_values->whitePoint.x * 50000.0f);
1461 metadata->color.masteringDisplayInfo.primaries.whitePoint[1] =
1462 static_cast<uint32_t>(mastering_display_values->whitePoint.y * 50000.0f);
1463
1464 metadata->color.masteringDisplayInfo.maxDisplayLuminance =
1465 static_cast<uint32_t>(mastering_display_values->maxLuminance);
1466 metadata->color.masteringDisplayInfo.minDisplayLuminance =
1467 static_cast<uint32_t>(mastering_display_values->minLuminance * 10000.0f);
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001468 } else {
Tharaga Balachandran40648032020-05-01 10:54:31 -04001469#ifdef METADATA_V2
1470 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1471 false;
1472#endif
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001473 metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001474 }
1475 break;
1476 }
1477 case (int64_t)StandardMetadataType::CTA861_3: {
1478 std::optional<Cta861_3> content_light_level;
1479 android::gralloc4::decodeCta861_3(in, &content_light_level);
1480 if (content_light_level != std::nullopt) {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001481 metadata->color.contentLightLevel.lightLevelSEIEnabled = true;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001482 metadata->color.contentLightLevel.maxContentLightLevel =
1483 static_cast<uint32_t>(content_light_level->maxContentLightLevel);
1484 metadata->color.contentLightLevel.minPicAverageLightLevel =
1485 static_cast<uint32_t>(content_light_level->maxFrameAverageLightLevel * 10000.0f);
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001486 } else {
Tharaga Balachandran40648032020-05-01 10:54:31 -04001487#ifdef METADATA_V2
1488 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1489 false;
1490#endif
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001491 metadata->color.contentLightLevel.lightLevelSEIEnabled = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001492 }
1493 break;
1494 }
1495 case (int64_t)StandardMetadataType::SMPTE2094_40: {
1496 std::optional<std::vector<uint8_t>> dynamic_metadata_payload;
1497 android::gralloc4::decodeSmpte2094_40(in, &dynamic_metadata_payload);
1498 if (dynamic_metadata_payload != std::nullopt) {
Yichi Chena8304132020-03-23 12:23:48 +08001499 if (dynamic_metadata_payload->size() > HDR_DYNAMIC_META_DATA_SZ)
1500 return Error::BAD_VALUE;
1501
1502 metadata->color.dynamicMetaDataLen = static_cast<uint32_t>(dynamic_metadata_payload->size());
1503 std::copy(dynamic_metadata_payload->begin(), dynamic_metadata_payload->end(),
1504 metadata->color.dynamicMetaDataPayload);
1505 metadata->color.dynamicMetaDataValid = true;
Tharaga Balachandranf5861d52020-03-23 16:00:18 -04001506 } else {
1507 // Reset metadata by passing in std::nullopt
Tharaga Balachandran40648032020-05-01 10:54:31 -04001508#ifdef METADATA_V2
1509 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1510 false;
1511#endif
Tharaga Balachandranf5861d52020-03-23 16:00:18 -04001512 metadata->color.dynamicMetaDataValid = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001513 }
1514 break;
1515 }
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001516 case (int64_t)StandardMetadataType::CROP: {
1517 std::vector<Rect> in_crop;
1518 android::gralloc4::decodeCrop(in, &in_crop);
1519 if (in_crop.size() != 1)
1520 return Error::UNSUPPORTED;
1521
1522 metadata->crop.left = in_crop[0].left;
1523 metadata->crop.top = in_crop[0].top;
1524 metadata->crop.right = in_crop[0].right;
1525 metadata->crop.bottom = in_crop[0].bottom;
1526 break;
1527 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001528 case QTI_VT_TIMESTAMP:
1529 android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp, in,
1530 &metadata->vtTimeStamp);
1531 break;
1532 case QTI_COLOR_METADATA:
1533 ColorMetaData color;
1534 qtigralloc::decodeColorMetadata(in, &color);
1535 metadata->color = color;
1536 break;
1537 case QTI_PP_PARAM_INTERLACED:
1538 android::gralloc4::decodeInt32(qtigralloc::MetadataType_PPParamInterlaced, in,
1539 &metadata->interlaced);
1540 break;
1541 case QTI_VIDEO_PERF_MODE:
1542 android::gralloc4::decodeUint32(qtigralloc::MetadataType_VideoPerfMode, in,
1543 &metadata->isVideoPerfMode);
1544 break;
1545 case QTI_GRAPHICS_METADATA:
1546 qtigralloc::decodeGraphicsMetadata(in, &metadata->graphics_metadata);
1547 break;
1548 case QTI_UBWC_CR_STATS_INFO:
1549 qtigralloc::decodeUBWCStats(in, &metadata->ubwcCRStats[0]);
1550 break;
1551 case QTI_REFRESH_RATE:
1552 android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate, in,
1553 &metadata->refreshrate);
1554 break;
1555 case QTI_MAP_SECURE_BUFFER:
1556 android::gralloc4::decodeInt32(qtigralloc::MetadataType_MapSecureBuffer, in,
1557 &metadata->mapSecureBuffer);
1558 break;
1559 case QTI_LINEAR_FORMAT:
1560 android::gralloc4::decodeUint32(qtigralloc::MetadataType_LinearFormat, in,
1561 &metadata->linearFormat);
1562 break;
1563 case QTI_SINGLE_BUFFER_MODE:
1564 android::gralloc4::decodeUint32(qtigralloc::MetadataType_SingleBufferMode, in,
1565 &metadata->isSingleBufferMode);
1566 break;
1567 case QTI_CVP_METADATA:
1568 qtigralloc::decodeCVPMetadata(in, &metadata->cvpMetadata);
1569 break;
1570 case QTI_VIDEO_HISTOGRAM_STATS:
1571 qtigralloc::decodeVideoHistogramMetadata(in, &metadata->video_histogram_stats);
1572 break;
1573 default:
Tharaga Balachandran40648032020-05-01 10:54:31 -04001574#ifdef METADATA_V2
1575 if (IS_VENDOR_METADATA_TYPE(metadatatype_value)) {
1576 metadata->isVendorMetadataSet[GET_VENDOR_METADATA_STATUS_INDEX(metadatatype_value)] = false;
1577 } else {
1578 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1579 false;
1580 }
1581#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001582 return Error::BAD_VALUE;
1583 }
Tharaga Balachandran40648032020-05-01 10:54:31 -04001584
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001585 return Error::NONE;
1586}
1587
Naseer Ahmede36f2242017-12-01 15:33:56 -05001588} // namespace gralloc