blob: a557886c82b40bbf6405ed6bb3d08918464c9de0 [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;
Saurabh Shah14c8e5b2017-04-07 10:37:23 -070054static BufferInfo GetBufferInfo(const BufferDescriptor &descriptor) {
55 return BufferInfo(descriptor.GetWidth(), descriptor.GetHeight(), descriptor.GetFormat(),
Naseer Ahmede36f2242017-12-01 15:33:56 -050056 descriptor.GetUsage());
Saurabh Shah14c8e5b2017-04-07 10:37:23 -070057}
58
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050059// duplicate from qdmetadata
60static uint32_t getMetaDataSize() {
61 return static_cast<uint32_t>(ROUND_UP_PAGESIZE(sizeof(MetaData_t)));
62}
63
64static int validateAndMap(private_handle_t *handle) {
65 if (private_handle_t::validate(handle)) {
66 ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
67 return -1;
68 }
69 if (handle->fd_metadata < 0) {
70 // Silently return, metadata cannot be used
71 return -1;
72 }
73
74 if (!handle->base_metadata) {
75 auto size = getMetaDataSize();
76 void *base = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, handle->fd_metadata, 0);
77 if (base == reinterpret_cast<void *>(MAP_FAILED)) {
78 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s", __func__, handle,
79 handle->fd_metadata, strerror(errno));
80
81 return -1;
82 }
83 handle->base_metadata = (uintptr_t)base;
84 }
85 return 0;
86}
87
88static void unmapAndReset(private_handle_t *handle) {
89 if (private_handle_t::validate(handle) == 0 && handle->base_metadata) {
90 munmap(reinterpret_cast<void *>(handle->base_metadata), getMetaDataSize());
91 handle->base_metadata = 0;
92 }
93}
94
95static Error dataspaceToColorMetadata(Dataspace dataspace, ColorMetaData *color_metadata) {
96 ColorMetaData out;
97 uint32_t primaries = (uint32_t)dataspace & (uint32_t)Dataspace::STANDARD_MASK;
98 uint32_t transfer = (uint32_t)dataspace & (uint32_t)Dataspace::TRANSFER_MASK;
99 uint32_t range = (uint32_t)dataspace & (uint32_t)Dataspace::RANGE_MASK;
100
101 switch (primaries) {
102 case (uint32_t)Dataspace::STANDARD_BT709:
103 out.colorPrimaries = ColorPrimaries_BT709_5;
104 break;
105 // TODO(tbalacha): verify this is equivalent
106 case (uint32_t)Dataspace::STANDARD_BT470M:
107 out.colorPrimaries = ColorPrimaries_BT470_6M;
108 break;
109 case (uint32_t)Dataspace::STANDARD_BT601_625:
110 case (uint32_t)Dataspace::STANDARD_BT601_625_UNADJUSTED:
111 out.colorPrimaries = ColorPrimaries_BT601_6_625;
112 break;
113 case (uint32_t)Dataspace::STANDARD_BT601_525:
114 case (uint32_t)Dataspace::STANDARD_BT601_525_UNADJUSTED:
115 out.colorPrimaries = ColorPrimaries_BT601_6_525;
116 break;
117 case (uint32_t)Dataspace::STANDARD_FILM:
118 out.colorPrimaries = ColorPrimaries_GenericFilm;
119 break;
120 case (uint32_t)Dataspace::STANDARD_BT2020:
121 out.colorPrimaries = ColorPrimaries_BT2020;
122 break;
123 case (uint32_t)Dataspace::STANDARD_ADOBE_RGB:
124 out.colorPrimaries = ColorPrimaries_AdobeRGB;
125 break;
126 case (uint32_t)Dataspace::STANDARD_DCI_P3:
127 out.colorPrimaries = ColorPrimaries_DCIP3;
128 break;
129 default:
130 return Error::UNSUPPORTED;
131 /*
132 ColorPrimaries_SMPTE_240M;
133 ColorPrimaries_SMPTE_ST428;
134 ColorPrimaries_EBU3213;
135 */
136 }
137
138 switch (transfer) {
139 case (uint32_t)Dataspace::TRANSFER_SRGB:
140 out.transfer = Transfer_sRGB;
141 break;
142 case (uint32_t)Dataspace::TRANSFER_GAMMA2_2:
143 out.transfer = Transfer_Gamma2_2;
144 break;
145 case (uint32_t)Dataspace::TRANSFER_GAMMA2_8:
146 out.transfer = Transfer_Gamma2_8;
147 break;
148 case (uint32_t)Dataspace::TRANSFER_SMPTE_170M:
149 out.transfer = Transfer_SMPTE_170M;
150 break;
151 case (uint32_t)Dataspace::TRANSFER_LINEAR:
152 out.transfer = Transfer_Linear;
153 break;
154 case (uint32_t)Dataspace::TRANSFER_HLG:
155 out.transfer = Transfer_HLG;
156 break;
157 default:
158 return Error::UNSUPPORTED;
159 /*
160 Transfer_SMPTE_240M
161 Transfer_Log
162 Transfer_Log_Sqrt
163 Transfer_XvYCC
164 Transfer_BT1361
165 Transfer_sYCC
166 Transfer_BT2020_2_1
167 Transfer_BT2020_2_2
168 Transfer_SMPTE_ST2084
169 Transfer_ST_428
170 */
171 }
172
173 switch (range) {
174 case (uint32_t)Dataspace::RANGE_FULL:
175 out.range = Range_Full;
176 break;
177 case (uint32_t)Dataspace::RANGE_LIMITED:
178 out.range = Range_Limited;
179 break;
180 case (uint32_t)Dataspace::RANGE_EXTENDED:
181 out.range = Range_Extended;
182 break;
183 default:
184 return Error::UNSUPPORTED;
185 }
186
187 color_metadata->colorPrimaries = out.colorPrimaries;
188 color_metadata->transfer = out.transfer;
189 color_metadata->range = out.range;
190 return Error::NONE;
191}
192static Error colorMetadataToDataspace(ColorMetaData color_metadata, Dataspace *dataspace) {
193 Dataspace primaries, transfer, range = Dataspace::UNKNOWN;
194
195 switch (color_metadata.colorPrimaries) {
196 case ColorPrimaries_BT709_5:
197 primaries = Dataspace::STANDARD_BT709;
198 break;
199 // TODO(tbalacha): verify this is equivalent
200 case ColorPrimaries_BT470_6M:
201 primaries = Dataspace::STANDARD_BT470M;
202 break;
203 case ColorPrimaries_BT601_6_625:
204 primaries = Dataspace::STANDARD_BT601_625;
205 break;
206 case ColorPrimaries_BT601_6_525:
207 primaries = Dataspace::STANDARD_BT601_525;
208 break;
209 case ColorPrimaries_GenericFilm:
210 primaries = Dataspace::STANDARD_FILM;
211 break;
212 case ColorPrimaries_BT2020:
213 primaries = Dataspace::STANDARD_BT2020;
214 break;
215 case ColorPrimaries_AdobeRGB:
216 primaries = Dataspace::STANDARD_ADOBE_RGB;
217 break;
218 case ColorPrimaries_DCIP3:
219 primaries = Dataspace::STANDARD_DCI_P3;
220 break;
221 default:
222 return Error::UNSUPPORTED;
223 /*
224 ColorPrimaries_SMPTE_240M;
225 ColorPrimaries_SMPTE_ST428;
226 ColorPrimaries_EBU3213;
227 */
228 }
229
230 switch (color_metadata.transfer) {
231 case Transfer_sRGB:
232 transfer = Dataspace::TRANSFER_SRGB;
233 break;
234 case Transfer_Gamma2_2:
235 transfer = Dataspace::TRANSFER_GAMMA2_2;
236 break;
237 case Transfer_Gamma2_8:
238 transfer = Dataspace::TRANSFER_GAMMA2_8;
239 break;
240 case Transfer_SMPTE_170M:
241 transfer = Dataspace::TRANSFER_SMPTE_170M;
242 break;
243 case Transfer_Linear:
244 transfer = Dataspace::TRANSFER_LINEAR;
245 break;
246 case Transfer_HLG:
247 transfer = Dataspace::TRANSFER_HLG;
248 break;
249 default:
250 return Error::UNSUPPORTED;
251 /*
252 Transfer_SMPTE_240M
253 Transfer_Log
254 Transfer_Log_Sqrt
255 Transfer_XvYCC
256 Transfer_BT1361
257 Transfer_sYCC
258 Transfer_BT2020_2_1
259 Transfer_BT2020_2_2
260 Transfer_SMPTE_ST2084
261 Transfer_ST_428
262 */
263 }
264
265 switch (color_metadata.range) {
266 case Range_Full:
267 range = Dataspace::RANGE_FULL;
268 break;
269 case Range_Limited:
270 range = Dataspace::RANGE_LIMITED;
271 break;
272 case Range_Extended:
273 range = Dataspace::RANGE_EXTENDED;
274 break;
275 default:
276 return Error::UNSUPPORTED;
277 }
278
279 *dataspace = (Dataspace)((uint32_t)primaries | (uint32_t)transfer | (uint32_t)range);
280 return Error::NONE;
281}
282
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400283static void getComponentSizeAndOffset(int32_t format, PlaneLayoutComponent &comp) {
284 switch (format) {
285 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_8888):
286 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBX_8888):
287 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGB_888):
288 comp.sizeInBits = 8;
289 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
290 comp.offsetInBits = 0;
291 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
292 comp.offsetInBits = 8;
293 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
294 comp.offsetInBits = 16;
295 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
296 comp.offsetInBits = 24;
297 }
298 break;
299 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGB_565):
300 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
301 comp.offsetInBits = 0;
302 comp.sizeInBits = 5;
303 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
304 comp.offsetInBits = 5;
305 comp.sizeInBits = 6;
306 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
307 comp.offsetInBits = 11;
308 comp.sizeInBits = 5;
309 }
310 break;
311 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGR_565):
312 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
313 comp.offsetInBits = 11;
314 comp.sizeInBits = 5;
315 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
316 comp.offsetInBits = 5;
317 comp.sizeInBits = 6;
318 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
319 comp.offsetInBits = 0;
320 comp.sizeInBits = 5;
321 }
322 break;
323 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRA_8888):
324 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRX_8888):
325 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGR_888):
326 comp.sizeInBits = 8;
327 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
328 comp.offsetInBits = 16;
329 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
330 comp.offsetInBits = 8;
331 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
332 comp.offsetInBits = 0;
333 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
334 comp.offsetInBits = 24;
335 }
336 break;
337 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_5551):
338 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
339 comp.sizeInBits = 5;
340 comp.offsetInBits = 0;
341 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
342 comp.sizeInBits = 5;
343 comp.offsetInBits = 5;
344 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
345 comp.sizeInBits = 5;
346 comp.offsetInBits = 10;
347 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
348 comp.sizeInBits = 1;
349 comp.offsetInBits = 15;
350 }
351 break;
352 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_4444):
353 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
354 comp.sizeInBits = 4;
355 comp.offsetInBits = 0;
356 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
357 comp.sizeInBits = 4;
358 comp.offsetInBits = 4;
359 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
360 comp.sizeInBits = 4;
361 comp.offsetInBits = 8;
362 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
363 comp.sizeInBits = 4;
364 comp.offsetInBits = 12;
365 }
366 break;
367 case static_cast<int32_t>(HAL_PIXEL_FORMAT_R_8):
368 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RG_88):
369 comp.sizeInBits = 8;
370 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
371 comp.offsetInBits = 0;
372 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
373 comp.offsetInBits = 8;
374 }
375 break;
376 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_1010102):
377 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBX_1010102):
378 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
379 comp.sizeInBits = 10;
380 comp.offsetInBits = 0;
381 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
382 comp.sizeInBits = 10;
383 comp.offsetInBits = 10;
384 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
385 comp.sizeInBits = 10;
386 comp.offsetInBits = 20;
387 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
388 comp.sizeInBits = 2;
389 comp.offsetInBits = 30;
390 }
391 break;
392 case static_cast<int32_t>(HAL_PIXEL_FORMAT_ARGB_2101010):
393 case static_cast<int32_t>(HAL_PIXEL_FORMAT_XRGB_2101010):
394 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
395 comp.sizeInBits = 10;
396 comp.offsetInBits = 2;
397 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
398 comp.sizeInBits = 10;
399 comp.offsetInBits = 12;
400 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
401 comp.sizeInBits = 10;
402 comp.offsetInBits = 22;
403 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
404 comp.sizeInBits = 2;
405 comp.offsetInBits = 0;
406 }
407 break;
408 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRA_1010102):
409 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRX_1010102):
410 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
411 comp.sizeInBits = 10;
412 comp.offsetInBits = 20;
413 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
414 comp.sizeInBits = 10;
415 comp.offsetInBits = 10;
416 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
417 comp.sizeInBits = 10;
418 comp.offsetInBits = 0;
419 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
420 comp.sizeInBits = 2;
421 comp.offsetInBits = 30;
422 }
423 break;
424 case static_cast<int32_t>(HAL_PIXEL_FORMAT_ABGR_2101010):
425 case static_cast<int32_t>(HAL_PIXEL_FORMAT_XBGR_2101010):
426 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
427 comp.sizeInBits = 10;
428 comp.offsetInBits = 22;
429 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
430 comp.sizeInBits = 10;
431 comp.offsetInBits = 12;
432 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
433 comp.sizeInBits = 10;
434 comp.offsetInBits = 2;
435 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
436 comp.sizeInBits = 2;
437 comp.offsetInBits = 0;
438 }
439 break;
440 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_FP16):
441 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
442 comp.sizeInBits = 16;
443 comp.offsetInBits = 0;
444 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
445 comp.sizeInBits = 16;
446 comp.offsetInBits = 16;
447 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
448 comp.sizeInBits = 16;
449 comp.offsetInBits = 32;
450 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
451 comp.sizeInBits = 16;
452 comp.offsetInBits = 48;
453 }
454 break;
455 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_SP):
456 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_422_SP):
457 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS):
458 case static_cast<int32_t>(HAL_PIXEL_FORMAT_NV12_ENCODEABLE):
459 comp.sizeInBits = 8;
460 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
461 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value) {
462 comp.offsetInBits = 0;
463 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
464 comp.offsetInBits = 8;
465 }
466 break;
467 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP):
468 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_422_SP):
469 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO):
470 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS):
471 case static_cast<int32_t>(HAL_PIXEL_FORMAT_NV21_ZSL):
472 comp.sizeInBits = 8;
473 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
474 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
475 comp.offsetInBits = 0;
476 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value) {
477 comp.offsetInBits = 8;
478 }
479 break;
480 case static_cast<int32_t>(HAL_PIXEL_FORMAT_Y16):
481 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value) {
482 comp.offsetInBits = 0;
483 comp.sizeInBits = 16;
484 }
485 break;
486 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YV12):
487 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
488 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value ||
489 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
490 comp.offsetInBits = 0;
491 comp.sizeInBits = 8;
492 }
493 break;
494 case static_cast<int32_t>(HAL_PIXEL_FORMAT_Y8):
495 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value) {
496 comp.offsetInBits = 0;
497 comp.sizeInBits = 8;
498 }
499 break;
500 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_P010):
501 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
502 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value ||
503 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
504 comp.offsetInBits = 0;
505 comp.sizeInBits = 10;
506 }
507 break;
508 default:
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400509 break;
510 }
511}
512
513static void grallocToStandardPlaneLayoutComponentType(uint32_t in,
514 std::vector<PlaneLayoutComponent> *components,
515 int32_t format) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500516 PlaneLayoutComponent comp;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400517 comp.offsetInBits = -1;
518 comp.sizeInBits = -1;
519
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500520 if (in & PLANE_COMPONENT_Y) {
521 comp.type = android::gralloc4::PlaneLayoutComponentType_Y;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400522 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500523 components->push_back(comp);
524 }
525
526 if (in & PLANE_COMPONENT_Cb) {
527 comp.type = android::gralloc4::PlaneLayoutComponentType_CB;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400528 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500529 components->push_back(comp);
530 }
531
532 if (in & PLANE_COMPONENT_Cr) {
533 comp.type = android::gralloc4::PlaneLayoutComponentType_CR;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400534 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500535 components->push_back(comp);
536 }
537
538 if (in & PLANE_COMPONENT_R) {
539 comp.type = android::gralloc4::PlaneLayoutComponentType_R;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400540 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500541 components->push_back(comp);
542 }
543
544 if (in & PLANE_COMPONENT_G) {
545 comp.type = android::gralloc4::PlaneLayoutComponentType_G;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400546 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500547 components->push_back(comp);
548 }
549
550 if (in & PLANE_COMPONENT_B) {
551 comp.type = android::gralloc4::PlaneLayoutComponentType_B;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400552 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500553 components->push_back(comp);
554 }
555
556 if (in & PLANE_COMPONENT_A) {
557 comp.type = android::gralloc4::PlaneLayoutComponentType_A;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400558 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500559 components->push_back(comp);
560 }
561
562 if (in & PLANE_COMPONENT_RAW) {
563 comp.type = qtigralloc::PlaneLayoutComponentType_Raw;
564 components->push_back(comp);
565 }
566
567 if (in & PLANE_COMPONENT_META) {
568 comp.type = qtigralloc::PlaneLayoutComponentType_Meta;
569 components->push_back(comp);
570 }
571}
572
Tharaga Balachandran95175bb2020-03-20 13:26:55 -0400573static Error getFormatLayout(private_handle_t *handle, std::vector<PlaneLayout> *out) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500574 std::vector<PlaneLayout> plane_info;
575 int plane_count = 0;
576 BufferInfo info(handle->unaligned_width, handle->unaligned_height, handle->format, handle->usage);
577
578 gralloc::PlaneLayoutInfo plane_layout[8] = {};
579 if (gralloc::IsYuvFormat(handle->format)) {
580 gralloc::GetYUVPlaneInfo(info, handle->format, handle->width, handle->height, handle->flags,
581 &plane_count, plane_layout);
582 } else if (gralloc::IsUncompressedRGBFormat(handle->format) ||
583 gralloc::IsCompressedRGBFormat(handle->format)) {
584 gralloc::GetRGBPlaneInfo(info, handle->format, handle->width, handle->height, handle->flags,
585 &plane_count, plane_layout);
586 } else {
587 return Error::BAD_BUFFER;
588 }
589 plane_info.resize(plane_count);
590 for (int i = 0; i < plane_count; i++) {
591 std::vector<PlaneLayoutComponent> components;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400592 grallocToStandardPlaneLayoutComponentType(plane_layout[i].component, &plane_info[i].components,
593 handle->format);
Yichi Chena8304132020-03-23 12:23:48 +0800594 plane_info[i].horizontalSubsampling = (1ull << plane_layout[i].h_subsampling);
595 plane_info[i].verticalSubsampling = (1ull << plane_layout[i].v_subsampling);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500596 plane_info[i].offsetInBytes = static_cast<int64_t>(plane_layout[i].offset);
597 plane_info[i].sampleIncrementInBits = static_cast<int64_t>(plane_layout[i].step * 8);
598 plane_info[i].strideInBytes = static_cast<int64_t>(plane_layout[i].stride_bytes);
599 plane_info[i].totalSizeInBytes = static_cast<int64_t>(plane_layout[i].size);
Tharaga Balachandran95175bb2020-03-20 13:26:55 -0400600 plane_info[i].widthInSamples = handle->unaligned_width;
601 plane_info[i].heightInSamples = handle->unaligned_height;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500602 }
603 *out = plane_info;
604 return Error::NONE;
605}
606
Naseer Ahmede69031e2016-11-22 20:05:16 -0500607BufferManager::BufferManager() : next_id_(0) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530608 handles_map_.clear();
Naseer Ahmede69031e2016-11-22 20:05:16 -0500609 allocator_ = new Allocator();
610 allocator_->Init();
611}
612
Naseer Ahmede36f2242017-12-01 15:33:56 -0500613BufferManager *BufferManager::GetInstance() {
614 static BufferManager *instance = new BufferManager();
615 return instance;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530616}
617
618BufferManager::~BufferManager() {
619 if (allocator_) {
620 delete allocator_;
621 }
622}
623
Tharaga Balachandran576571c2020-01-23 18:41:10 -0500624void BufferManager::SetGrallocDebugProperties(gralloc::GrallocProperties props) {
625 allocator_->SetProperties(props);
626 AdrenoMemInfo::GetInstance()->AdrenoSetProperties(props);
627}
628
Naseer Ahmede36f2242017-12-01 15:33:56 -0500629Error BufferManager::FreeBuffer(std::shared_ptr<Buffer> buf) {
Naseer Ahmede69031e2016-11-22 20:05:16 -0500630 auto hnd = buf->handle;
Naseer Ahmeda186b472017-07-07 18:50:49 -0400631 ALOGD_IF(DEBUG, "FreeBuffer handle:%p", hnd);
632
633 if (private_handle_t::validate(hnd) != 0) {
634 ALOGE("FreeBuffer: Invalid handle: %p", hnd);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500635 return Error::BAD_BUFFER;
Naseer Ahmeda186b472017-07-07 18:50:49 -0400636 }
637
Naseer Ahmede36f2242017-12-01 15:33:56 -0500638 if (allocator_->FreeBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset, hnd->fd,
639 buf->ion_handle_main) != 0) {
640 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530641 }
642
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500643 auto meta_size = getMetaDataSize();
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530644 if (allocator_->FreeBuffer(reinterpret_cast<void *>(hnd->base_metadata), meta_size,
Naseer Ahmede69031e2016-11-22 20:05:16 -0500645 hnd->offset_metadata, hnd->fd_metadata, buf->ion_handle_meta) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500646 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530647 }
648
Naseer Ahmede36f2242017-12-01 15:33:56 -0500649 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
Naseer Ahmed29a86dd2017-03-16 14:09:46 -0400650 handle->fd = -1;
651 handle->fd_metadata = -1;
Naseer Ahmed2f8f8d42017-06-09 18:17:26 -0400652 if (!(handle->flags & private_handle_t::PRIV_FLAGS_CLIENT_ALLOCATED)) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500653 delete handle;
Naseer Ahmed2f8f8d42017-06-09 18:17:26 -0400654 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500655 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530656}
657
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500658Error BufferManager::ValidateBufferSize(private_handle_t const *hnd, BufferInfo info) {
659 unsigned int size, alignedw, alignedh;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530660 info.format = GetImplDefinedFormat(info.usage, info.format);
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700661 int ret = GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh);
662 if (ret < 0) {
663 return Error::BAD_BUFFER;
664 }
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500665 auto ion_fd_size = static_cast<unsigned int>(lseek(hnd->fd, 0, SEEK_END));
666 if (size != ion_fd_size) {
667 return Error::BAD_VALUE;
668 }
669 return Error::NONE;
670}
671
Naseer Ahmede36f2242017-12-01 15:33:56 -0500672void BufferManager::RegisterHandleLocked(const private_handle_t *hnd, int ion_handle,
Naseer Ahmed378d8582017-03-28 21:56:08 -0400673 int ion_handle_meta) {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400674 auto buffer = std::make_shared<Buffer>(hnd, ion_handle, ion_handle_meta);
675 handles_map_.emplace(std::make_pair(hnd, buffer));
676}
677
Naseer Ahmede36f2242017-12-01 15:33:56 -0500678Error BufferManager::ImportHandleLocked(private_handle_t *hnd) {
Ramkumar Radhakrishnan372b5ee2018-09-20 13:17:36 -0700679 if (private_handle_t::validate(hnd) != 0) {
680 ALOGE("ImportHandleLocked: Invalid handle: %p", hnd);
681 return Error::BAD_BUFFER;
682 }
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400683 ALOGD_IF(DEBUG, "Importing handle:%p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400684 int ion_handle = allocator_->ImportBuffer(hnd->fd);
685 if (ion_handle < 0) {
686 ALOGE("Failed to import ion buffer: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500687 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400688 }
689 int ion_handle_meta = allocator_->ImportBuffer(hnd->fd_metadata);
690 if (ion_handle_meta < 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500691 ALOGE("Failed to import ion metadata buffer: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd,
692 hnd->id);
693 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400694 }
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500695 // Initialize members that aren't transported
696 hnd->size = static_cast<unsigned int>(lseek(hnd->fd, 0, SEEK_END));
697 hnd->offset = 0;
698 hnd->offset_metadata = 0;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400699 hnd->base = 0;
700 hnd->base_metadata = 0;
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500701 hnd->gpuaddr = 0;
Naseer Ahmed378d8582017-03-28 21:56:08 -0400702 RegisterHandleLocked(hnd, ion_handle, ion_handle_meta);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500703 return Error::NONE;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400704}
705
Naseer Ahmede36f2242017-12-01 15:33:56 -0500706std::shared_ptr<BufferManager::Buffer> BufferManager::GetBufferFromHandleLocked(
707 const private_handle_t *hnd) {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400708 auto it = handles_map_.find(hnd);
709 if (it != handles_map_.end()) {
710 return it->second;
711 } else {
712 return nullptr;
713 }
714}
715
Naseer Ahmede36f2242017-12-01 15:33:56 -0500716Error BufferManager::MapBuffer(private_handle_t const *handle) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530717 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400718 ALOGD_IF(DEBUG, "Map buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530719
720 hnd->base = 0;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530721 if (allocator_->MapBuffer(reinterpret_cast<void **>(&hnd->base), hnd->size, hnd->offset,
722 hnd->fd) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500723 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530724 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500725 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530726}
727
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500728Error BufferManager::IsBufferImported(const private_handle_t *hnd) {
729 std::lock_guard<std::mutex> lock(buffer_lock_);
730 auto buf = GetBufferFromHandleLocked(hnd);
731 if (buf != nullptr) {
732 return Error::NONE;
733 }
734 return Error::BAD_BUFFER;
735}
736
Naseer Ahmede36f2242017-12-01 15:33:56 -0500737Error BufferManager::RetainBuffer(private_handle_t const *hnd) {
Naseer Ahmed699b4572017-03-09 12:28:45 -0500738 ALOGD_IF(DEBUG, "Retain buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500739 auto err = Error::NONE;
Naseer Ahmed378d8582017-03-28 21:56:08 -0400740 std::lock_guard<std::mutex> lock(buffer_lock_);
741 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400742 if (buf != nullptr) {
743 buf->IncRef();
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530744 } else {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400745 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400746 err = ImportHandleLocked(handle);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530747 }
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400748 return err;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530749}
750
Naseer Ahmede36f2242017-12-01 15:33:56 -0500751Error BufferManager::ReleaseBuffer(private_handle_t const *hnd) {
Naseer Ahmeda186b472017-07-07 18:50:49 -0400752 ALOGD_IF(DEBUG, "Release buffer handle:%p", hnd);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400753 std::lock_guard<std::mutex> lock(buffer_lock_);
754 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400755 if (buf == nullptr) {
756 ALOGE("Could not find handle: %p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500757 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530758 } else {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400759 if (buf->DecRef()) {
760 handles_map_.erase(hnd);
761 // Unmap, close ion handle and close fd
Naseer Ahmede69031e2016-11-22 20:05:16 -0500762 FreeBuffer(buf);
763 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530764 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500765 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530766}
767
Naseer Ahmede36f2242017-12-01 15:33:56 -0500768Error BufferManager::LockBuffer(const private_handle_t *hnd, uint64_t usage) {
Naseer Ahmed378d8582017-03-28 21:56:08 -0400769 std::lock_guard<std::mutex> lock(buffer_lock_);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500770 auto err = Error::NONE;
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400771 ALOGD_IF(DEBUG, "LockBuffer buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530772
773 // If buffer is not meant for CPU return err
Naseer Ahmede36f2242017-12-01 15:33:56 -0500774 if (!CpuCanAccess(usage)) {
775 return Error::BAD_VALUE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530776 }
777
Naseer Ahmed378d8582017-03-28 21:56:08 -0400778 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400779 if (buf == nullptr) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500780 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530781 }
782
Naseer Ahmed67330702017-05-02 15:00:26 -0400783 if (hnd->base == 0) {
784 // we need to map for real
785 err = MapBuffer(hnd);
786 }
787
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530788 // Invalidate if CPU reads in software and there are non-CPU
789 // writers. No need to do this for the metadata buffer as it is
790 // only read/written in software.
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400791
792 // todo use handle here
Naseer Ahmede36f2242017-12-01 15:33:56 -0500793 if (err == Error::NONE && (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) &&
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530794 (hnd->flags & private_handle_t::PRIV_FLAGS_CACHED)) {
795 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
Rohit Kulkarni3ac98392017-10-20 12:04:34 -0700796 buf->ion_handle_main, CACHE_INVALIDATE, hnd->fd)) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500797 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530798 }
799 }
800
801 // Mark the buffer to be flushed after CPU write.
Naseer Ahmede36f2242017-12-01 15:33:56 -0500802 if (err == Error::NONE && CpuCanWrite(usage)) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530803 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
804 handle->flags |= private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
805 }
806
807 return err;
808}
Yichi Chena8304132020-03-23 12:23:48 +0800809
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500810Error BufferManager::FlushBuffer(const private_handle_t *handle) {
811 std::lock_guard<std::mutex> lock(buffer_lock_);
812 auto status = Error::NONE;
813
814 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
815 auto buf = GetBufferFromHandleLocked(hnd);
816 if (buf == nullptr) {
817 return Error::BAD_BUFFER;
818 }
819
820 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
821 buf->ion_handle_main, CACHE_CLEAN, hnd->fd) != 0) {
822 status = Error::BAD_BUFFER;
823 }
824
825 return status;
826}
827
828Error BufferManager::RereadBuffer(const private_handle_t *handle) {
829 std::lock_guard<std::mutex> lock(buffer_lock_);
830 auto status = Error::NONE;
831
832 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
833 auto buf = GetBufferFromHandleLocked(hnd);
834 if (buf == nullptr) {
835 return Error::BAD_BUFFER;
836 }
837
838 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
839 buf->ion_handle_main, CACHE_INVALIDATE, hnd->fd) != 0) {
840 status = Error::BAD_BUFFER;
841 }
842
843 return status;
844}
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530845
Naseer Ahmede36f2242017-12-01 15:33:56 -0500846Error BufferManager::UnlockBuffer(const private_handle_t *handle) {
Naseer Ahmed378d8582017-03-28 21:56:08 -0400847 std::lock_guard<std::mutex> lock(buffer_lock_);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500848 auto status = Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530849
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530850 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400851 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400852 if (buf == nullptr) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500853 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400854 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530855
856 if (hnd->flags & private_handle_t::PRIV_FLAGS_NEEDS_FLUSH) {
857 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
Rohit Kulkarni3ac98392017-10-20 12:04:34 -0700858 buf->ion_handle_main, CACHE_CLEAN, hnd->fd) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500859 status = Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530860 }
861 hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
Rohit Kulkarnib20abe72018-03-13 16:55:10 -0700862 } else {
863 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
864 buf->ion_handle_main, CACHE_READ_DONE, hnd->fd) != 0) {
865 status = Error::BAD_BUFFER;
866 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530867 }
868
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530869 return status;
870}
871
Naseer Ahmede36f2242017-12-01 15:33:56 -0500872Error BufferManager::AllocateBuffer(const BufferDescriptor &descriptor, buffer_handle_t *handle,
Tharaga Balachandranab150ab2019-09-26 19:17:58 -0400873 unsigned int bufferSize, bool testAlloc) {
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400874 if (!handle)
Naseer Ahmede36f2242017-12-01 15:33:56 -0500875 return Error::BAD_BUFFER;
876 std::lock_guard<std::mutex> buffer_lock(buffer_lock_);
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400877
Naseer Ahmede36f2242017-12-01 15:33:56 -0500878 uint64_t usage = descriptor.GetUsage();
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530879 int format = GetImplDefinedFormat(usage, descriptor.GetFormat());
Naseer Ahmedbaa39c52017-03-27 14:00:07 -0400880 uint32_t layer_count = descriptor.GetLayerCount();
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400881
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400882 unsigned int size;
883 unsigned int alignedw, alignedh;
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700884 int err = 0;
Naseer Ahmed95dc2882017-07-26 18:12:12 -0400885
886 int buffer_type = GetBufferType(format);
Saurabh Shah14c8e5b2017-04-07 10:37:23 -0700887 BufferInfo info = GetBufferInfo(descriptor);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500888 info.format = format;
Saurabh Dubey70957382018-05-15 16:05:32 +0530889 info.layer_count = layer_count;
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400890
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530891 GraphicsMetadata graphics_metadata = {};
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700892 err = GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh, &graphics_metadata);
893 if (err < 0) {
894 return Error::BAD_DESCRIPTOR;
895 }
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530896
Tharaga Balachandranab150ab2019-09-26 19:17:58 -0400897 if (testAlloc) {
898 return Error::NONE;
899 }
900
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530901 size = (bufferSize >= size) ? bufferSize : size;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530902 uint64_t flags = 0;
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400903 auto page_size = UINT(getpagesize());
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530904 AllocData data;
Naseer Ahmede36f2242017-12-01 15:33:56 -0500905 data.align = GetDataAlignment(format, usage);
Naseer Ahmedf8e9c432017-06-13 17:45:12 -0400906 data.size = size;
Naseer Ahmede36f2242017-12-01 15:33:56 -0500907 data.handle = (uintptr_t)handle;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530908 data.uncached = UseUncached(format, usage);
Naseer Ahmede69031e2016-11-22 20:05:16 -0500909
910 // Allocate buffer memory
Rohit Kulkarnib20abe72018-03-13 16:55:10 -0700911 err = allocator_->AllocateMem(&data, usage, format);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530912 if (err) {
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700913 ALOGE("gralloc failed to allocate err=%s format %d size %d WxH %dx%d usage %" PRIu64,
914 strerror(-err), format, size, alignedw, alignedh, usage);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500915 return Error::NO_RESOURCES;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530916 }
917
Naseer Ahmede69031e2016-11-22 20:05:16 -0500918 // Allocate memory for MetaData
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530919 AllocData e_data;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500920 e_data.size = getMetaDataSize();
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530921 e_data.handle = data.handle;
Naseer Ahmede69031e2016-11-22 20:05:16 -0500922 e_data.align = page_size;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530923
Rohit Kulkarnib20abe72018-03-13 16:55:10 -0700924 err = allocator_->AllocateMem(&e_data, 0, 0);
Naseer Ahmede69031e2016-11-22 20:05:16 -0500925 if (err) {
926 ALOGE("gralloc failed to allocate metadata error=%s", strerror(-err));
Naseer Ahmede36f2242017-12-01 15:33:56 -0500927 return Error::NO_RESOURCES;
Naseer Ahmede69031e2016-11-22 20:05:16 -0500928 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530929
Naseer Ahmede36f2242017-12-01 15:33:56 -0500930 flags = GetHandleFlags(format, usage);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530931 flags |= data.alloc_type;
932
933 // Create handle
Naseer Ahmede36f2242017-12-01 15:33:56 -0500934 private_handle_t *hnd = new private_handle_t(
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530935 data.fd, e_data.fd, INT(flags), INT(alignedw), INT(alignedh), descriptor.GetWidth(),
Naseer Ahmede36f2242017-12-01 15:33:56 -0500936 descriptor.GetHeight(), format, buffer_type, data.size, usage);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530937
Naseer Ahmede69031e2016-11-22 20:05:16 -0500938 hnd->id = ++next_id_;
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400939 hnd->base = 0;
940 hnd->base_metadata = 0;
Naseer Ahmedbaa39c52017-03-27 14:00:07 -0400941 hnd->layer_count = layer_count;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500942
Arun Kumar K.R05746222018-04-04 10:45:58 +0530943 // set default csc as 709, but for video(yuv) its 601L
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500944
Arun Kumar K.R05746222018-04-04 10:45:58 +0530945 ColorSpace_t colorSpace = (buffer_type == BUFFER_TYPE_VIDEO) ? ITU_R_601 : ITU_R_709;
Praveen Chavancbaa5362018-07-06 18:19:46 -0700946 setMetaDataAndUnmap(hnd, UPDATE_COLOR_SPACE, reinterpret_cast<void *>(&colorSpace));
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530947
Saurabh Dubeyefd7f9e2018-06-15 18:00:02 +0530948 bool use_adreno_for_size = CanUseAdrenoForSize(buffer_type, usage);
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530949 if (use_adreno_for_size) {
Praveen Chavancbaa5362018-07-06 18:19:46 -0700950 setMetaDataAndUnmap(hnd, SET_GRAPHICS_METADATA, reinterpret_cast<void *>(&graphics_metadata));
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530951 }
952
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500953 auto error = validateAndMap(hnd);
954 if (error != 0) {
955 ALOGE("validateAndMap failed");
956 return Error::BAD_BUFFER;
957 }
958 auto metadata = reinterpret_cast<MetaData_t *>(hnd->base_metadata);
Yichi Chena8304132020-03-23 12:23:48 +0800959 auto nameLength = std::min(descriptor.GetName().size(), size_t(MAX_NAME_LEN - 1));
960 nameLength = descriptor.GetName().copy(metadata->name, nameLength);
961 metadata->name[nameLength] = '\0';
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500962
963 metadata->reservedRegion.size = static_cast<uint32_t>(descriptor.GetReservedSize());
Tharaga Balachandran95175bb2020-03-20 13:26:55 -0400964
965 metadata->crop.top = 0;
966 metadata->crop.left = 0;
967 metadata->crop.right = hnd->width;
968 metadata->crop.bottom = hnd->height;
969
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500970 unmapAndReset(hnd);
971
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530972 *handle = hnd;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500973
Naseer Ahmed378d8582017-03-28 21:56:08 -0400974 RegisterHandleLocked(hnd, data.ion_handle, e_data.ion_handle);
Naseer Ahmed699b4572017-03-09 12:28:45 -0500975 ALOGD_IF(DEBUG, "Allocated buffer handle: %p id: %" PRIu64, hnd, hnd->id);
976 if (DEBUG) {
977 private_handle_t::Dump(hnd);
978 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500979 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530980}
981
Naseer Ahmede36f2242017-12-01 15:33:56 -0500982Error BufferManager::Dump(std::ostringstream *os) {
Uday Kiran Pichikab58d8842018-04-10 15:37:35 +0530983 std::lock_guard<std::mutex> buffer_lock(buffer_lock_);
Naseer Ahmeddc918132017-03-07 15:25:14 -0500984 for (auto it : handles_map_) {
985 auto buf = it.second;
986 auto hnd = buf->handle;
987 *os << "handle id: " << std::setw(4) << hnd->id;
Naseer Ahmede36f2242017-12-01 15:33:56 -0500988 *os << " fd: " << std::setw(3) << hnd->fd;
989 *os << " fd_meta: " << std::setw(3) << hnd->fd_metadata;
990 *os << " wxh: " << std::setw(4) << hnd->width << " x " << std::setw(4) << hnd->height;
991 *os << " uwxuh: " << std::setw(4) << hnd->unaligned_width << " x ";
992 *os << std::setw(4) << hnd->unaligned_height;
993 *os << " size: " << std::setw(9) << hnd->size;
Naseer Ahmeddc918132017-03-07 15:25:14 -0500994 *os << std::hex << std::setfill('0');
Naseer Ahmede36f2242017-12-01 15:33:56 -0500995 *os << " priv_flags: "
996 << "0x" << std::setw(8) << hnd->flags;
997 *os << " usage: "
998 << "0x" << std::setw(8) << hnd->usage;
Naseer Ahmeddc918132017-03-07 15:25:14 -0500999 // TODO(user): get format string from qdutils
Naseer Ahmede36f2242017-12-01 15:33:56 -05001000 *os << " format: "
1001 << "0x" << std::setw(8) << hnd->format;
1002 *os << std::dec << std::setfill(' ') << std::endl;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001003 }
Naseer Ahmede36f2242017-12-01 15:33:56 -05001004 return Error::NONE;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001005}
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001006
1007// Get list of private handles in handles_map_
1008Error BufferManager::GetAllHandles(std::vector<const private_handle_t *> *out_handle_list) {
1009 std::lock_guard<std::mutex> lock(buffer_lock_);
1010 if (handles_map_.empty()) {
1011 return Error::NO_RESOURCES;
1012 }
1013 out_handle_list->reserve(handles_map_.size());
1014 for (auto handle : handles_map_) {
1015 out_handle_list->push_back(handle.first);
1016 }
1017 return Error::NONE;
1018}
Yichi Chena8304132020-03-23 12:23:48 +08001019
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001020Error BufferManager::GetReservedRegion(private_handle_t *handle, void **reserved_region,
1021 uint64_t *reserved_region_size) {
1022 std::lock_guard<std::mutex> lock(buffer_lock_);
1023 if (!handle)
1024 return Error::BAD_BUFFER;
1025
1026 auto buf = GetBufferFromHandleLocked(handle);
1027 if (buf == nullptr)
1028 return Error::BAD_BUFFER;
1029
1030 auto err = validateAndMap(handle);
1031 if (err != 0)
1032 return Error::BAD_BUFFER;
1033 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1034
1035 *reserved_region = reinterpret_cast<void *>(&(metadata->reservedRegion.data));
1036 *reserved_region_size = metadata->reservedRegion.size;
1037
1038 return Error::NONE;
1039}
1040
1041Error BufferManager::GetMetadata(private_handle_t *handle, int64_t metadatatype_value,
1042 hidl_vec<uint8_t> *out) {
1043 std::lock_guard<std::mutex> lock(buffer_lock_);
1044 if (!handle)
1045 return Error::BAD_BUFFER;
1046 auto buf = GetBufferFromHandleLocked(handle);
1047 if (buf == nullptr)
1048 return Error::BAD_BUFFER;
1049
1050 auto err = validateAndMap(handle);
1051 if (err != 0)
1052 return Error::BAD_BUFFER;
1053
1054 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1055
1056 Error error = Error::NONE;
1057 switch (metadatatype_value) {
1058 case (int64_t)StandardMetadataType::BUFFER_ID:
1059 android::gralloc4::encodeBufferId((uint64_t)handle->id, out);
1060 break;
1061 case (int64_t)StandardMetadataType::NAME: {
1062 std::string name(metadata->name);
1063 android::gralloc4::encodeName(name, out);
1064 break;
1065 }
1066 case (int64_t)StandardMetadataType::WIDTH:
1067 android::gralloc4::encodeWidth((uint64_t)handle->unaligned_width, out);
1068 break;
1069 case (int64_t)StandardMetadataType::HEIGHT:
1070 android::gralloc4::encodeHeight((uint64_t)handle->unaligned_height, out);
1071 break;
1072 case (int64_t)StandardMetadataType::LAYER_COUNT:
1073 android::gralloc4::encodeLayerCount((uint64_t)handle->layer_count, out);
1074 break;
1075 case (int64_t)StandardMetadataType::PIXEL_FORMAT_REQUESTED:
1076 // TODO(tbalacha): need to return IMPLEMENTATION_DEFINED,
1077 // which wouldn't be known from private_handle_t
1078 android::gralloc4::encodePixelFormatRequested((PixelFormat)handle->format, out);
1079 break;
1080 case (int64_t)StandardMetadataType::PIXEL_FORMAT_FOURCC: {
1081 uint32_t drm_format = 0;
1082 uint64_t drm_format_modifier = 0;
1083 GetDRMFormat(handle->format, handle->flags, &drm_format, &drm_format_modifier);
1084 android::gralloc4::encodePixelFormatFourCC(drm_format, out);
1085 break;
1086 }
1087 case (int64_t)StandardMetadataType::PIXEL_FORMAT_MODIFIER: {
1088 uint32_t drm_format = 0;
1089 uint64_t drm_format_modifier = 0;
1090 GetDRMFormat(handle->format, handle->flags, &drm_format, &drm_format_modifier);
1091 android::gralloc4::encodePixelFormatModifier(drm_format_modifier, out);
1092 break;
1093 }
1094 case (int64_t)StandardMetadataType::USAGE:
1095 android::gralloc4::encodeUsage((uint64_t)handle->usage, out);
1096 break;
1097 case (int64_t)StandardMetadataType::ALLOCATION_SIZE:
1098 android::gralloc4::encodeAllocationSize((uint64_t)handle->size, out);
1099 break;
1100 case (int64_t)StandardMetadataType::PROTECTED_CONTENT: {
1101 uint64_t protected_content = (handle->flags & qtigralloc::PRIV_FLAGS_SECURE_BUFFER) ? 1 : 0;
1102 android::gralloc4::encodeProtectedContent(protected_content, out);
1103 break;
1104 }
1105 case (int64_t)StandardMetadataType::CHROMA_SITING:
Tharaga Balachandran676e3092020-04-27 15:30:03 -04001106 android::gralloc4::encodeChromaSiting(android::gralloc4::ChromaSiting_None, out);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001107 break;
1108 case (int64_t)StandardMetadataType::DATASPACE:
1109 Dataspace dataspace;
1110 colorMetadataToDataspace(metadata->color, &dataspace);
1111 android::gralloc4::encodeDataspace(dataspace, out);
1112 break;
1113 case (int64_t)StandardMetadataType::INTERLACED:
1114 android::gralloc4::encodeInterlaced(qtigralloc::Interlaced_Qti, out);
1115 break;
1116 case (int64_t)StandardMetadataType::COMPRESSION:
1117 if (handle->flags & qtigralloc::PRIV_FLAGS_UBWC_ALIGNED ||
1118 handle->flags & qtigralloc::PRIV_FLAGS_UBWC_ALIGNED_PI) {
1119 android::gralloc4::encodeCompression(qtigralloc::Compression_QtiUBWC, out);
1120 } else {
1121 android::gralloc4::encodeCompression(android::gralloc4::Compression_None, out);
1122 }
1123 break;
1124 case (int64_t)StandardMetadataType::PLANE_LAYOUTS: {
1125 std::vector<PlaneLayout> plane_layouts;
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001126 getFormatLayout(handle, &plane_layouts);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001127 android::gralloc4::encodePlaneLayouts(plane_layouts, out);
1128 break;
1129 }
1130 case (int64_t)StandardMetadataType::BLEND_MODE:
1131 android::gralloc4::encodeBlendMode((BlendMode)metadata->blendMode, out);
1132 break;
1133 case (int64_t)StandardMetadataType::SMPTE2086: {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001134 if (metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled) {
1135 Smpte2086 mastering_display_values;
1136 mastering_display_values.primaryRed = {
1137 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][0]) /
1138 50000.0f,
1139 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][1]) /
1140 50000.0f};
1141 mastering_display_values.primaryGreen = {
1142 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][0]) /
1143 50000.0f,
1144 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][1]) /
1145 50000.0f};
1146 mastering_display_values.primaryBlue = {
1147 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][0]) /
1148 50000.0f,
1149 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][1]) /
1150 50000.0f};
1151 mastering_display_values.whitePoint = {
1152 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.whitePoint[0]) /
1153 50000.0f,
1154 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.whitePoint[1]) /
1155 50000.0f};
1156 mastering_display_values.maxLuminance =
1157 static_cast<float>(metadata->color.masteringDisplayInfo.maxDisplayLuminance);
1158 mastering_display_values.minLuminance =
1159 static_cast<float>(metadata->color.masteringDisplayInfo.minDisplayLuminance) / 10000.0f;
1160 android::gralloc4::encodeSmpte2086(mastering_display_values, out);
1161 } else {
1162 android::gralloc4::encodeSmpte2086(std::nullopt, out);
1163 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001164 break;
1165 }
1166 case (int64_t)StandardMetadataType::CTA861_3: {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001167 if (metadata->color.contentLightLevel.lightLevelSEIEnabled) {
1168 Cta861_3 content_light_level;
1169 content_light_level.maxContentLightLevel =
1170 static_cast<float>(metadata->color.contentLightLevel.maxContentLightLevel);
1171 content_light_level.maxFrameAverageLightLevel =
1172 static_cast<float>(metadata->color.contentLightLevel.minPicAverageLightLevel) /
1173 10000.0f;
1174 android::gralloc4::encodeCta861_3(content_light_level, out);
1175 } else {
1176 android::gralloc4::encodeCta861_3(std::nullopt, out);
1177 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001178 break;
1179 }
1180 case (int64_t)StandardMetadataType::SMPTE2094_40: {
Tharaga Balachandran2c9873c2020-03-10 12:49:18 -04001181 if (metadata->color.dynamicMetaDataValid &&
1182 metadata->color.dynamicMetaDataLen <= HDR_DYNAMIC_META_DATA_SZ) {
Yichi Chena8304132020-03-23 12:23:48 +08001183 std::vector<uint8_t> dynamic_metadata_payload;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001184 dynamic_metadata_payload.resize(metadata->color.dynamicMetaDataLen);
Yichi Chena8304132020-03-23 12:23:48 +08001185 dynamic_metadata_payload.assign(
1186 metadata->color.dynamicMetaDataPayload,
1187 metadata->color.dynamicMetaDataPayload + metadata->color.dynamicMetaDataLen);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001188 android::gralloc4::encodeSmpte2094_40(dynamic_metadata_payload, out);
1189 } else {
1190 android::gralloc4::encodeSmpte2094_40(std::nullopt, out);
1191 }
1192 break;
1193 }
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001194 case (int64_t)StandardMetadataType::CROP: {
1195 // Crop is the same for all planes
1196 std::vector<Rect> out_crop = {{metadata->crop.left, metadata->crop.top, metadata->crop.right,
1197 metadata->crop.bottom}};
1198 android::gralloc4::encodeCrop(out_crop, out);
1199 break;
1200 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001201 case QTI_VT_TIMESTAMP:
1202 android::gralloc4::encodeUint64(qtigralloc::MetadataType_VTTimestamp, metadata->vtTimeStamp,
1203 out);
1204 break;
1205 case QTI_COLOR_METADATA:
1206 qtigralloc::encodeColorMetadata(metadata->color, out);
1207 break;
1208 case QTI_PP_PARAM_INTERLACED:
1209 android::gralloc4::encodeInt32(qtigralloc::MetadataType_PPParamInterlaced,
1210 metadata->interlaced, out);
1211 break;
1212 case QTI_VIDEO_PERF_MODE:
1213 android::gralloc4::encodeUint32(qtigralloc::MetadataType_VideoPerfMode,
1214 metadata->isVideoPerfMode, out);
1215 break;
1216 case QTI_GRAPHICS_METADATA:
1217 qtigralloc::encodeGraphicsMetadata(metadata->graphics_metadata, out);
1218 break;
1219 case QTI_UBWC_CR_STATS_INFO:
1220 qtigralloc::encodeUBWCStats(metadata->ubwcCRStats, out);
1221 break;
1222 case QTI_REFRESH_RATE:
1223 android::gralloc4::encodeFloat(qtigralloc::MetadataType_RefreshRate, metadata->refreshrate,
1224 out);
1225 break;
1226 case QTI_MAP_SECURE_BUFFER:
1227 android::gralloc4::encodeInt32(qtigralloc::MetadataType_MapSecureBuffer,
1228 metadata->mapSecureBuffer, out);
1229 break;
1230 case QTI_LINEAR_FORMAT:
1231 android::gralloc4::encodeUint32(qtigralloc::MetadataType_LinearFormat, metadata->linearFormat,
1232 out);
1233 break;
1234 case QTI_SINGLE_BUFFER_MODE:
1235 android::gralloc4::encodeUint32(qtigralloc::MetadataType_SingleBufferMode,
1236 metadata->isSingleBufferMode, out);
1237 break;
1238 case QTI_CVP_METADATA:
1239 qtigralloc::encodeCVPMetadata(metadata->cvpMetadata, out);
1240 break;
1241 case QTI_VIDEO_HISTOGRAM_STATS:
1242 qtigralloc::encodeVideoHistogramMetadata(metadata->video_histogram_stats, out);
1243 break;
1244 case QTI_FD:
1245 android::gralloc4::encodeInt32(qtigralloc::MetadataType_FD, handle->fd, out);
1246 break;
1247 case QTI_PRIVATE_FLAGS:
1248 android::gralloc4::encodeInt32(qtigralloc::MetadataType_PrivateFlags, handle->flags, out);
1249 break;
Tharaga Balachandran70b03c72020-03-10 14:00:15 -04001250 case QTI_ALIGNED_WIDTH_IN_PIXELS:
1251 android::gralloc4::encodeUint32(qtigralloc::MetadataType_AlignedWidthInPixels, handle->width,
1252 out);
1253 break;
1254 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
1255 android::gralloc4::encodeUint32(qtigralloc::MetadataType_AlignedHeightInPixels,
1256 handle->height, out);
1257 break;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001258 default:
1259 error = Error::UNSUPPORTED;
1260 }
1261
1262 return error;
1263}
1264
1265Error BufferManager::SetMetadata(private_handle_t *handle, int64_t metadatatype_value,
1266 hidl_vec<uint8_t> in) {
1267 std::lock_guard<std::mutex> lock(buffer_lock_);
1268 if (!handle)
1269 return Error::BAD_BUFFER;
1270
1271 auto buf = GetBufferFromHandleLocked(handle);
1272 if (buf == nullptr)
1273 return Error::BAD_BUFFER;
1274
1275 int err = validateAndMap(handle);
1276 if (err != 0)
1277 return Error::BAD_BUFFER;
1278
Tharaga Balachandran96f24d02020-03-31 12:46:02 -04001279 if (in.size() == 0) {
1280 return Error::UNSUPPORTED;
1281 }
1282
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001283 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1284
1285 switch (metadatatype_value) {
1286 // These are constant (unchanged after allocation)
1287 case (int64_t)StandardMetadataType::BUFFER_ID:
1288 case (int64_t)StandardMetadataType::NAME:
1289 case (int64_t)StandardMetadataType::WIDTH:
1290 case (int64_t)StandardMetadataType::HEIGHT:
1291 case (int64_t)StandardMetadataType::LAYER_COUNT:
1292 case (int64_t)StandardMetadataType::PIXEL_FORMAT_REQUESTED:
1293 case (int64_t)StandardMetadataType::USAGE:
1294 return Error::BAD_VALUE;
1295 case (int64_t)StandardMetadataType::PIXEL_FORMAT_FOURCC:
1296 case (int64_t)StandardMetadataType::PIXEL_FORMAT_MODIFIER:
1297 case (int64_t)StandardMetadataType::PROTECTED_CONTENT:
1298 case (int64_t)StandardMetadataType::ALLOCATION_SIZE:
1299 case (int64_t)StandardMetadataType::PLANE_LAYOUTS:
1300 case (int64_t)StandardMetadataType::CHROMA_SITING:
1301 case (int64_t)StandardMetadataType::INTERLACED:
1302 case (int64_t)StandardMetadataType::COMPRESSION:
1303 case QTI_FD:
1304 case QTI_PRIVATE_FLAGS:
Tharaga Balachandran70b03c72020-03-10 14:00:15 -04001305 case QTI_ALIGNED_WIDTH_IN_PIXELS:
1306 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001307 return Error::UNSUPPORTED;
1308 case (int64_t)StandardMetadataType::DATASPACE:
1309 Dataspace dataspace;
1310 android::gralloc4::decodeDataspace(in, &dataspace);
1311 dataspaceToColorMetadata(dataspace, &metadata->color);
1312 break;
1313 case (int64_t)StandardMetadataType::BLEND_MODE:
1314 BlendMode mode;
1315 android::gralloc4::decodeBlendMode(in, &mode);
1316 metadata->blendMode = (int32_t)mode;
1317 break;
1318 case (int64_t)StandardMetadataType::SMPTE2086: {
1319 std::optional<Smpte2086> mastering_display_values;
1320 android::gralloc4::decodeSmpte2086(in, &mastering_display_values);
1321 if (mastering_display_values != std::nullopt) {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001322 metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = true;
1323
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001324 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][0] =
1325 static_cast<uint32_t>(mastering_display_values->primaryRed.x * 50000.0f);
1326 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][1] =
1327 static_cast<uint32_t>(mastering_display_values->primaryRed.y * 50000.0f);
1328
1329 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][0] =
1330 static_cast<uint32_t>(mastering_display_values->primaryGreen.x * 50000.0f);
1331 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][1] =
1332 static_cast<uint32_t>(mastering_display_values->primaryGreen.y * 50000.0f);
1333
1334 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][0] =
1335 static_cast<uint32_t>(mastering_display_values->primaryBlue.x * 50000.0f);
1336 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][1] =
1337 static_cast<uint32_t>(mastering_display_values->primaryBlue.y * 50000.0f);
1338
1339 metadata->color.masteringDisplayInfo.primaries.whitePoint[0] =
1340 static_cast<uint32_t>(mastering_display_values->whitePoint.x * 50000.0f);
1341 metadata->color.masteringDisplayInfo.primaries.whitePoint[1] =
1342 static_cast<uint32_t>(mastering_display_values->whitePoint.y * 50000.0f);
1343
1344 metadata->color.masteringDisplayInfo.maxDisplayLuminance =
1345 static_cast<uint32_t>(mastering_display_values->maxLuminance);
1346 metadata->color.masteringDisplayInfo.minDisplayLuminance =
1347 static_cast<uint32_t>(mastering_display_values->minLuminance * 10000.0f);
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001348 } else {
1349 metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001350 }
1351 break;
1352 }
1353 case (int64_t)StandardMetadataType::CTA861_3: {
1354 std::optional<Cta861_3> content_light_level;
1355 android::gralloc4::decodeCta861_3(in, &content_light_level);
1356 if (content_light_level != std::nullopt) {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001357 metadata->color.contentLightLevel.lightLevelSEIEnabled = true;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001358 metadata->color.contentLightLevel.maxContentLightLevel =
1359 static_cast<uint32_t>(content_light_level->maxContentLightLevel);
1360 metadata->color.contentLightLevel.minPicAverageLightLevel =
1361 static_cast<uint32_t>(content_light_level->maxFrameAverageLightLevel * 10000.0f);
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001362 } else {
1363 metadata->color.contentLightLevel.lightLevelSEIEnabled = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001364 }
1365 break;
1366 }
1367 case (int64_t)StandardMetadataType::SMPTE2094_40: {
1368 std::optional<std::vector<uint8_t>> dynamic_metadata_payload;
1369 android::gralloc4::decodeSmpte2094_40(in, &dynamic_metadata_payload);
1370 if (dynamic_metadata_payload != std::nullopt) {
Yichi Chena8304132020-03-23 12:23:48 +08001371 if (dynamic_metadata_payload->size() > HDR_DYNAMIC_META_DATA_SZ)
1372 return Error::BAD_VALUE;
1373
1374 metadata->color.dynamicMetaDataLen = static_cast<uint32_t>(dynamic_metadata_payload->size());
1375 std::copy(dynamic_metadata_payload->begin(), dynamic_metadata_payload->end(),
1376 metadata->color.dynamicMetaDataPayload);
1377 metadata->color.dynamicMetaDataValid = true;
Tharaga Balachandranf5861d52020-03-23 16:00:18 -04001378 } else {
1379 // Reset metadata by passing in std::nullopt
1380 metadata->color.dynamicMetaDataValid = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001381 }
1382 break;
1383 }
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001384 case (int64_t)StandardMetadataType::CROP: {
1385 std::vector<Rect> in_crop;
1386 android::gralloc4::decodeCrop(in, &in_crop);
1387 if (in_crop.size() != 1)
1388 return Error::UNSUPPORTED;
1389
1390 metadata->crop.left = in_crop[0].left;
1391 metadata->crop.top = in_crop[0].top;
1392 metadata->crop.right = in_crop[0].right;
1393 metadata->crop.bottom = in_crop[0].bottom;
1394 break;
1395 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001396 case QTI_VT_TIMESTAMP:
1397 android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp, in,
1398 &metadata->vtTimeStamp);
1399 break;
1400 case QTI_COLOR_METADATA:
1401 ColorMetaData color;
1402 qtigralloc::decodeColorMetadata(in, &color);
1403 metadata->color = color;
1404 break;
1405 case QTI_PP_PARAM_INTERLACED:
1406 android::gralloc4::decodeInt32(qtigralloc::MetadataType_PPParamInterlaced, in,
1407 &metadata->interlaced);
1408 break;
1409 case QTI_VIDEO_PERF_MODE:
1410 android::gralloc4::decodeUint32(qtigralloc::MetadataType_VideoPerfMode, in,
1411 &metadata->isVideoPerfMode);
1412 break;
1413 case QTI_GRAPHICS_METADATA:
1414 qtigralloc::decodeGraphicsMetadata(in, &metadata->graphics_metadata);
1415 break;
1416 case QTI_UBWC_CR_STATS_INFO:
1417 qtigralloc::decodeUBWCStats(in, &metadata->ubwcCRStats[0]);
1418 break;
1419 case QTI_REFRESH_RATE:
1420 android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate, in,
1421 &metadata->refreshrate);
1422 break;
1423 case QTI_MAP_SECURE_BUFFER:
1424 android::gralloc4::decodeInt32(qtigralloc::MetadataType_MapSecureBuffer, in,
1425 &metadata->mapSecureBuffer);
1426 break;
1427 case QTI_LINEAR_FORMAT:
1428 android::gralloc4::decodeUint32(qtigralloc::MetadataType_LinearFormat, in,
1429 &metadata->linearFormat);
1430 break;
1431 case QTI_SINGLE_BUFFER_MODE:
1432 android::gralloc4::decodeUint32(qtigralloc::MetadataType_SingleBufferMode, in,
1433 &metadata->isSingleBufferMode);
1434 break;
1435 case QTI_CVP_METADATA:
1436 qtigralloc::decodeCVPMetadata(in, &metadata->cvpMetadata);
1437 break;
1438 case QTI_VIDEO_HISTOGRAM_STATS:
1439 qtigralloc::decodeVideoHistogramMetadata(in, &metadata->video_histogram_stats);
1440 break;
1441 default:
1442 return Error::BAD_VALUE;
1443 }
1444 return Error::NONE;
1445}
1446
Naseer Ahmede36f2242017-12-01 15:33:56 -05001447} // namespace gralloc