blob: cb8c0b4c599bb7675a49a2179e3e9da922359975 [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 Balachandranfd1029e2020-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 Balachandranfd1029e2020-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 Balachandranfd1029e2020-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 Balachandranfd1029e2020-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 Balachandranfd1029e2020-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 Balachandran69a0a692020-03-30 19:16:31 -0400306static void getComponentSizeAndOffset(int32_t format, PlaneLayoutComponent &comp) {
307 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;
318 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
319 comp.offsetInBits = 24;
320 }
321 break;
322 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGB_565):
323 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
324 comp.offsetInBits = 0;
325 comp.sizeInBits = 5;
326 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
327 comp.offsetInBits = 5;
328 comp.sizeInBits = 6;
329 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
330 comp.offsetInBits = 11;
331 comp.sizeInBits = 5;
332 }
333 break;
334 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGR_565):
335 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
336 comp.offsetInBits = 11;
337 comp.sizeInBits = 5;
338 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
339 comp.offsetInBits = 5;
340 comp.sizeInBits = 6;
341 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
342 comp.offsetInBits = 0;
343 comp.sizeInBits = 5;
344 }
345 break;
346 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRA_8888):
347 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRX_8888):
348 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGR_888):
349 comp.sizeInBits = 8;
350 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
351 comp.offsetInBits = 16;
352 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
353 comp.offsetInBits = 8;
354 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
355 comp.offsetInBits = 0;
356 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
357 comp.offsetInBits = 24;
358 }
359 break;
360 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_5551):
361 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
362 comp.sizeInBits = 5;
363 comp.offsetInBits = 0;
364 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
365 comp.sizeInBits = 5;
366 comp.offsetInBits = 5;
367 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
368 comp.sizeInBits = 5;
369 comp.offsetInBits = 10;
370 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
371 comp.sizeInBits = 1;
372 comp.offsetInBits = 15;
373 }
374 break;
375 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_4444):
376 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
377 comp.sizeInBits = 4;
378 comp.offsetInBits = 0;
379 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
380 comp.sizeInBits = 4;
381 comp.offsetInBits = 4;
382 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
383 comp.sizeInBits = 4;
384 comp.offsetInBits = 8;
385 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
386 comp.sizeInBits = 4;
387 comp.offsetInBits = 12;
388 }
389 break;
390 case static_cast<int32_t>(HAL_PIXEL_FORMAT_R_8):
391 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RG_88):
392 comp.sizeInBits = 8;
393 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
394 comp.offsetInBits = 0;
395 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
396 comp.offsetInBits = 8;
397 }
398 break;
399 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_1010102):
400 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBX_1010102):
401 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
402 comp.sizeInBits = 10;
403 comp.offsetInBits = 0;
404 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
405 comp.sizeInBits = 10;
406 comp.offsetInBits = 10;
407 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
408 comp.sizeInBits = 10;
409 comp.offsetInBits = 20;
410 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
411 comp.sizeInBits = 2;
412 comp.offsetInBits = 30;
413 }
414 break;
415 case static_cast<int32_t>(HAL_PIXEL_FORMAT_ARGB_2101010):
416 case static_cast<int32_t>(HAL_PIXEL_FORMAT_XRGB_2101010):
417 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
418 comp.sizeInBits = 10;
419 comp.offsetInBits = 2;
420 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
421 comp.sizeInBits = 10;
422 comp.offsetInBits = 12;
423 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
424 comp.sizeInBits = 10;
425 comp.offsetInBits = 22;
426 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
427 comp.sizeInBits = 2;
428 comp.offsetInBits = 0;
429 }
430 break;
431 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRA_1010102):
432 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRX_1010102):
433 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
434 comp.sizeInBits = 10;
435 comp.offsetInBits = 20;
436 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
437 comp.sizeInBits = 10;
438 comp.offsetInBits = 10;
439 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
440 comp.sizeInBits = 10;
441 comp.offsetInBits = 0;
442 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
443 comp.sizeInBits = 2;
444 comp.offsetInBits = 30;
445 }
446 break;
447 case static_cast<int32_t>(HAL_PIXEL_FORMAT_ABGR_2101010):
448 case static_cast<int32_t>(HAL_PIXEL_FORMAT_XBGR_2101010):
449 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
450 comp.sizeInBits = 10;
451 comp.offsetInBits = 22;
452 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
453 comp.sizeInBits = 10;
454 comp.offsetInBits = 12;
455 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
456 comp.sizeInBits = 10;
457 comp.offsetInBits = 2;
458 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
459 comp.sizeInBits = 2;
460 comp.offsetInBits = 0;
461 }
462 break;
463 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_FP16):
464 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
465 comp.sizeInBits = 16;
466 comp.offsetInBits = 0;
467 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
468 comp.sizeInBits = 16;
469 comp.offsetInBits = 16;
470 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
471 comp.sizeInBits = 16;
472 comp.offsetInBits = 32;
473 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
474 comp.sizeInBits = 16;
475 comp.offsetInBits = 48;
476 }
477 break;
478 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_SP):
479 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_422_SP):
480 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS):
481 case static_cast<int32_t>(HAL_PIXEL_FORMAT_NV12_ENCODEABLE):
482 comp.sizeInBits = 8;
483 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
484 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value) {
485 comp.offsetInBits = 0;
486 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
487 comp.offsetInBits = 8;
488 }
489 break;
490 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP):
491 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_422_SP):
492 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO):
493 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS):
494 case static_cast<int32_t>(HAL_PIXEL_FORMAT_NV21_ZSL):
495 comp.sizeInBits = 8;
496 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
497 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
498 comp.offsetInBits = 0;
499 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value) {
500 comp.offsetInBits = 8;
501 }
502 break;
503 case static_cast<int32_t>(HAL_PIXEL_FORMAT_Y16):
504 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value) {
505 comp.offsetInBits = 0;
506 comp.sizeInBits = 16;
507 }
508 break;
509 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YV12):
510 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
511 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value ||
512 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
513 comp.offsetInBits = 0;
514 comp.sizeInBits = 8;
515 }
516 break;
517 case static_cast<int32_t>(HAL_PIXEL_FORMAT_Y8):
518 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value) {
519 comp.offsetInBits = 0;
520 comp.sizeInBits = 8;
521 }
522 break;
523 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_P010):
524 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
525 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value ||
526 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
527 comp.offsetInBits = 0;
528 comp.sizeInBits = 10;
529 }
530 break;
531 default:
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400532 break;
533 }
534}
535
536static void grallocToStandardPlaneLayoutComponentType(uint32_t in,
537 std::vector<PlaneLayoutComponent> *components,
538 int32_t format) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500539 PlaneLayoutComponent comp;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400540 comp.offsetInBits = -1;
541 comp.sizeInBits = -1;
542
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500543 if (in & PLANE_COMPONENT_Y) {
544 comp.type = android::gralloc4::PlaneLayoutComponentType_Y;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400545 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500546 components->push_back(comp);
547 }
548
549 if (in & PLANE_COMPONENT_Cb) {
550 comp.type = android::gralloc4::PlaneLayoutComponentType_CB;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400551 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500552 components->push_back(comp);
553 }
554
555 if (in & PLANE_COMPONENT_Cr) {
556 comp.type = android::gralloc4::PlaneLayoutComponentType_CR;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400557 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500558 components->push_back(comp);
559 }
560
561 if (in & PLANE_COMPONENT_R) {
562 comp.type = android::gralloc4::PlaneLayoutComponentType_R;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400563 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500564 components->push_back(comp);
565 }
566
567 if (in & PLANE_COMPONENT_G) {
568 comp.type = android::gralloc4::PlaneLayoutComponentType_G;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400569 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500570 components->push_back(comp);
571 }
572
573 if (in & PLANE_COMPONENT_B) {
574 comp.type = android::gralloc4::PlaneLayoutComponentType_B;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400575 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500576 components->push_back(comp);
577 }
578
579 if (in & PLANE_COMPONENT_A) {
580 comp.type = android::gralloc4::PlaneLayoutComponentType_A;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400581 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500582 components->push_back(comp);
583 }
584
585 if (in & PLANE_COMPONENT_RAW) {
586 comp.type = qtigralloc::PlaneLayoutComponentType_Raw;
587 components->push_back(comp);
588 }
589
590 if (in & PLANE_COMPONENT_META) {
591 comp.type = qtigralloc::PlaneLayoutComponentType_Meta;
592 components->push_back(comp);
593 }
594}
595
Tharaga Balachandran95175bb2020-03-20 13:26:55 -0400596static Error getFormatLayout(private_handle_t *handle, std::vector<PlaneLayout> *out) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500597 std::vector<PlaneLayout> plane_info;
598 int plane_count = 0;
599 BufferInfo info(handle->unaligned_width, handle->unaligned_height, handle->format, handle->usage);
600
601 gralloc::PlaneLayoutInfo plane_layout[8] = {};
602 if (gralloc::IsYuvFormat(handle->format)) {
603 gralloc::GetYUVPlaneInfo(info, handle->format, handle->width, handle->height, handle->flags,
604 &plane_count, plane_layout);
605 } else if (gralloc::IsUncompressedRGBFormat(handle->format) ||
606 gralloc::IsCompressedRGBFormat(handle->format)) {
607 gralloc::GetRGBPlaneInfo(info, handle->format, handle->width, handle->height, handle->flags,
608 &plane_count, plane_layout);
609 } else {
610 return Error::BAD_BUFFER;
611 }
612 plane_info.resize(plane_count);
613 for (int i = 0; i < plane_count; i++) {
614 std::vector<PlaneLayoutComponent> components;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400615 grallocToStandardPlaneLayoutComponentType(plane_layout[i].component, &plane_info[i].components,
616 handle->format);
Yichi Chena8304132020-03-23 12:23:48 +0800617 plane_info[i].horizontalSubsampling = (1ull << plane_layout[i].h_subsampling);
618 plane_info[i].verticalSubsampling = (1ull << plane_layout[i].v_subsampling);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500619 plane_info[i].offsetInBytes = static_cast<int64_t>(plane_layout[i].offset);
620 plane_info[i].sampleIncrementInBits = static_cast<int64_t>(plane_layout[i].step * 8);
621 plane_info[i].strideInBytes = static_cast<int64_t>(plane_layout[i].stride_bytes);
622 plane_info[i].totalSizeInBytes = static_cast<int64_t>(plane_layout[i].size);
Tharaga Balachandran95175bb2020-03-20 13:26:55 -0400623 plane_info[i].widthInSamples = handle->unaligned_width;
624 plane_info[i].heightInSamples = handle->unaligned_height;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500625 }
626 *out = plane_info;
627 return Error::NONE;
628}
629
Naseer Ahmede69031e2016-11-22 20:05:16 -0500630BufferManager::BufferManager() : next_id_(0) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530631 handles_map_.clear();
Naseer Ahmede69031e2016-11-22 20:05:16 -0500632 allocator_ = new Allocator();
633 allocator_->Init();
634}
635
Naseer Ahmede36f2242017-12-01 15:33:56 -0500636BufferManager *BufferManager::GetInstance() {
637 static BufferManager *instance = new BufferManager();
638 return instance;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530639}
640
641BufferManager::~BufferManager() {
642 if (allocator_) {
643 delete allocator_;
644 }
645}
646
Tharaga Balachandran576571c2020-01-23 18:41:10 -0500647void BufferManager::SetGrallocDebugProperties(gralloc::GrallocProperties props) {
648 allocator_->SetProperties(props);
649 AdrenoMemInfo::GetInstance()->AdrenoSetProperties(props);
650}
651
Naseer Ahmede36f2242017-12-01 15:33:56 -0500652Error BufferManager::FreeBuffer(std::shared_ptr<Buffer> buf) {
Naseer Ahmede69031e2016-11-22 20:05:16 -0500653 auto hnd = buf->handle;
Naseer Ahmeda186b472017-07-07 18:50:49 -0400654 ALOGD_IF(DEBUG, "FreeBuffer handle:%p", hnd);
655
656 if (private_handle_t::validate(hnd) != 0) {
657 ALOGE("FreeBuffer: Invalid handle: %p", hnd);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500658 return Error::BAD_BUFFER;
Naseer Ahmeda186b472017-07-07 18:50:49 -0400659 }
660
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -0400661 auto meta_size = getMetaDataSize(buf->reserved_size);
662
Naseer Ahmede36f2242017-12-01 15:33:56 -0500663 if (allocator_->FreeBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset, hnd->fd,
664 buf->ion_handle_main) != 0) {
665 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530666 }
667
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -0400668 if (allocator_->FreeBuffer(reinterpret_cast<void *>(hnd->base_metadata),
669 static_cast<uint32_t>(meta_size), hnd->offset_metadata,
670 hnd->fd_metadata, buf->ion_handle_meta) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500671 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530672 }
673
Naseer Ahmede36f2242017-12-01 15:33:56 -0500674 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
Naseer Ahmed29a86dd2017-03-16 14:09:46 -0400675 handle->fd = -1;
676 handle->fd_metadata = -1;
Naseer Ahmed2f8f8d42017-06-09 18:17:26 -0400677 if (!(handle->flags & private_handle_t::PRIV_FLAGS_CLIENT_ALLOCATED)) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500678 delete handle;
Naseer Ahmed2f8f8d42017-06-09 18:17:26 -0400679 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500680 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530681}
682
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500683Error BufferManager::ValidateBufferSize(private_handle_t const *hnd, BufferInfo info) {
684 unsigned int size, alignedw, alignedh;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530685 info.format = GetImplDefinedFormat(info.usage, info.format);
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700686 int ret = GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh);
687 if (ret < 0) {
688 return Error::BAD_BUFFER;
689 }
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500690 auto ion_fd_size = static_cast<unsigned int>(lseek(hnd->fd, 0, SEEK_END));
691 if (size != ion_fd_size) {
692 return Error::BAD_VALUE;
693 }
694 return Error::NONE;
695}
696
Naseer Ahmede36f2242017-12-01 15:33:56 -0500697void BufferManager::RegisterHandleLocked(const private_handle_t *hnd, int ion_handle,
Naseer Ahmed378d8582017-03-28 21:56:08 -0400698 int ion_handle_meta) {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400699 auto buffer = std::make_shared<Buffer>(hnd, ion_handle, ion_handle_meta);
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -0400700
701 if (hnd->base_metadata) {
702 auto metadata = reinterpret_cast<MetaData_t *>(hnd->base_metadata);
703#ifdef METADATA_V2
704 buffer->reserved_size = metadata->reservedSize;
705 if (buffer->reserved_size > 0) {
706 buffer->reserved_region_ptr =
707 reinterpret_cast<void *>(hnd->base_metadata + sizeof(MetaData_t));
708 } else {
709 buffer->reserved_region_ptr = nullptr;
710 }
711#else
712 buffer->reserved_region_ptr = reinterpret_cast<void *>(&(metadata->reservedRegion.data));
713 buffer->reserved_size = metadata->reservedRegion.size;
714#endif
715 }
716
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400717 handles_map_.emplace(std::make_pair(hnd, buffer));
718}
719
Naseer Ahmede36f2242017-12-01 15:33:56 -0500720Error BufferManager::ImportHandleLocked(private_handle_t *hnd) {
Ramkumar Radhakrishnan372b5ee2018-09-20 13:17:36 -0700721 if (private_handle_t::validate(hnd) != 0) {
722 ALOGE("ImportHandleLocked: Invalid handle: %p", hnd);
723 return Error::BAD_BUFFER;
724 }
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400725 ALOGD_IF(DEBUG, "Importing handle:%p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400726 int ion_handle = allocator_->ImportBuffer(hnd->fd);
727 if (ion_handle < 0) {
728 ALOGE("Failed to import ion buffer: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500729 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400730 }
731 int ion_handle_meta = allocator_->ImportBuffer(hnd->fd_metadata);
732 if (ion_handle_meta < 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500733 ALOGE("Failed to import ion metadata buffer: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd,
734 hnd->id);
735 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400736 }
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500737 // Initialize members that aren't transported
738 hnd->size = static_cast<unsigned int>(lseek(hnd->fd, 0, SEEK_END));
739 hnd->offset = 0;
740 hnd->offset_metadata = 0;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400741 hnd->base = 0;
742 hnd->base_metadata = 0;
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500743 hnd->gpuaddr = 0;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -0400744
745 if (validateAndMap(hnd)) {
746 ALOGE("Failed to map metadata: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd, hnd->id);
747 return Error::BAD_BUFFER;
748 }
749
Naseer Ahmed378d8582017-03-28 21:56:08 -0400750 RegisterHandleLocked(hnd, ion_handle, ion_handle_meta);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500751 return Error::NONE;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400752}
753
Naseer Ahmede36f2242017-12-01 15:33:56 -0500754std::shared_ptr<BufferManager::Buffer> BufferManager::GetBufferFromHandleLocked(
755 const private_handle_t *hnd) {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400756 auto it = handles_map_.find(hnd);
757 if (it != handles_map_.end()) {
758 return it->second;
759 } else {
760 return nullptr;
761 }
762}
763
Naseer Ahmede36f2242017-12-01 15:33:56 -0500764Error BufferManager::MapBuffer(private_handle_t const *handle) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530765 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400766 ALOGD_IF(DEBUG, "Map buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530767
768 hnd->base = 0;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530769 if (allocator_->MapBuffer(reinterpret_cast<void **>(&hnd->base), hnd->size, hnd->offset,
770 hnd->fd) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500771 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530772 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500773 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530774}
775
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500776Error BufferManager::IsBufferImported(const private_handle_t *hnd) {
777 std::lock_guard<std::mutex> lock(buffer_lock_);
778 auto buf = GetBufferFromHandleLocked(hnd);
779 if (buf != nullptr) {
780 return Error::NONE;
781 }
782 return Error::BAD_BUFFER;
783}
784
Naseer Ahmede36f2242017-12-01 15:33:56 -0500785Error BufferManager::RetainBuffer(private_handle_t const *hnd) {
Naseer Ahmed699b4572017-03-09 12:28:45 -0500786 ALOGD_IF(DEBUG, "Retain buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500787 auto err = Error::NONE;
Naseer Ahmed378d8582017-03-28 21:56:08 -0400788 std::lock_guard<std::mutex> lock(buffer_lock_);
789 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400790 if (buf != nullptr) {
791 buf->IncRef();
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530792 } else {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400793 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400794 err = ImportHandleLocked(handle);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530795 }
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400796 return err;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530797}
798
Naseer Ahmede36f2242017-12-01 15:33:56 -0500799Error BufferManager::ReleaseBuffer(private_handle_t const *hnd) {
Naseer Ahmeda186b472017-07-07 18:50:49 -0400800 ALOGD_IF(DEBUG, "Release buffer handle:%p", hnd);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400801 std::lock_guard<std::mutex> lock(buffer_lock_);
802 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400803 if (buf == nullptr) {
804 ALOGE("Could not find handle: %p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500805 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530806 } else {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400807 if (buf->DecRef()) {
808 handles_map_.erase(hnd);
809 // Unmap, close ion handle and close fd
Naseer Ahmede69031e2016-11-22 20:05:16 -0500810 FreeBuffer(buf);
811 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530812 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500813 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530814}
815
Naseer Ahmede36f2242017-12-01 15:33:56 -0500816Error BufferManager::LockBuffer(const private_handle_t *hnd, uint64_t usage) {
Naseer Ahmed378d8582017-03-28 21:56:08 -0400817 std::lock_guard<std::mutex> lock(buffer_lock_);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500818 auto err = Error::NONE;
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400819 ALOGD_IF(DEBUG, "LockBuffer buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530820
821 // If buffer is not meant for CPU return err
Naseer Ahmede36f2242017-12-01 15:33:56 -0500822 if (!CpuCanAccess(usage)) {
823 return Error::BAD_VALUE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530824 }
825
Naseer Ahmed378d8582017-03-28 21:56:08 -0400826 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400827 if (buf == nullptr) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500828 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530829 }
830
Naseer Ahmed67330702017-05-02 15:00:26 -0400831 if (hnd->base == 0) {
832 // we need to map for real
833 err = MapBuffer(hnd);
834 }
835
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530836 // Invalidate if CPU reads in software and there are non-CPU
837 // writers. No need to do this for the metadata buffer as it is
838 // only read/written in software.
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400839
840 // todo use handle here
Naseer Ahmede36f2242017-12-01 15:33:56 -0500841 if (err == Error::NONE && (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) &&
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530842 (hnd->flags & private_handle_t::PRIV_FLAGS_CACHED)) {
843 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
Rohit Kulkarni3ac98392017-10-20 12:04:34 -0700844 buf->ion_handle_main, CACHE_INVALIDATE, hnd->fd)) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500845 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530846 }
847 }
848
849 // Mark the buffer to be flushed after CPU write.
Naseer Ahmede36f2242017-12-01 15:33:56 -0500850 if (err == Error::NONE && CpuCanWrite(usage)) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530851 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
852 handle->flags |= private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
853 }
854
855 return err;
856}
Yichi Chena8304132020-03-23 12:23:48 +0800857
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500858Error BufferManager::FlushBuffer(const private_handle_t *handle) {
859 std::lock_guard<std::mutex> lock(buffer_lock_);
860 auto status = Error::NONE;
861
862 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
863 auto buf = GetBufferFromHandleLocked(hnd);
864 if (buf == nullptr) {
865 return Error::BAD_BUFFER;
866 }
867
868 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
869 buf->ion_handle_main, CACHE_CLEAN, hnd->fd) != 0) {
870 status = Error::BAD_BUFFER;
871 }
872
873 return status;
874}
875
876Error BufferManager::RereadBuffer(const private_handle_t *handle) {
877 std::lock_guard<std::mutex> lock(buffer_lock_);
878 auto status = Error::NONE;
879
880 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
881 auto buf = GetBufferFromHandleLocked(hnd);
882 if (buf == nullptr) {
883 return Error::BAD_BUFFER;
884 }
885
886 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
887 buf->ion_handle_main, CACHE_INVALIDATE, hnd->fd) != 0) {
888 status = Error::BAD_BUFFER;
889 }
890
891 return status;
892}
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530893
Naseer Ahmede36f2242017-12-01 15:33:56 -0500894Error BufferManager::UnlockBuffer(const private_handle_t *handle) {
Naseer Ahmed378d8582017-03-28 21:56:08 -0400895 std::lock_guard<std::mutex> lock(buffer_lock_);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500896 auto status = Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530897
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530898 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400899 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400900 if (buf == nullptr) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500901 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400902 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530903
904 if (hnd->flags & private_handle_t::PRIV_FLAGS_NEEDS_FLUSH) {
905 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
Rohit Kulkarni3ac98392017-10-20 12:04:34 -0700906 buf->ion_handle_main, CACHE_CLEAN, hnd->fd) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500907 status = Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530908 }
909 hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
Rohit Kulkarnib20abe72018-03-13 16:55:10 -0700910 } else {
911 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
912 buf->ion_handle_main, CACHE_READ_DONE, hnd->fd) != 0) {
913 status = Error::BAD_BUFFER;
914 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530915 }
916
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530917 return status;
918}
919
Naseer Ahmede36f2242017-12-01 15:33:56 -0500920Error BufferManager::AllocateBuffer(const BufferDescriptor &descriptor, buffer_handle_t *handle,
Tharaga Balachandranab150ab2019-09-26 19:17:58 -0400921 unsigned int bufferSize, bool testAlloc) {
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400922 if (!handle)
Naseer Ahmede36f2242017-12-01 15:33:56 -0500923 return Error::BAD_BUFFER;
924 std::lock_guard<std::mutex> buffer_lock(buffer_lock_);
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400925
Naseer Ahmede36f2242017-12-01 15:33:56 -0500926 uint64_t usage = descriptor.GetUsage();
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530927 int format = GetImplDefinedFormat(usage, descriptor.GetFormat());
Naseer Ahmedbaa39c52017-03-27 14:00:07 -0400928 uint32_t layer_count = descriptor.GetLayerCount();
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400929
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400930 unsigned int size;
931 unsigned int alignedw, alignedh;
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700932 int err = 0;
Naseer Ahmed95dc2882017-07-26 18:12:12 -0400933
934 int buffer_type = GetBufferType(format);
Saurabh Shah14c8e5b2017-04-07 10:37:23 -0700935 BufferInfo info = GetBufferInfo(descriptor);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500936 info.format = format;
Saurabh Dubey70957382018-05-15 16:05:32 +0530937 info.layer_count = layer_count;
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400938
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530939 GraphicsMetadata graphics_metadata = {};
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700940 err = GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh, &graphics_metadata);
941 if (err < 0) {
942 return Error::BAD_DESCRIPTOR;
943 }
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530944
Tharaga Balachandranab150ab2019-09-26 19:17:58 -0400945 if (testAlloc) {
946 return Error::NONE;
947 }
948
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530949 size = (bufferSize >= size) ? bufferSize : size;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530950 uint64_t flags = 0;
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400951 auto page_size = UINT(getpagesize());
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530952 AllocData data;
Naseer Ahmede36f2242017-12-01 15:33:56 -0500953 data.align = GetDataAlignment(format, usage);
Naseer Ahmedf8e9c432017-06-13 17:45:12 -0400954 data.size = size;
Naseer Ahmede36f2242017-12-01 15:33:56 -0500955 data.handle = (uintptr_t)handle;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530956 data.uncached = UseUncached(format, usage);
Naseer Ahmede69031e2016-11-22 20:05:16 -0500957
958 // Allocate buffer memory
Rohit Kulkarnib20abe72018-03-13 16:55:10 -0700959 err = allocator_->AllocateMem(&data, usage, format);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530960 if (err) {
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700961 ALOGE("gralloc failed to allocate err=%s format %d size %d WxH %dx%d usage %" PRIu64,
962 strerror(-err), format, size, alignedw, alignedh, usage);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500963 return Error::NO_RESOURCES;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530964 }
965
Naseer Ahmede69031e2016-11-22 20:05:16 -0500966 // Allocate memory for MetaData
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530967 AllocData e_data;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -0400968 e_data.size = static_cast<unsigned int>(getMetaDataSize(descriptor.GetReservedSize()));
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530969 e_data.handle = data.handle;
Naseer Ahmede69031e2016-11-22 20:05:16 -0500970 e_data.align = page_size;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530971
Rohit Kulkarnib20abe72018-03-13 16:55:10 -0700972 err = allocator_->AllocateMem(&e_data, 0, 0);
Naseer Ahmede69031e2016-11-22 20:05:16 -0500973 if (err) {
974 ALOGE("gralloc failed to allocate metadata error=%s", strerror(-err));
Naseer Ahmede36f2242017-12-01 15:33:56 -0500975 return Error::NO_RESOURCES;
Naseer Ahmede69031e2016-11-22 20:05:16 -0500976 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530977
Naseer Ahmede36f2242017-12-01 15:33:56 -0500978 flags = GetHandleFlags(format, usage);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530979 flags |= data.alloc_type;
980
981 // Create handle
Naseer Ahmede36f2242017-12-01 15:33:56 -0500982 private_handle_t *hnd = new private_handle_t(
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530983 data.fd, e_data.fd, INT(flags), INT(alignedw), INT(alignedh), descriptor.GetWidth(),
Naseer Ahmede36f2242017-12-01 15:33:56 -0500984 descriptor.GetHeight(), format, buffer_type, data.size, usage);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530985
Naseer Ahmede69031e2016-11-22 20:05:16 -0500986 hnd->id = ++next_id_;
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400987 hnd->base = 0;
988 hnd->base_metadata = 0;
Naseer Ahmedbaa39c52017-03-27 14:00:07 -0400989 hnd->layer_count = layer_count;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500990
Arun Kumar K.R05746222018-04-04 10:45:58 +0530991 // set default csc as 709, but for video(yuv) its 601L
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500992
Arun Kumar K.R05746222018-04-04 10:45:58 +0530993 ColorSpace_t colorSpace = (buffer_type == BUFFER_TYPE_VIDEO) ? ITU_R_601 : ITU_R_709;
Praveen Chavancbaa5362018-07-06 18:19:46 -0700994 setMetaDataAndUnmap(hnd, UPDATE_COLOR_SPACE, reinterpret_cast<void *>(&colorSpace));
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530995
Saurabh Dubeyefd7f9e2018-06-15 18:00:02 +0530996 bool use_adreno_for_size = CanUseAdrenoForSize(buffer_type, usage);
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530997 if (use_adreno_for_size) {
Praveen Chavancbaa5362018-07-06 18:19:46 -0700998 setMetaDataAndUnmap(hnd, SET_GRAPHICS_METADATA, reinterpret_cast<void *>(&graphics_metadata));
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530999 }
1000
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001001#ifdef METADATA_V2
1002 auto error = validateAndMap(hnd, descriptor.GetReservedSize());
1003#else
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001004 auto error = validateAndMap(hnd);
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001005#endif
1006
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001007 if (error != 0) {
1008 ALOGE("validateAndMap failed");
1009 return Error::BAD_BUFFER;
1010 }
1011 auto metadata = reinterpret_cast<MetaData_t *>(hnd->base_metadata);
Yichi Chena8304132020-03-23 12:23:48 +08001012 auto nameLength = std::min(descriptor.GetName().size(), size_t(MAX_NAME_LEN - 1));
1013 nameLength = descriptor.GetName().copy(metadata->name, nameLength);
1014 metadata->name[nameLength] = '\0';
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001015
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001016#ifdef METADATA_V2
1017 metadata->reservedSize = descriptor.GetReservedSize();
1018#else
1019 metadata->reservedRegion.size =
1020 static_cast<uint32_t>(std::min(descriptor.GetReservedSize(), (uint64_t)RESERVED_REGION_SIZE));
1021#endif
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001022 metadata->crop.top = 0;
1023 metadata->crop.left = 0;
1024 metadata->crop.right = hnd->width;
1025 metadata->crop.bottom = hnd->height;
1026
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001027 unmapAndReset(hnd, descriptor.GetReservedSize());
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001028
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301029 *handle = hnd;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001030
Naseer Ahmed378d8582017-03-28 21:56:08 -04001031 RegisterHandleLocked(hnd, data.ion_handle, e_data.ion_handle);
Naseer Ahmed699b4572017-03-09 12:28:45 -05001032 ALOGD_IF(DEBUG, "Allocated buffer handle: %p id: %" PRIu64, hnd, hnd->id);
1033 if (DEBUG) {
1034 private_handle_t::Dump(hnd);
1035 }
Naseer Ahmede36f2242017-12-01 15:33:56 -05001036 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301037}
1038
Naseer Ahmede36f2242017-12-01 15:33:56 -05001039Error BufferManager::Dump(std::ostringstream *os) {
Uday Kiran Pichikab58d8842018-04-10 15:37:35 +05301040 std::lock_guard<std::mutex> buffer_lock(buffer_lock_);
Naseer Ahmeddc918132017-03-07 15:25:14 -05001041 for (auto it : handles_map_) {
1042 auto buf = it.second;
1043 auto hnd = buf->handle;
1044 *os << "handle id: " << std::setw(4) << hnd->id;
Naseer Ahmede36f2242017-12-01 15:33:56 -05001045 *os << " fd: " << std::setw(3) << hnd->fd;
1046 *os << " fd_meta: " << std::setw(3) << hnd->fd_metadata;
1047 *os << " wxh: " << std::setw(4) << hnd->width << " x " << std::setw(4) << hnd->height;
1048 *os << " uwxuh: " << std::setw(4) << hnd->unaligned_width << " x ";
1049 *os << std::setw(4) << hnd->unaligned_height;
1050 *os << " size: " << std::setw(9) << hnd->size;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001051 *os << std::hex << std::setfill('0');
Naseer Ahmede36f2242017-12-01 15:33:56 -05001052 *os << " priv_flags: "
1053 << "0x" << std::setw(8) << hnd->flags;
1054 *os << " usage: "
1055 << "0x" << std::setw(8) << hnd->usage;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001056 // TODO(user): get format string from qdutils
Naseer Ahmede36f2242017-12-01 15:33:56 -05001057 *os << " format: "
1058 << "0x" << std::setw(8) << hnd->format;
1059 *os << std::dec << std::setfill(' ') << std::endl;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001060 }
Naseer Ahmede36f2242017-12-01 15:33:56 -05001061 return Error::NONE;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001062}
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001063
1064// Get list of private handles in handles_map_
1065Error BufferManager::GetAllHandles(std::vector<const private_handle_t *> *out_handle_list) {
1066 std::lock_guard<std::mutex> lock(buffer_lock_);
1067 if (handles_map_.empty()) {
1068 return Error::NO_RESOURCES;
1069 }
1070 out_handle_list->reserve(handles_map_.size());
1071 for (auto handle : handles_map_) {
1072 out_handle_list->push_back(handle.first);
1073 }
1074 return Error::NONE;
1075}
Yichi Chena8304132020-03-23 12:23:48 +08001076
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001077Error BufferManager::GetReservedRegion(private_handle_t *handle, void **reserved_region,
1078 uint64_t *reserved_region_size) {
1079 std::lock_guard<std::mutex> lock(buffer_lock_);
1080 if (!handle)
1081 return Error::BAD_BUFFER;
1082
1083 auto buf = GetBufferFromHandleLocked(handle);
1084 if (buf == nullptr)
1085 return Error::BAD_BUFFER;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001086 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001087 return Error::BAD_BUFFER;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001088 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001089
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001090 *reserved_region = buf->reserved_region_ptr;
1091 *reserved_region_size = buf->reserved_size;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001092
1093 return Error::NONE;
1094}
1095
1096Error BufferManager::GetMetadata(private_handle_t *handle, int64_t metadatatype_value,
1097 hidl_vec<uint8_t> *out) {
1098 std::lock_guard<std::mutex> lock(buffer_lock_);
1099 if (!handle)
1100 return Error::BAD_BUFFER;
1101 auto buf = GetBufferFromHandleLocked(handle);
1102 if (buf == nullptr)
1103 return Error::BAD_BUFFER;
1104
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001105 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001106 return Error::BAD_BUFFER;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001107 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001108
1109 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1110
1111 Error error = Error::NONE;
1112 switch (metadatatype_value) {
1113 case (int64_t)StandardMetadataType::BUFFER_ID:
1114 android::gralloc4::encodeBufferId((uint64_t)handle->id, out);
1115 break;
1116 case (int64_t)StandardMetadataType::NAME: {
1117 std::string name(metadata->name);
1118 android::gralloc4::encodeName(name, out);
1119 break;
1120 }
1121 case (int64_t)StandardMetadataType::WIDTH:
1122 android::gralloc4::encodeWidth((uint64_t)handle->unaligned_width, out);
1123 break;
1124 case (int64_t)StandardMetadataType::HEIGHT:
1125 android::gralloc4::encodeHeight((uint64_t)handle->unaligned_height, out);
1126 break;
1127 case (int64_t)StandardMetadataType::LAYER_COUNT:
1128 android::gralloc4::encodeLayerCount((uint64_t)handle->layer_count, out);
1129 break;
1130 case (int64_t)StandardMetadataType::PIXEL_FORMAT_REQUESTED:
1131 // TODO(tbalacha): need to return IMPLEMENTATION_DEFINED,
1132 // which wouldn't be known from private_handle_t
1133 android::gralloc4::encodePixelFormatRequested((PixelFormat)handle->format, out);
1134 break;
1135 case (int64_t)StandardMetadataType::PIXEL_FORMAT_FOURCC: {
1136 uint32_t drm_format = 0;
1137 uint64_t drm_format_modifier = 0;
1138 GetDRMFormat(handle->format, handle->flags, &drm_format, &drm_format_modifier);
1139 android::gralloc4::encodePixelFormatFourCC(drm_format, out);
1140 break;
1141 }
1142 case (int64_t)StandardMetadataType::PIXEL_FORMAT_MODIFIER: {
1143 uint32_t drm_format = 0;
1144 uint64_t drm_format_modifier = 0;
1145 GetDRMFormat(handle->format, handle->flags, &drm_format, &drm_format_modifier);
1146 android::gralloc4::encodePixelFormatModifier(drm_format_modifier, out);
1147 break;
1148 }
1149 case (int64_t)StandardMetadataType::USAGE:
1150 android::gralloc4::encodeUsage((uint64_t)handle->usage, out);
1151 break;
1152 case (int64_t)StandardMetadataType::ALLOCATION_SIZE:
1153 android::gralloc4::encodeAllocationSize((uint64_t)handle->size, out);
1154 break;
1155 case (int64_t)StandardMetadataType::PROTECTED_CONTENT: {
1156 uint64_t protected_content = (handle->flags & qtigralloc::PRIV_FLAGS_SECURE_BUFFER) ? 1 : 0;
1157 android::gralloc4::encodeProtectedContent(protected_content, out);
1158 break;
1159 }
1160 case (int64_t)StandardMetadataType::CHROMA_SITING:
Tharaga Balachandran676e3092020-04-27 15:30:03 -04001161 android::gralloc4::encodeChromaSiting(android::gralloc4::ChromaSiting_None, out);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001162 break;
1163 case (int64_t)StandardMetadataType::DATASPACE:
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001164#ifdef METADATA_V2
1165 if (metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)]) {
1166#endif
1167 Dataspace dataspace;
1168 colorMetadataToDataspace(metadata->color, &dataspace);
1169 android::gralloc4::encodeDataspace(dataspace, out);
1170#ifdef METADATA_V2
1171 } else {
1172 android::gralloc4::encodeDataspace(Dataspace::UNKNOWN, out);
1173 }
1174#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001175 break;
1176 case (int64_t)StandardMetadataType::INTERLACED:
Tharaga Balachandran4629b4e2020-05-13 17:18:25 -04001177 if (metadata->interlaced > 0) {
1178 android::gralloc4::encodeInterlaced(qtigralloc::Interlaced_Qti, out);
1179 } else {
1180 android::gralloc4::encodeInterlaced(android::gralloc4::Interlaced_None, out);
1181 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001182 break;
1183 case (int64_t)StandardMetadataType::COMPRESSION:
1184 if (handle->flags & qtigralloc::PRIV_FLAGS_UBWC_ALIGNED ||
1185 handle->flags & qtigralloc::PRIV_FLAGS_UBWC_ALIGNED_PI) {
1186 android::gralloc4::encodeCompression(qtigralloc::Compression_QtiUBWC, out);
1187 } else {
1188 android::gralloc4::encodeCompression(android::gralloc4::Compression_None, out);
1189 }
1190 break;
1191 case (int64_t)StandardMetadataType::PLANE_LAYOUTS: {
1192 std::vector<PlaneLayout> plane_layouts;
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001193 getFormatLayout(handle, &plane_layouts);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001194 android::gralloc4::encodePlaneLayouts(plane_layouts, out);
1195 break;
1196 }
1197 case (int64_t)StandardMetadataType::BLEND_MODE:
1198 android::gralloc4::encodeBlendMode((BlendMode)metadata->blendMode, out);
1199 break;
1200 case (int64_t)StandardMetadataType::SMPTE2086: {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001201 if (metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled) {
1202 Smpte2086 mastering_display_values;
1203 mastering_display_values.primaryRed = {
1204 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][0]) /
1205 50000.0f,
1206 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][1]) /
1207 50000.0f};
1208 mastering_display_values.primaryGreen = {
1209 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][0]) /
1210 50000.0f,
1211 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][1]) /
1212 50000.0f};
1213 mastering_display_values.primaryBlue = {
1214 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][0]) /
1215 50000.0f,
1216 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][1]) /
1217 50000.0f};
1218 mastering_display_values.whitePoint = {
1219 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.whitePoint[0]) /
1220 50000.0f,
1221 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.whitePoint[1]) /
1222 50000.0f};
1223 mastering_display_values.maxLuminance =
1224 static_cast<float>(metadata->color.masteringDisplayInfo.maxDisplayLuminance);
1225 mastering_display_values.minLuminance =
1226 static_cast<float>(metadata->color.masteringDisplayInfo.minDisplayLuminance) / 10000.0f;
1227 android::gralloc4::encodeSmpte2086(mastering_display_values, out);
1228 } else {
1229 android::gralloc4::encodeSmpte2086(std::nullopt, out);
1230 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001231 break;
1232 }
1233 case (int64_t)StandardMetadataType::CTA861_3: {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001234 if (metadata->color.contentLightLevel.lightLevelSEIEnabled) {
1235 Cta861_3 content_light_level;
1236 content_light_level.maxContentLightLevel =
1237 static_cast<float>(metadata->color.contentLightLevel.maxContentLightLevel);
1238 content_light_level.maxFrameAverageLightLevel =
1239 static_cast<float>(metadata->color.contentLightLevel.minPicAverageLightLevel) /
1240 10000.0f;
1241 android::gralloc4::encodeCta861_3(content_light_level, out);
1242 } else {
1243 android::gralloc4::encodeCta861_3(std::nullopt, out);
1244 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001245 break;
1246 }
1247 case (int64_t)StandardMetadataType::SMPTE2094_40: {
Tharaga Balachandran2c9873c2020-03-10 12:49:18 -04001248 if (metadata->color.dynamicMetaDataValid &&
1249 metadata->color.dynamicMetaDataLen <= HDR_DYNAMIC_META_DATA_SZ) {
Yichi Chena8304132020-03-23 12:23:48 +08001250 std::vector<uint8_t> dynamic_metadata_payload;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001251 dynamic_metadata_payload.resize(metadata->color.dynamicMetaDataLen);
Yichi Chena8304132020-03-23 12:23:48 +08001252 dynamic_metadata_payload.assign(
1253 metadata->color.dynamicMetaDataPayload,
1254 metadata->color.dynamicMetaDataPayload + metadata->color.dynamicMetaDataLen);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001255 android::gralloc4::encodeSmpte2094_40(dynamic_metadata_payload, out);
1256 } else {
1257 android::gralloc4::encodeSmpte2094_40(std::nullopt, out);
1258 }
1259 break;
1260 }
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001261 case (int64_t)StandardMetadataType::CROP: {
1262 // Crop is the same for all planes
1263 std::vector<Rect> out_crop = {{metadata->crop.left, metadata->crop.top, metadata->crop.right,
1264 metadata->crop.bottom}};
1265 android::gralloc4::encodeCrop(out_crop, out);
1266 break;
1267 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001268 case QTI_VT_TIMESTAMP:
1269 android::gralloc4::encodeUint64(qtigralloc::MetadataType_VTTimestamp, metadata->vtTimeStamp,
1270 out);
1271 break;
1272 case QTI_COLOR_METADATA:
1273 qtigralloc::encodeColorMetadata(metadata->color, out);
1274 break;
1275 case QTI_PP_PARAM_INTERLACED:
1276 android::gralloc4::encodeInt32(qtigralloc::MetadataType_PPParamInterlaced,
1277 metadata->interlaced, out);
1278 break;
1279 case QTI_VIDEO_PERF_MODE:
1280 android::gralloc4::encodeUint32(qtigralloc::MetadataType_VideoPerfMode,
1281 metadata->isVideoPerfMode, out);
1282 break;
1283 case QTI_GRAPHICS_METADATA:
1284 qtigralloc::encodeGraphicsMetadata(metadata->graphics_metadata, out);
1285 break;
1286 case QTI_UBWC_CR_STATS_INFO:
1287 qtigralloc::encodeUBWCStats(metadata->ubwcCRStats, out);
1288 break;
1289 case QTI_REFRESH_RATE:
1290 android::gralloc4::encodeFloat(qtigralloc::MetadataType_RefreshRate, metadata->refreshrate,
1291 out);
1292 break;
1293 case QTI_MAP_SECURE_BUFFER:
1294 android::gralloc4::encodeInt32(qtigralloc::MetadataType_MapSecureBuffer,
1295 metadata->mapSecureBuffer, out);
1296 break;
1297 case QTI_LINEAR_FORMAT:
1298 android::gralloc4::encodeUint32(qtigralloc::MetadataType_LinearFormat, metadata->linearFormat,
1299 out);
1300 break;
1301 case QTI_SINGLE_BUFFER_MODE:
1302 android::gralloc4::encodeUint32(qtigralloc::MetadataType_SingleBufferMode,
1303 metadata->isSingleBufferMode, out);
1304 break;
1305 case QTI_CVP_METADATA:
1306 qtigralloc::encodeCVPMetadata(metadata->cvpMetadata, out);
1307 break;
1308 case QTI_VIDEO_HISTOGRAM_STATS:
1309 qtigralloc::encodeVideoHistogramMetadata(metadata->video_histogram_stats, out);
1310 break;
1311 case QTI_FD:
1312 android::gralloc4::encodeInt32(qtigralloc::MetadataType_FD, handle->fd, out);
1313 break;
1314 case QTI_PRIVATE_FLAGS:
1315 android::gralloc4::encodeInt32(qtigralloc::MetadataType_PrivateFlags, handle->flags, out);
1316 break;
Tharaga Balachandran70b03c72020-03-10 14:00:15 -04001317 case QTI_ALIGNED_WIDTH_IN_PIXELS:
1318 android::gralloc4::encodeUint32(qtigralloc::MetadataType_AlignedWidthInPixels, handle->width,
1319 out);
1320 break;
1321 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
1322 android::gralloc4::encodeUint32(qtigralloc::MetadataType_AlignedHeightInPixels,
1323 handle->height, out);
1324 break;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001325#ifdef METADATA_V2
1326 case QTI_STANDARD_METADATA_STATUS:
1327 qtigralloc::encodeMetadataState(metadata->isStandardMetadataSet, out);
1328 break;
1329 case QTI_VENDOR_METADATA_STATUS:
1330 qtigralloc::encodeMetadataState(metadata->isVendorMetadataSet, out);
1331 break;
1332#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001333 default:
1334 error = Error::UNSUPPORTED;
1335 }
1336
1337 return error;
1338}
1339
1340Error BufferManager::SetMetadata(private_handle_t *handle, int64_t metadatatype_value,
1341 hidl_vec<uint8_t> in) {
1342 std::lock_guard<std::mutex> lock(buffer_lock_);
1343 if (!handle)
1344 return Error::BAD_BUFFER;
1345
1346 auto buf = GetBufferFromHandleLocked(handle);
1347 if (buf == nullptr)
1348 return Error::BAD_BUFFER;
1349
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001350 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001351 return Error::BAD_BUFFER;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001352 }
Tharaga Balachandran96f24d02020-03-31 12:46:02 -04001353 if (in.size() == 0) {
1354 return Error::UNSUPPORTED;
1355 }
1356
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001357 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1358
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001359#ifdef METADATA_V2
1360 // By default, set these to true
1361 // Reset to false for special cases below
1362 if (IS_VENDOR_METADATA_TYPE(metadatatype_value)) {
1363 metadata->isVendorMetadataSet[GET_VENDOR_METADATA_STATUS_INDEX(metadatatype_value)] = true;
1364 } else {
1365 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] = true;
1366 }
1367#endif
1368
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001369 switch (metadatatype_value) {
1370 // These are constant (unchanged after allocation)
1371 case (int64_t)StandardMetadataType::BUFFER_ID:
1372 case (int64_t)StandardMetadataType::NAME:
1373 case (int64_t)StandardMetadataType::WIDTH:
1374 case (int64_t)StandardMetadataType::HEIGHT:
1375 case (int64_t)StandardMetadataType::LAYER_COUNT:
1376 case (int64_t)StandardMetadataType::PIXEL_FORMAT_REQUESTED:
1377 case (int64_t)StandardMetadataType::USAGE:
1378 return Error::BAD_VALUE;
1379 case (int64_t)StandardMetadataType::PIXEL_FORMAT_FOURCC:
1380 case (int64_t)StandardMetadataType::PIXEL_FORMAT_MODIFIER:
1381 case (int64_t)StandardMetadataType::PROTECTED_CONTENT:
1382 case (int64_t)StandardMetadataType::ALLOCATION_SIZE:
1383 case (int64_t)StandardMetadataType::PLANE_LAYOUTS:
1384 case (int64_t)StandardMetadataType::CHROMA_SITING:
1385 case (int64_t)StandardMetadataType::INTERLACED:
1386 case (int64_t)StandardMetadataType::COMPRESSION:
1387 case QTI_FD:
1388 case QTI_PRIVATE_FLAGS:
Tharaga Balachandran70b03c72020-03-10 14:00:15 -04001389 case QTI_ALIGNED_WIDTH_IN_PIXELS:
1390 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001391 return Error::UNSUPPORTED;
1392 case (int64_t)StandardMetadataType::DATASPACE:
1393 Dataspace dataspace;
1394 android::gralloc4::decodeDataspace(in, &dataspace);
1395 dataspaceToColorMetadata(dataspace, &metadata->color);
1396 break;
1397 case (int64_t)StandardMetadataType::BLEND_MODE:
1398 BlendMode mode;
1399 android::gralloc4::decodeBlendMode(in, &mode);
1400 metadata->blendMode = (int32_t)mode;
1401 break;
1402 case (int64_t)StandardMetadataType::SMPTE2086: {
1403 std::optional<Smpte2086> mastering_display_values;
1404 android::gralloc4::decodeSmpte2086(in, &mastering_display_values);
1405 if (mastering_display_values != std::nullopt) {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001406 metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = true;
1407
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001408 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][0] =
1409 static_cast<uint32_t>(mastering_display_values->primaryRed.x * 50000.0f);
1410 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][1] =
1411 static_cast<uint32_t>(mastering_display_values->primaryRed.y * 50000.0f);
1412
1413 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][0] =
1414 static_cast<uint32_t>(mastering_display_values->primaryGreen.x * 50000.0f);
1415 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][1] =
1416 static_cast<uint32_t>(mastering_display_values->primaryGreen.y * 50000.0f);
1417
1418 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][0] =
1419 static_cast<uint32_t>(mastering_display_values->primaryBlue.x * 50000.0f);
1420 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][1] =
1421 static_cast<uint32_t>(mastering_display_values->primaryBlue.y * 50000.0f);
1422
1423 metadata->color.masteringDisplayInfo.primaries.whitePoint[0] =
1424 static_cast<uint32_t>(mastering_display_values->whitePoint.x * 50000.0f);
1425 metadata->color.masteringDisplayInfo.primaries.whitePoint[1] =
1426 static_cast<uint32_t>(mastering_display_values->whitePoint.y * 50000.0f);
1427
1428 metadata->color.masteringDisplayInfo.maxDisplayLuminance =
1429 static_cast<uint32_t>(mastering_display_values->maxLuminance);
1430 metadata->color.masteringDisplayInfo.minDisplayLuminance =
1431 static_cast<uint32_t>(mastering_display_values->minLuminance * 10000.0f);
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001432 } else {
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001433#ifdef METADATA_V2
1434 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1435 false;
1436#endif
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001437 metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001438 }
1439 break;
1440 }
1441 case (int64_t)StandardMetadataType::CTA861_3: {
1442 std::optional<Cta861_3> content_light_level;
1443 android::gralloc4::decodeCta861_3(in, &content_light_level);
1444 if (content_light_level != std::nullopt) {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001445 metadata->color.contentLightLevel.lightLevelSEIEnabled = true;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001446 metadata->color.contentLightLevel.maxContentLightLevel =
1447 static_cast<uint32_t>(content_light_level->maxContentLightLevel);
1448 metadata->color.contentLightLevel.minPicAverageLightLevel =
1449 static_cast<uint32_t>(content_light_level->maxFrameAverageLightLevel * 10000.0f);
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001450 } else {
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001451#ifdef METADATA_V2
1452 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1453 false;
1454#endif
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001455 metadata->color.contentLightLevel.lightLevelSEIEnabled = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001456 }
1457 break;
1458 }
1459 case (int64_t)StandardMetadataType::SMPTE2094_40: {
1460 std::optional<std::vector<uint8_t>> dynamic_metadata_payload;
1461 android::gralloc4::decodeSmpte2094_40(in, &dynamic_metadata_payload);
1462 if (dynamic_metadata_payload != std::nullopt) {
Yichi Chena8304132020-03-23 12:23:48 +08001463 if (dynamic_metadata_payload->size() > HDR_DYNAMIC_META_DATA_SZ)
1464 return Error::BAD_VALUE;
1465
1466 metadata->color.dynamicMetaDataLen = static_cast<uint32_t>(dynamic_metadata_payload->size());
1467 std::copy(dynamic_metadata_payload->begin(), dynamic_metadata_payload->end(),
1468 metadata->color.dynamicMetaDataPayload);
1469 metadata->color.dynamicMetaDataValid = true;
Tharaga Balachandranf5861d52020-03-23 16:00:18 -04001470 } else {
1471 // Reset metadata by passing in std::nullopt
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001472#ifdef METADATA_V2
1473 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1474 false;
1475#endif
Tharaga Balachandranf5861d52020-03-23 16:00:18 -04001476 metadata->color.dynamicMetaDataValid = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001477 }
1478 break;
1479 }
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001480 case (int64_t)StandardMetadataType::CROP: {
1481 std::vector<Rect> in_crop;
1482 android::gralloc4::decodeCrop(in, &in_crop);
1483 if (in_crop.size() != 1)
1484 return Error::UNSUPPORTED;
1485
1486 metadata->crop.left = in_crop[0].left;
1487 metadata->crop.top = in_crop[0].top;
1488 metadata->crop.right = in_crop[0].right;
1489 metadata->crop.bottom = in_crop[0].bottom;
1490 break;
1491 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001492 case QTI_VT_TIMESTAMP:
1493 android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp, in,
1494 &metadata->vtTimeStamp);
1495 break;
1496 case QTI_COLOR_METADATA:
1497 ColorMetaData color;
1498 qtigralloc::decodeColorMetadata(in, &color);
1499 metadata->color = color;
1500 break;
1501 case QTI_PP_PARAM_INTERLACED:
1502 android::gralloc4::decodeInt32(qtigralloc::MetadataType_PPParamInterlaced, in,
1503 &metadata->interlaced);
1504 break;
1505 case QTI_VIDEO_PERF_MODE:
1506 android::gralloc4::decodeUint32(qtigralloc::MetadataType_VideoPerfMode, in,
1507 &metadata->isVideoPerfMode);
1508 break;
1509 case QTI_GRAPHICS_METADATA:
1510 qtigralloc::decodeGraphicsMetadata(in, &metadata->graphics_metadata);
1511 break;
1512 case QTI_UBWC_CR_STATS_INFO:
1513 qtigralloc::decodeUBWCStats(in, &metadata->ubwcCRStats[0]);
1514 break;
1515 case QTI_REFRESH_RATE:
1516 android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate, in,
1517 &metadata->refreshrate);
1518 break;
1519 case QTI_MAP_SECURE_BUFFER:
1520 android::gralloc4::decodeInt32(qtigralloc::MetadataType_MapSecureBuffer, in,
1521 &metadata->mapSecureBuffer);
1522 break;
1523 case QTI_LINEAR_FORMAT:
1524 android::gralloc4::decodeUint32(qtigralloc::MetadataType_LinearFormat, in,
1525 &metadata->linearFormat);
1526 break;
1527 case QTI_SINGLE_BUFFER_MODE:
1528 android::gralloc4::decodeUint32(qtigralloc::MetadataType_SingleBufferMode, in,
1529 &metadata->isSingleBufferMode);
1530 break;
1531 case QTI_CVP_METADATA:
1532 qtigralloc::decodeCVPMetadata(in, &metadata->cvpMetadata);
1533 break;
1534 case QTI_VIDEO_HISTOGRAM_STATS:
1535 qtigralloc::decodeVideoHistogramMetadata(in, &metadata->video_histogram_stats);
1536 break;
1537 default:
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001538#ifdef METADATA_V2
1539 if (IS_VENDOR_METADATA_TYPE(metadatatype_value)) {
1540 metadata->isVendorMetadataSet[GET_VENDOR_METADATA_STATUS_INDEX(metadatatype_value)] = false;
1541 } else {
1542 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1543 false;
1544 }
1545#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001546 return Error::BAD_VALUE;
1547 }
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001548
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001549 return Error::NONE;
1550}
1551
Naseer Ahmede36f2242017-12-01 15:33:56 -05001552} // namespace gralloc