blob: 64f36e11828df81eb49f66053bafa966a8e58dba [file] [log] [blame]
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301/*
Tharaga Balachandran576571c2020-01-23 18:41:10 -05002 * Copyright (c) 2011-2018, 2020 The Linux Foundation. All rights reserved.
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05303 * Not a Contribution
4 *
5 * Copyright (C) 2010 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
Naseer Ahmed699b4572017-03-09 12:28:45 -050020#define DEBUG 0
Saurabh Shah14c8e5b2017-04-07 10:37:23 -070021
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050022#include "gr_buf_mgr.h"
23
24#include <QtiGralloc.h>
25#include <QtiGrallocPriv.h>
26#include <gralloctypes/Gralloc4.h>
27#include <sys/mman.h>
28
Naseer Ahmeddc918132017-03-07 15:25:14 -050029#include <iomanip>
Naseer Ahmede36f2242017-12-01 15:33:56 -050030#include <sstream>
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050031#include <string>
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053032#include <utility>
Naseer Ahmede69031e2016-11-22 20:05:16 -050033#include <vector>
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053034
Tharaga Balachandran576571c2020-01-23 18:41:10 -050035#include "gr_adreno_info.h"
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053036#include "gr_buf_descriptor.h"
Naseer Ahmede36f2242017-12-01 15:33:56 -050037#include "gr_priv_handle.h"
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050038#include "gr_utils.h"
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053039#include "qdMetaData.h"
Naseer Ahmede36f2242017-12-01 15:33:56 -050040#include "qd_utils.h"
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053041
Naseer Ahmede36f2242017-12-01 15:33:56 -050042namespace gralloc {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053043
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050044using aidl::android::hardware::graphics::common::BlendMode;
45using aidl::android::hardware::graphics::common::Cta861_3;
46using aidl::android::hardware::graphics::common::Dataspace;
47using aidl::android::hardware::graphics::common::PlaneLayout;
48using aidl::android::hardware::graphics::common::PlaneLayoutComponent;
49using aidl::android::hardware::graphics::common::Rect;
50using aidl::android::hardware::graphics::common::Smpte2086;
51using aidl::android::hardware::graphics::common::StandardMetadataType;
52using aidl::android::hardware::graphics::common::XyColor;
53using ::android::hardware::graphics::common::V1_2::PixelFormat;
Tharaga Balachandran40648032020-05-01 10:54:31 -040054
Saurabh Shah14c8e5b2017-04-07 10:37:23 -070055static BufferInfo GetBufferInfo(const BufferDescriptor &descriptor) {
56 return BufferInfo(descriptor.GetWidth(), descriptor.GetHeight(), descriptor.GetFormat(),
Naseer Ahmede36f2242017-12-01 15:33:56 -050057 descriptor.GetUsage());
Saurabh Shah14c8e5b2017-04-07 10:37:23 -070058}
59
Tharaga Balachandran40648032020-05-01 10:54:31 -040060static uint64_t getMetaDataSize(uint64_t reserved_region_size) {
61// Only include the reserved region size when using Metadata_t V2
62#ifndef METADATA_V2
63 reserved_region_size = 0;
64#endif
65 return static_cast<uint64_t>(ROUND_UP_PAGESIZE(sizeof(MetaData_t) +
66 static_cast<uint32_t>(reserved_region_size)));
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050067}
68
Tharaga Balachandran40648032020-05-01 10:54:31 -040069static void unmapAndReset(private_handle_t *handle, uint64_t reserved_region_size = 0) {
70 if (private_handle_t::validate(handle) == 0 && handle->base_metadata) {
71 munmap(reinterpret_cast<void *>(handle->base_metadata),
72 static_cast<uint32_t>(getMetaDataSize(reserved_region_size)));
73 handle->base_metadata = 0;
74 }
75}
76
77static int validateAndMap(private_handle_t *handle, uint64_t reserved_region_size = 0) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050078 if (private_handle_t::validate(handle)) {
79 ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
80 return -1;
81 }
82 if (handle->fd_metadata < 0) {
83 // Silently return, metadata cannot be used
84 return -1;
85 }
86
87 if (!handle->base_metadata) {
Tharaga Balachandran40648032020-05-01 10:54:31 -040088 uint64_t size = getMetaDataSize(reserved_region_size);
89 void *base = mmap(NULL, static_cast<uint32_t>(size), PROT_READ | PROT_WRITE,
90 MAP_SHARED, handle->fd_metadata, 0);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050091 if (base == reinterpret_cast<void *>(MAP_FAILED)) {
92 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s", __func__, handle,
93 handle->fd_metadata, strerror(errno));
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050094 return -1;
95 }
96 handle->base_metadata = (uintptr_t)base;
Tharaga Balachandran40648032020-05-01 10:54:31 -040097#ifdef METADATA_V2
98 // The allocator process gets the reserved region size from the BufferDescriptor.
99 // When importing to another process, the reserved size is unknown until mapping the metadata,
100 // hence the re-mapping below
101 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
102 if (reserved_region_size == 0 && metadata->reservedSize) {
103 size = getMetaDataSize(metadata->reservedSize);
104 unmapAndReset(handle);
105 void *new_base = mmap(NULL, static_cast<uint32_t>(size), PROT_READ | PROT_WRITE, MAP_SHARED, handle->fd_metadata, 0);
106 if (new_base == reinterpret_cast<void *>(MAP_FAILED)) {
107 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s", __func__, handle,
108 handle->fd_metadata, strerror(errno));
109 return -1;
110 }
111 handle->base_metadata = (uintptr_t)new_base;
112 }
113#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500114 }
115 return 0;
116}
117
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500118static Error dataspaceToColorMetadata(Dataspace dataspace, ColorMetaData *color_metadata) {
119 ColorMetaData out;
120 uint32_t primaries = (uint32_t)dataspace & (uint32_t)Dataspace::STANDARD_MASK;
121 uint32_t transfer = (uint32_t)dataspace & (uint32_t)Dataspace::TRANSFER_MASK;
122 uint32_t range = (uint32_t)dataspace & (uint32_t)Dataspace::RANGE_MASK;
123
124 switch (primaries) {
125 case (uint32_t)Dataspace::STANDARD_BT709:
126 out.colorPrimaries = ColorPrimaries_BT709_5;
127 break;
128 // TODO(tbalacha): verify this is equivalent
129 case (uint32_t)Dataspace::STANDARD_BT470M:
130 out.colorPrimaries = ColorPrimaries_BT470_6M;
131 break;
132 case (uint32_t)Dataspace::STANDARD_BT601_625:
133 case (uint32_t)Dataspace::STANDARD_BT601_625_UNADJUSTED:
134 out.colorPrimaries = ColorPrimaries_BT601_6_625;
135 break;
136 case (uint32_t)Dataspace::STANDARD_BT601_525:
137 case (uint32_t)Dataspace::STANDARD_BT601_525_UNADJUSTED:
138 out.colorPrimaries = ColorPrimaries_BT601_6_525;
139 break;
140 case (uint32_t)Dataspace::STANDARD_FILM:
141 out.colorPrimaries = ColorPrimaries_GenericFilm;
142 break;
143 case (uint32_t)Dataspace::STANDARD_BT2020:
144 out.colorPrimaries = ColorPrimaries_BT2020;
145 break;
146 case (uint32_t)Dataspace::STANDARD_ADOBE_RGB:
147 out.colorPrimaries = ColorPrimaries_AdobeRGB;
148 break;
149 case (uint32_t)Dataspace::STANDARD_DCI_P3:
150 out.colorPrimaries = ColorPrimaries_DCIP3;
151 break;
152 default:
153 return Error::UNSUPPORTED;
154 /*
155 ColorPrimaries_SMPTE_240M;
156 ColorPrimaries_SMPTE_ST428;
157 ColorPrimaries_EBU3213;
158 */
159 }
160
161 switch (transfer) {
162 case (uint32_t)Dataspace::TRANSFER_SRGB:
163 out.transfer = Transfer_sRGB;
164 break;
165 case (uint32_t)Dataspace::TRANSFER_GAMMA2_2:
166 out.transfer = Transfer_Gamma2_2;
167 break;
168 case (uint32_t)Dataspace::TRANSFER_GAMMA2_8:
169 out.transfer = Transfer_Gamma2_8;
170 break;
171 case (uint32_t)Dataspace::TRANSFER_SMPTE_170M:
172 out.transfer = Transfer_SMPTE_170M;
173 break;
174 case (uint32_t)Dataspace::TRANSFER_LINEAR:
175 out.transfer = Transfer_Linear;
176 break;
177 case (uint32_t)Dataspace::TRANSFER_HLG:
178 out.transfer = Transfer_HLG;
179 break;
180 default:
181 return Error::UNSUPPORTED;
182 /*
183 Transfer_SMPTE_240M
184 Transfer_Log
185 Transfer_Log_Sqrt
186 Transfer_XvYCC
187 Transfer_BT1361
188 Transfer_sYCC
189 Transfer_BT2020_2_1
190 Transfer_BT2020_2_2
191 Transfer_SMPTE_ST2084
192 Transfer_ST_428
193 */
194 }
195
196 switch (range) {
197 case (uint32_t)Dataspace::RANGE_FULL:
198 out.range = Range_Full;
199 break;
200 case (uint32_t)Dataspace::RANGE_LIMITED:
201 out.range = Range_Limited;
202 break;
203 case (uint32_t)Dataspace::RANGE_EXTENDED:
204 out.range = Range_Extended;
205 break;
206 default:
207 return Error::UNSUPPORTED;
208 }
209
210 color_metadata->colorPrimaries = out.colorPrimaries;
211 color_metadata->transfer = out.transfer;
212 color_metadata->range = out.range;
213 return Error::NONE;
214}
215static Error colorMetadataToDataspace(ColorMetaData color_metadata, Dataspace *dataspace) {
216 Dataspace primaries, transfer, range = Dataspace::UNKNOWN;
217
218 switch (color_metadata.colorPrimaries) {
219 case ColorPrimaries_BT709_5:
220 primaries = Dataspace::STANDARD_BT709;
221 break;
222 // TODO(tbalacha): verify this is equivalent
223 case ColorPrimaries_BT470_6M:
224 primaries = Dataspace::STANDARD_BT470M;
225 break;
226 case ColorPrimaries_BT601_6_625:
227 primaries = Dataspace::STANDARD_BT601_625;
228 break;
229 case ColorPrimaries_BT601_6_525:
230 primaries = Dataspace::STANDARD_BT601_525;
231 break;
232 case ColorPrimaries_GenericFilm:
233 primaries = Dataspace::STANDARD_FILM;
234 break;
235 case ColorPrimaries_BT2020:
236 primaries = Dataspace::STANDARD_BT2020;
237 break;
238 case ColorPrimaries_AdobeRGB:
239 primaries = Dataspace::STANDARD_ADOBE_RGB;
240 break;
241 case ColorPrimaries_DCIP3:
242 primaries = Dataspace::STANDARD_DCI_P3;
243 break;
244 default:
245 return Error::UNSUPPORTED;
246 /*
247 ColorPrimaries_SMPTE_240M;
248 ColorPrimaries_SMPTE_ST428;
249 ColorPrimaries_EBU3213;
250 */
251 }
252
253 switch (color_metadata.transfer) {
254 case Transfer_sRGB:
255 transfer = Dataspace::TRANSFER_SRGB;
256 break;
257 case Transfer_Gamma2_2:
258 transfer = Dataspace::TRANSFER_GAMMA2_2;
259 break;
260 case Transfer_Gamma2_8:
261 transfer = Dataspace::TRANSFER_GAMMA2_8;
262 break;
263 case Transfer_SMPTE_170M:
264 transfer = Dataspace::TRANSFER_SMPTE_170M;
265 break;
266 case Transfer_Linear:
267 transfer = Dataspace::TRANSFER_LINEAR;
268 break;
269 case Transfer_HLG:
270 transfer = Dataspace::TRANSFER_HLG;
271 break;
272 default:
273 return Error::UNSUPPORTED;
274 /*
275 Transfer_SMPTE_240M
276 Transfer_Log
277 Transfer_Log_Sqrt
278 Transfer_XvYCC
279 Transfer_BT1361
280 Transfer_sYCC
281 Transfer_BT2020_2_1
282 Transfer_BT2020_2_2
283 Transfer_SMPTE_ST2084
284 Transfer_ST_428
285 */
286 }
287
288 switch (color_metadata.range) {
289 case Range_Full:
290 range = Dataspace::RANGE_FULL;
291 break;
292 case Range_Limited:
293 range = Dataspace::RANGE_LIMITED;
294 break;
295 case Range_Extended:
296 range = Dataspace::RANGE_EXTENDED;
297 break;
298 default:
299 return Error::UNSUPPORTED;
300 }
301
302 *dataspace = (Dataspace)((uint32_t)primaries | (uint32_t)transfer | (uint32_t)range);
303 return Error::NONE;
304}
305
Tharaga 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 Balachandran40648032020-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 Balachandran40648032020-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 Balachandran40648032020-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 Balachandran40648032020-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 Balachandran40648032020-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
Saurabh Dubeyefd7f9e2018-06-15 18:00:02 +0530991 bool use_adreno_for_size = CanUseAdrenoForSize(buffer_type, usage);
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530992 if (use_adreno_for_size) {
Praveen Chavancbaa5362018-07-06 18:19:46 -0700993 setMetaDataAndUnmap(hnd, SET_GRAPHICS_METADATA, reinterpret_cast<void *>(&graphics_metadata));
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530994 }
995
Tharaga Balachandran40648032020-05-01 10:54:31 -0400996#ifdef METADATA_V2
997 auto error = validateAndMap(hnd, descriptor.GetReservedSize());
998#else
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500999 auto error = validateAndMap(hnd);
Tharaga Balachandran40648032020-05-01 10:54:31 -04001000#endif
1001
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001002 if (error != 0) {
1003 ALOGE("validateAndMap failed");
1004 return Error::BAD_BUFFER;
1005 }
1006 auto metadata = reinterpret_cast<MetaData_t *>(hnd->base_metadata);
Yichi Chena8304132020-03-23 12:23:48 +08001007 auto nameLength = std::min(descriptor.GetName().size(), size_t(MAX_NAME_LEN - 1));
1008 nameLength = descriptor.GetName().copy(metadata->name, nameLength);
1009 metadata->name[nameLength] = '\0';
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001010
Tharaga Balachandran40648032020-05-01 10:54:31 -04001011#ifdef METADATA_V2
1012 metadata->reservedSize = descriptor.GetReservedSize();
1013#else
1014 metadata->reservedRegion.size =
1015 static_cast<uint32_t>(std::min(descriptor.GetReservedSize(), (uint64_t)RESERVED_REGION_SIZE));
1016#endif
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001017 metadata->crop.top = 0;
1018 metadata->crop.left = 0;
1019 metadata->crop.right = hnd->width;
1020 metadata->crop.bottom = hnd->height;
1021
Tharaga Balachandran40648032020-05-01 10:54:31 -04001022 unmapAndReset(hnd, descriptor.GetReservedSize());
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001023
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301024 *handle = hnd;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001025
Naseer Ahmed378d8582017-03-28 21:56:08 -04001026 RegisterHandleLocked(hnd, data.ion_handle, e_data.ion_handle);
Naseer Ahmed699b4572017-03-09 12:28:45 -05001027 ALOGD_IF(DEBUG, "Allocated buffer handle: %p id: %" PRIu64, hnd, hnd->id);
1028 if (DEBUG) {
1029 private_handle_t::Dump(hnd);
1030 }
Naseer Ahmede36f2242017-12-01 15:33:56 -05001031 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301032}
1033
Naseer Ahmede36f2242017-12-01 15:33:56 -05001034Error BufferManager::Dump(std::ostringstream *os) {
Uday Kiran Pichikab58d8842018-04-10 15:37:35 +05301035 std::lock_guard<std::mutex> buffer_lock(buffer_lock_);
Naseer Ahmeddc918132017-03-07 15:25:14 -05001036 for (auto it : handles_map_) {
1037 auto buf = it.second;
1038 auto hnd = buf->handle;
1039 *os << "handle id: " << std::setw(4) << hnd->id;
Naseer Ahmede36f2242017-12-01 15:33:56 -05001040 *os << " fd: " << std::setw(3) << hnd->fd;
1041 *os << " fd_meta: " << std::setw(3) << hnd->fd_metadata;
1042 *os << " wxh: " << std::setw(4) << hnd->width << " x " << std::setw(4) << hnd->height;
1043 *os << " uwxuh: " << std::setw(4) << hnd->unaligned_width << " x ";
1044 *os << std::setw(4) << hnd->unaligned_height;
1045 *os << " size: " << std::setw(9) << hnd->size;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001046 *os << std::hex << std::setfill('0');
Naseer Ahmede36f2242017-12-01 15:33:56 -05001047 *os << " priv_flags: "
1048 << "0x" << std::setw(8) << hnd->flags;
1049 *os << " usage: "
1050 << "0x" << std::setw(8) << hnd->usage;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001051 // TODO(user): get format string from qdutils
Naseer Ahmede36f2242017-12-01 15:33:56 -05001052 *os << " format: "
1053 << "0x" << std::setw(8) << hnd->format;
1054 *os << std::dec << std::setfill(' ') << std::endl;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001055 }
Naseer Ahmede36f2242017-12-01 15:33:56 -05001056 return Error::NONE;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001057}
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001058
1059// Get list of private handles in handles_map_
1060Error BufferManager::GetAllHandles(std::vector<const private_handle_t *> *out_handle_list) {
1061 std::lock_guard<std::mutex> lock(buffer_lock_);
1062 if (handles_map_.empty()) {
1063 return Error::NO_RESOURCES;
1064 }
1065 out_handle_list->reserve(handles_map_.size());
1066 for (auto handle : handles_map_) {
1067 out_handle_list->push_back(handle.first);
1068 }
1069 return Error::NONE;
1070}
Yichi Chena8304132020-03-23 12:23:48 +08001071
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001072Error BufferManager::GetReservedRegion(private_handle_t *handle, void **reserved_region,
1073 uint64_t *reserved_region_size) {
1074 std::lock_guard<std::mutex> lock(buffer_lock_);
1075 if (!handle)
1076 return Error::BAD_BUFFER;
1077
1078 auto buf = GetBufferFromHandleLocked(handle);
1079 if (buf == nullptr)
1080 return Error::BAD_BUFFER;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001081 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001082 return Error::BAD_BUFFER;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001083 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001084
Tharaga Balachandran40648032020-05-01 10:54:31 -04001085 *reserved_region = buf->reserved_region_ptr;
1086 *reserved_region_size = buf->reserved_size;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001087
1088 return Error::NONE;
1089}
1090
1091Error BufferManager::GetMetadata(private_handle_t *handle, int64_t metadatatype_value,
1092 hidl_vec<uint8_t> *out) {
1093 std::lock_guard<std::mutex> lock(buffer_lock_);
1094 if (!handle)
1095 return Error::BAD_BUFFER;
1096 auto buf = GetBufferFromHandleLocked(handle);
1097 if (buf == nullptr)
1098 return Error::BAD_BUFFER;
1099
Tharaga Balachandran40648032020-05-01 10:54:31 -04001100 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001101 return Error::BAD_BUFFER;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001102 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001103
1104 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1105
1106 Error error = Error::NONE;
1107 switch (metadatatype_value) {
1108 case (int64_t)StandardMetadataType::BUFFER_ID:
1109 android::gralloc4::encodeBufferId((uint64_t)handle->id, out);
1110 break;
1111 case (int64_t)StandardMetadataType::NAME: {
1112 std::string name(metadata->name);
1113 android::gralloc4::encodeName(name, out);
1114 break;
1115 }
1116 case (int64_t)StandardMetadataType::WIDTH:
1117 android::gralloc4::encodeWidth((uint64_t)handle->unaligned_width, out);
1118 break;
1119 case (int64_t)StandardMetadataType::HEIGHT:
1120 android::gralloc4::encodeHeight((uint64_t)handle->unaligned_height, out);
1121 break;
1122 case (int64_t)StandardMetadataType::LAYER_COUNT:
1123 android::gralloc4::encodeLayerCount((uint64_t)handle->layer_count, out);
1124 break;
1125 case (int64_t)StandardMetadataType::PIXEL_FORMAT_REQUESTED:
1126 // TODO(tbalacha): need to return IMPLEMENTATION_DEFINED,
1127 // which wouldn't be known from private_handle_t
1128 android::gralloc4::encodePixelFormatRequested((PixelFormat)handle->format, out);
1129 break;
1130 case (int64_t)StandardMetadataType::PIXEL_FORMAT_FOURCC: {
1131 uint32_t drm_format = 0;
1132 uint64_t drm_format_modifier = 0;
1133 GetDRMFormat(handle->format, handle->flags, &drm_format, &drm_format_modifier);
1134 android::gralloc4::encodePixelFormatFourCC(drm_format, out);
1135 break;
1136 }
1137 case (int64_t)StandardMetadataType::PIXEL_FORMAT_MODIFIER: {
1138 uint32_t drm_format = 0;
1139 uint64_t drm_format_modifier = 0;
1140 GetDRMFormat(handle->format, handle->flags, &drm_format, &drm_format_modifier);
1141 android::gralloc4::encodePixelFormatModifier(drm_format_modifier, out);
1142 break;
1143 }
1144 case (int64_t)StandardMetadataType::USAGE:
1145 android::gralloc4::encodeUsage((uint64_t)handle->usage, out);
1146 break;
1147 case (int64_t)StandardMetadataType::ALLOCATION_SIZE:
1148 android::gralloc4::encodeAllocationSize((uint64_t)handle->size, out);
1149 break;
1150 case (int64_t)StandardMetadataType::PROTECTED_CONTENT: {
1151 uint64_t protected_content = (handle->flags & qtigralloc::PRIV_FLAGS_SECURE_BUFFER) ? 1 : 0;
1152 android::gralloc4::encodeProtectedContent(protected_content, out);
1153 break;
1154 }
1155 case (int64_t)StandardMetadataType::CHROMA_SITING:
Tharaga Balachandran676e3092020-04-27 15:30:03 -04001156 android::gralloc4::encodeChromaSiting(android::gralloc4::ChromaSiting_None, out);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001157 break;
1158 case (int64_t)StandardMetadataType::DATASPACE:
Tharaga Balachandran40648032020-05-01 10:54:31 -04001159#ifdef METADATA_V2
1160 if (metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)]) {
1161#endif
1162 Dataspace dataspace;
1163 colorMetadataToDataspace(metadata->color, &dataspace);
1164 android::gralloc4::encodeDataspace(dataspace, out);
1165#ifdef METADATA_V2
1166 } else {
1167 android::gralloc4::encodeDataspace(Dataspace::UNKNOWN, out);
1168 }
1169#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001170 break;
1171 case (int64_t)StandardMetadataType::INTERLACED:
Tharaga Balachandran4629b4e2020-05-13 17:18:25 -04001172 if (metadata->interlaced > 0) {
1173 android::gralloc4::encodeInterlaced(qtigralloc::Interlaced_Qti, out);
1174 } else {
1175 android::gralloc4::encodeInterlaced(android::gralloc4::Interlaced_None, out);
1176 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001177 break;
1178 case (int64_t)StandardMetadataType::COMPRESSION:
1179 if (handle->flags & qtigralloc::PRIV_FLAGS_UBWC_ALIGNED ||
1180 handle->flags & qtigralloc::PRIV_FLAGS_UBWC_ALIGNED_PI) {
1181 android::gralloc4::encodeCompression(qtigralloc::Compression_QtiUBWC, out);
1182 } else {
1183 android::gralloc4::encodeCompression(android::gralloc4::Compression_None, out);
1184 }
1185 break;
1186 case (int64_t)StandardMetadataType::PLANE_LAYOUTS: {
1187 std::vector<PlaneLayout> plane_layouts;
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001188 getFormatLayout(handle, &plane_layouts);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001189 android::gralloc4::encodePlaneLayouts(plane_layouts, out);
1190 break;
1191 }
1192 case (int64_t)StandardMetadataType::BLEND_MODE:
1193 android::gralloc4::encodeBlendMode((BlendMode)metadata->blendMode, out);
1194 break;
1195 case (int64_t)StandardMetadataType::SMPTE2086: {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001196 if (metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled) {
1197 Smpte2086 mastering_display_values;
1198 mastering_display_values.primaryRed = {
1199 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][0]) /
1200 50000.0f,
1201 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][1]) /
1202 50000.0f};
1203 mastering_display_values.primaryGreen = {
1204 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][0]) /
1205 50000.0f,
1206 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][1]) /
1207 50000.0f};
1208 mastering_display_values.primaryBlue = {
1209 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][0]) /
1210 50000.0f,
1211 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][1]) /
1212 50000.0f};
1213 mastering_display_values.whitePoint = {
1214 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.whitePoint[0]) /
1215 50000.0f,
1216 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.whitePoint[1]) /
1217 50000.0f};
1218 mastering_display_values.maxLuminance =
1219 static_cast<float>(metadata->color.masteringDisplayInfo.maxDisplayLuminance);
1220 mastering_display_values.minLuminance =
1221 static_cast<float>(metadata->color.masteringDisplayInfo.minDisplayLuminance) / 10000.0f;
1222 android::gralloc4::encodeSmpte2086(mastering_display_values, out);
1223 } else {
1224 android::gralloc4::encodeSmpte2086(std::nullopt, out);
1225 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001226 break;
1227 }
1228 case (int64_t)StandardMetadataType::CTA861_3: {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001229 if (metadata->color.contentLightLevel.lightLevelSEIEnabled) {
1230 Cta861_3 content_light_level;
1231 content_light_level.maxContentLightLevel =
1232 static_cast<float>(metadata->color.contentLightLevel.maxContentLightLevel);
1233 content_light_level.maxFrameAverageLightLevel =
1234 static_cast<float>(metadata->color.contentLightLevel.minPicAverageLightLevel) /
1235 10000.0f;
1236 android::gralloc4::encodeCta861_3(content_light_level, out);
1237 } else {
1238 android::gralloc4::encodeCta861_3(std::nullopt, out);
1239 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001240 break;
1241 }
1242 case (int64_t)StandardMetadataType::SMPTE2094_40: {
Tharaga Balachandran2c9873c2020-03-10 12:49:18 -04001243 if (metadata->color.dynamicMetaDataValid &&
1244 metadata->color.dynamicMetaDataLen <= HDR_DYNAMIC_META_DATA_SZ) {
Yichi Chena8304132020-03-23 12:23:48 +08001245 std::vector<uint8_t> dynamic_metadata_payload;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001246 dynamic_metadata_payload.resize(metadata->color.dynamicMetaDataLen);
Yichi Chena8304132020-03-23 12:23:48 +08001247 dynamic_metadata_payload.assign(
1248 metadata->color.dynamicMetaDataPayload,
1249 metadata->color.dynamicMetaDataPayload + metadata->color.dynamicMetaDataLen);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001250 android::gralloc4::encodeSmpte2094_40(dynamic_metadata_payload, out);
1251 } else {
1252 android::gralloc4::encodeSmpte2094_40(std::nullopt, out);
1253 }
1254 break;
1255 }
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001256 case (int64_t)StandardMetadataType::CROP: {
1257 // Crop is the same for all planes
1258 std::vector<Rect> out_crop = {{metadata->crop.left, metadata->crop.top, metadata->crop.right,
1259 metadata->crop.bottom}};
1260 android::gralloc4::encodeCrop(out_crop, out);
1261 break;
1262 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001263 case QTI_VT_TIMESTAMP:
1264 android::gralloc4::encodeUint64(qtigralloc::MetadataType_VTTimestamp, metadata->vtTimeStamp,
1265 out);
1266 break;
1267 case QTI_COLOR_METADATA:
1268 qtigralloc::encodeColorMetadata(metadata->color, out);
1269 break;
1270 case QTI_PP_PARAM_INTERLACED:
1271 android::gralloc4::encodeInt32(qtigralloc::MetadataType_PPParamInterlaced,
1272 metadata->interlaced, out);
1273 break;
1274 case QTI_VIDEO_PERF_MODE:
1275 android::gralloc4::encodeUint32(qtigralloc::MetadataType_VideoPerfMode,
1276 metadata->isVideoPerfMode, out);
1277 break;
1278 case QTI_GRAPHICS_METADATA:
1279 qtigralloc::encodeGraphicsMetadata(metadata->graphics_metadata, out);
1280 break;
1281 case QTI_UBWC_CR_STATS_INFO:
1282 qtigralloc::encodeUBWCStats(metadata->ubwcCRStats, out);
1283 break;
1284 case QTI_REFRESH_RATE:
1285 android::gralloc4::encodeFloat(qtigralloc::MetadataType_RefreshRate, metadata->refreshrate,
1286 out);
1287 break;
1288 case QTI_MAP_SECURE_BUFFER:
1289 android::gralloc4::encodeInt32(qtigralloc::MetadataType_MapSecureBuffer,
1290 metadata->mapSecureBuffer, out);
1291 break;
1292 case QTI_LINEAR_FORMAT:
1293 android::gralloc4::encodeUint32(qtigralloc::MetadataType_LinearFormat, metadata->linearFormat,
1294 out);
1295 break;
1296 case QTI_SINGLE_BUFFER_MODE:
1297 android::gralloc4::encodeUint32(qtigralloc::MetadataType_SingleBufferMode,
1298 metadata->isSingleBufferMode, out);
1299 break;
1300 case QTI_CVP_METADATA:
1301 qtigralloc::encodeCVPMetadata(metadata->cvpMetadata, out);
1302 break;
1303 case QTI_VIDEO_HISTOGRAM_STATS:
1304 qtigralloc::encodeVideoHistogramMetadata(metadata->video_histogram_stats, out);
1305 break;
1306 case QTI_FD:
1307 android::gralloc4::encodeInt32(qtigralloc::MetadataType_FD, handle->fd, out);
1308 break;
1309 case QTI_PRIVATE_FLAGS:
1310 android::gralloc4::encodeInt32(qtigralloc::MetadataType_PrivateFlags, handle->flags, out);
1311 break;
Tharaga Balachandran70b03c72020-03-10 14:00:15 -04001312 case QTI_ALIGNED_WIDTH_IN_PIXELS:
1313 android::gralloc4::encodeUint32(qtigralloc::MetadataType_AlignedWidthInPixels, handle->width,
1314 out);
1315 break;
1316 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
1317 android::gralloc4::encodeUint32(qtigralloc::MetadataType_AlignedHeightInPixels,
1318 handle->height, out);
1319 break;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001320#ifdef METADATA_V2
1321 case QTI_STANDARD_METADATA_STATUS:
1322 qtigralloc::encodeMetadataState(metadata->isStandardMetadataSet, out);
1323 break;
1324 case QTI_VENDOR_METADATA_STATUS:
1325 qtigralloc::encodeMetadataState(metadata->isVendorMetadataSet, out);
1326 break;
1327#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001328 default:
1329 error = Error::UNSUPPORTED;
1330 }
1331
1332 return error;
1333}
1334
1335Error BufferManager::SetMetadata(private_handle_t *handle, int64_t metadatatype_value,
1336 hidl_vec<uint8_t> in) {
1337 std::lock_guard<std::mutex> lock(buffer_lock_);
1338 if (!handle)
1339 return Error::BAD_BUFFER;
1340
1341 auto buf = GetBufferFromHandleLocked(handle);
1342 if (buf == nullptr)
1343 return Error::BAD_BUFFER;
1344
Tharaga Balachandran40648032020-05-01 10:54:31 -04001345 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001346 return Error::BAD_BUFFER;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001347 }
Tharaga Balachandran96f24d02020-03-31 12:46:02 -04001348 if (in.size() == 0) {
1349 return Error::UNSUPPORTED;
1350 }
1351
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001352 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1353
Tharaga Balachandran40648032020-05-01 10:54:31 -04001354#ifdef METADATA_V2
1355 // By default, set these to true
1356 // Reset to false for special cases below
1357 if (IS_VENDOR_METADATA_TYPE(metadatatype_value)) {
1358 metadata->isVendorMetadataSet[GET_VENDOR_METADATA_STATUS_INDEX(metadatatype_value)] = true;
Venkat Thogaru2a4ae302020-07-27 18:46:14 +05301359 } else if (GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value) < METADATA_SET_SIZE) {
Tharaga Balachandran40648032020-05-01 10:54:31 -04001360 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] = true;
1361 }
1362#endif
1363
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001364 switch (metadatatype_value) {
1365 // These are constant (unchanged after allocation)
1366 case (int64_t)StandardMetadataType::BUFFER_ID:
1367 case (int64_t)StandardMetadataType::NAME:
1368 case (int64_t)StandardMetadataType::WIDTH:
1369 case (int64_t)StandardMetadataType::HEIGHT:
1370 case (int64_t)StandardMetadataType::LAYER_COUNT:
1371 case (int64_t)StandardMetadataType::PIXEL_FORMAT_REQUESTED:
1372 case (int64_t)StandardMetadataType::USAGE:
1373 return Error::BAD_VALUE;
1374 case (int64_t)StandardMetadataType::PIXEL_FORMAT_FOURCC:
1375 case (int64_t)StandardMetadataType::PIXEL_FORMAT_MODIFIER:
1376 case (int64_t)StandardMetadataType::PROTECTED_CONTENT:
1377 case (int64_t)StandardMetadataType::ALLOCATION_SIZE:
1378 case (int64_t)StandardMetadataType::PLANE_LAYOUTS:
1379 case (int64_t)StandardMetadataType::CHROMA_SITING:
1380 case (int64_t)StandardMetadataType::INTERLACED:
1381 case (int64_t)StandardMetadataType::COMPRESSION:
1382 case QTI_FD:
1383 case QTI_PRIVATE_FLAGS:
Tharaga Balachandran70b03c72020-03-10 14:00:15 -04001384 case QTI_ALIGNED_WIDTH_IN_PIXELS:
1385 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001386 return Error::UNSUPPORTED;
1387 case (int64_t)StandardMetadataType::DATASPACE:
1388 Dataspace dataspace;
1389 android::gralloc4::decodeDataspace(in, &dataspace);
1390 dataspaceToColorMetadata(dataspace, &metadata->color);
1391 break;
1392 case (int64_t)StandardMetadataType::BLEND_MODE:
1393 BlendMode mode;
1394 android::gralloc4::decodeBlendMode(in, &mode);
1395 metadata->blendMode = (int32_t)mode;
1396 break;
1397 case (int64_t)StandardMetadataType::SMPTE2086: {
1398 std::optional<Smpte2086> mastering_display_values;
1399 android::gralloc4::decodeSmpte2086(in, &mastering_display_values);
1400 if (mastering_display_values != std::nullopt) {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001401 metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = true;
1402
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001403 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][0] =
1404 static_cast<uint32_t>(mastering_display_values->primaryRed.x * 50000.0f);
1405 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][1] =
1406 static_cast<uint32_t>(mastering_display_values->primaryRed.y * 50000.0f);
1407
1408 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][0] =
1409 static_cast<uint32_t>(mastering_display_values->primaryGreen.x * 50000.0f);
1410 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][1] =
1411 static_cast<uint32_t>(mastering_display_values->primaryGreen.y * 50000.0f);
1412
1413 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][0] =
1414 static_cast<uint32_t>(mastering_display_values->primaryBlue.x * 50000.0f);
1415 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][1] =
1416 static_cast<uint32_t>(mastering_display_values->primaryBlue.y * 50000.0f);
1417
1418 metadata->color.masteringDisplayInfo.primaries.whitePoint[0] =
1419 static_cast<uint32_t>(mastering_display_values->whitePoint.x * 50000.0f);
1420 metadata->color.masteringDisplayInfo.primaries.whitePoint[1] =
1421 static_cast<uint32_t>(mastering_display_values->whitePoint.y * 50000.0f);
1422
1423 metadata->color.masteringDisplayInfo.maxDisplayLuminance =
1424 static_cast<uint32_t>(mastering_display_values->maxLuminance);
1425 metadata->color.masteringDisplayInfo.minDisplayLuminance =
1426 static_cast<uint32_t>(mastering_display_values->minLuminance * 10000.0f);
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001427 } else {
Tharaga Balachandran40648032020-05-01 10:54:31 -04001428#ifdef METADATA_V2
1429 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1430 false;
1431#endif
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001432 metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001433 }
1434 break;
1435 }
1436 case (int64_t)StandardMetadataType::CTA861_3: {
1437 std::optional<Cta861_3> content_light_level;
1438 android::gralloc4::decodeCta861_3(in, &content_light_level);
1439 if (content_light_level != std::nullopt) {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001440 metadata->color.contentLightLevel.lightLevelSEIEnabled = true;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001441 metadata->color.contentLightLevel.maxContentLightLevel =
1442 static_cast<uint32_t>(content_light_level->maxContentLightLevel);
1443 metadata->color.contentLightLevel.minPicAverageLightLevel =
1444 static_cast<uint32_t>(content_light_level->maxFrameAverageLightLevel * 10000.0f);
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001445 } else {
Tharaga Balachandran40648032020-05-01 10:54:31 -04001446#ifdef METADATA_V2
1447 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1448 false;
1449#endif
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001450 metadata->color.contentLightLevel.lightLevelSEIEnabled = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001451 }
1452 break;
1453 }
1454 case (int64_t)StandardMetadataType::SMPTE2094_40: {
1455 std::optional<std::vector<uint8_t>> dynamic_metadata_payload;
1456 android::gralloc4::decodeSmpte2094_40(in, &dynamic_metadata_payload);
1457 if (dynamic_metadata_payload != std::nullopt) {
Yichi Chena8304132020-03-23 12:23:48 +08001458 if (dynamic_metadata_payload->size() > HDR_DYNAMIC_META_DATA_SZ)
1459 return Error::BAD_VALUE;
1460
1461 metadata->color.dynamicMetaDataLen = static_cast<uint32_t>(dynamic_metadata_payload->size());
1462 std::copy(dynamic_metadata_payload->begin(), dynamic_metadata_payload->end(),
1463 metadata->color.dynamicMetaDataPayload);
1464 metadata->color.dynamicMetaDataValid = true;
Tharaga Balachandranf5861d52020-03-23 16:00:18 -04001465 } else {
1466 // Reset metadata by passing in std::nullopt
Tharaga Balachandran40648032020-05-01 10:54:31 -04001467#ifdef METADATA_V2
1468 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1469 false;
1470#endif
Tharaga Balachandranf5861d52020-03-23 16:00:18 -04001471 metadata->color.dynamicMetaDataValid = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001472 }
1473 break;
1474 }
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001475 case (int64_t)StandardMetadataType::CROP: {
1476 std::vector<Rect> in_crop;
1477 android::gralloc4::decodeCrop(in, &in_crop);
1478 if (in_crop.size() != 1)
1479 return Error::UNSUPPORTED;
1480
1481 metadata->crop.left = in_crop[0].left;
1482 metadata->crop.top = in_crop[0].top;
1483 metadata->crop.right = in_crop[0].right;
1484 metadata->crop.bottom = in_crop[0].bottom;
1485 break;
1486 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001487 case QTI_VT_TIMESTAMP:
1488 android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp, in,
1489 &metadata->vtTimeStamp);
1490 break;
1491 case QTI_COLOR_METADATA:
1492 ColorMetaData color;
1493 qtigralloc::decodeColorMetadata(in, &color);
1494 metadata->color = color;
1495 break;
1496 case QTI_PP_PARAM_INTERLACED:
1497 android::gralloc4::decodeInt32(qtigralloc::MetadataType_PPParamInterlaced, in,
1498 &metadata->interlaced);
1499 break;
1500 case QTI_VIDEO_PERF_MODE:
1501 android::gralloc4::decodeUint32(qtigralloc::MetadataType_VideoPerfMode, in,
1502 &metadata->isVideoPerfMode);
1503 break;
1504 case QTI_GRAPHICS_METADATA:
1505 qtigralloc::decodeGraphicsMetadata(in, &metadata->graphics_metadata);
1506 break;
1507 case QTI_UBWC_CR_STATS_INFO:
1508 qtigralloc::decodeUBWCStats(in, &metadata->ubwcCRStats[0]);
1509 break;
1510 case QTI_REFRESH_RATE:
1511 android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate, in,
1512 &metadata->refreshrate);
1513 break;
1514 case QTI_MAP_SECURE_BUFFER:
1515 android::gralloc4::decodeInt32(qtigralloc::MetadataType_MapSecureBuffer, in,
1516 &metadata->mapSecureBuffer);
1517 break;
1518 case QTI_LINEAR_FORMAT:
1519 android::gralloc4::decodeUint32(qtigralloc::MetadataType_LinearFormat, in,
1520 &metadata->linearFormat);
1521 break;
1522 case QTI_SINGLE_BUFFER_MODE:
1523 android::gralloc4::decodeUint32(qtigralloc::MetadataType_SingleBufferMode, in,
1524 &metadata->isSingleBufferMode);
1525 break;
1526 case QTI_CVP_METADATA:
1527 qtigralloc::decodeCVPMetadata(in, &metadata->cvpMetadata);
1528 break;
1529 case QTI_VIDEO_HISTOGRAM_STATS:
1530 qtigralloc::decodeVideoHistogramMetadata(in, &metadata->video_histogram_stats);
1531 break;
1532 default:
Tharaga Balachandran40648032020-05-01 10:54:31 -04001533#ifdef METADATA_V2
1534 if (IS_VENDOR_METADATA_TYPE(metadatatype_value)) {
1535 metadata->isVendorMetadataSet[GET_VENDOR_METADATA_STATUS_INDEX(metadatatype_value)] = false;
Venkat Thogaru2a4ae302020-07-27 18:46:14 +05301536 } else if (GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value) < METADATA_SET_SIZE) {
Tharaga Balachandran40648032020-05-01 10:54:31 -04001537 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1538 false;
1539 }
1540#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001541 return Error::BAD_VALUE;
1542 }
Tharaga Balachandran40648032020-05-01 10:54:31 -04001543
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001544 return Error::NONE;
1545}
1546
Naseer Ahmede36f2242017-12-01 15:33:56 -05001547} // namespace gralloc