blob: 620b8c1d1f2312fd960f3029b3220b07ca51ff23 [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;
Yichi Chen24d146c2020-05-27 20:16:13 +0800531 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW16):
532 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_RAW.value) {
533 comp.offsetInBits = 0;
534 comp.sizeInBits = 16;
535 } else {
536 return Error::BAD_VALUE;
537 }
538 break;
539 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW12):
540 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW10):
541 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_RAW.value) {
542 comp.offsetInBits = 0;
543 comp.sizeInBits = -1;
544 } else {
545 return Error::BAD_VALUE;
546 }
547 break;
548 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW8):
549 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_RAW.value) {
550 comp.offsetInBits = 0;
551 comp.sizeInBits = 8;
552 } else {
553 return Error::BAD_VALUE;
554 }
555 break;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400556 default:
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400557 break;
558 }
559}
560
561static void grallocToStandardPlaneLayoutComponentType(uint32_t in,
562 std::vector<PlaneLayoutComponent> *components,
563 int32_t format) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500564 PlaneLayoutComponent comp;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400565 comp.offsetInBits = -1;
566 comp.sizeInBits = -1;
567
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500568 if (in & PLANE_COMPONENT_Y) {
569 comp.type = android::gralloc4::PlaneLayoutComponentType_Y;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400570 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500571 components->push_back(comp);
572 }
573
574 if (in & PLANE_COMPONENT_Cb) {
575 comp.type = android::gralloc4::PlaneLayoutComponentType_CB;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400576 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500577 components->push_back(comp);
578 }
579
580 if (in & PLANE_COMPONENT_Cr) {
581 comp.type = android::gralloc4::PlaneLayoutComponentType_CR;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400582 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500583 components->push_back(comp);
584 }
585
586 if (in & PLANE_COMPONENT_R) {
587 comp.type = android::gralloc4::PlaneLayoutComponentType_R;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400588 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500589 components->push_back(comp);
590 }
591
592 if (in & PLANE_COMPONENT_G) {
593 comp.type = android::gralloc4::PlaneLayoutComponentType_G;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400594 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500595 components->push_back(comp);
596 }
597
598 if (in & PLANE_COMPONENT_B) {
599 comp.type = android::gralloc4::PlaneLayoutComponentType_B;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400600 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500601 components->push_back(comp);
602 }
603
604 if (in & PLANE_COMPONENT_A) {
605 comp.type = android::gralloc4::PlaneLayoutComponentType_A;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400606 getComponentSizeAndOffset(format, comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500607 components->push_back(comp);
608 }
609
610 if (in & PLANE_COMPONENT_RAW) {
Yichi Chen24d146c2020-05-27 20:16:13 +0800611 comp.type = android::gralloc4::PlaneLayoutComponentType_RAW;
612 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
613 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500614 }
615
616 if (in & PLANE_COMPONENT_META) {
617 comp.type = qtigralloc::PlaneLayoutComponentType_Meta;
618 components->push_back(comp);
619 }
620}
621
Tharaga Balachandran95175bb2020-03-20 13:26:55 -0400622static Error getFormatLayout(private_handle_t *handle, std::vector<PlaneLayout> *out) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500623 std::vector<PlaneLayout> plane_info;
624 int plane_count = 0;
625 BufferInfo info(handle->unaligned_width, handle->unaligned_height, handle->format, handle->usage);
626
627 gralloc::PlaneLayoutInfo plane_layout[8] = {};
628 if (gralloc::IsYuvFormat(handle->format)) {
629 gralloc::GetYUVPlaneInfo(info, handle->format, handle->width, handle->height, handle->flags,
630 &plane_count, plane_layout);
631 } else if (gralloc::IsUncompressedRGBFormat(handle->format) ||
632 gralloc::IsCompressedRGBFormat(handle->format)) {
633 gralloc::GetRGBPlaneInfo(info, handle->format, handle->width, handle->height, handle->flags,
634 &plane_count, plane_layout);
635 } else {
636 return Error::BAD_BUFFER;
637 }
638 plane_info.resize(plane_count);
639 for (int i = 0; i < plane_count; i++) {
640 std::vector<PlaneLayoutComponent> components;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400641 grallocToStandardPlaneLayoutComponentType(plane_layout[i].component, &plane_info[i].components,
642 handle->format);
Yichi Chena8304132020-03-23 12:23:48 +0800643 plane_info[i].horizontalSubsampling = (1ull << plane_layout[i].h_subsampling);
644 plane_info[i].verticalSubsampling = (1ull << plane_layout[i].v_subsampling);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500645 plane_info[i].offsetInBytes = static_cast<int64_t>(plane_layout[i].offset);
646 plane_info[i].sampleIncrementInBits = static_cast<int64_t>(plane_layout[i].step * 8);
647 plane_info[i].strideInBytes = static_cast<int64_t>(plane_layout[i].stride_bytes);
648 plane_info[i].totalSizeInBytes = static_cast<int64_t>(plane_layout[i].size);
Tharaga Balachandran95175bb2020-03-20 13:26:55 -0400649 plane_info[i].widthInSamples = handle->unaligned_width;
650 plane_info[i].heightInSamples = handle->unaligned_height;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500651 }
652 *out = plane_info;
653 return Error::NONE;
654}
655
Naseer Ahmede69031e2016-11-22 20:05:16 -0500656BufferManager::BufferManager() : next_id_(0) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530657 handles_map_.clear();
Naseer Ahmede69031e2016-11-22 20:05:16 -0500658 allocator_ = new Allocator();
659 allocator_->Init();
660}
661
Naseer Ahmede36f2242017-12-01 15:33:56 -0500662BufferManager *BufferManager::GetInstance() {
663 static BufferManager *instance = new BufferManager();
664 return instance;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530665}
666
667BufferManager::~BufferManager() {
668 if (allocator_) {
669 delete allocator_;
670 }
671}
672
Tharaga Balachandran576571c2020-01-23 18:41:10 -0500673void BufferManager::SetGrallocDebugProperties(gralloc::GrallocProperties props) {
674 allocator_->SetProperties(props);
675 AdrenoMemInfo::GetInstance()->AdrenoSetProperties(props);
676}
677
Naseer Ahmede36f2242017-12-01 15:33:56 -0500678Error BufferManager::FreeBuffer(std::shared_ptr<Buffer> buf) {
Naseer Ahmede69031e2016-11-22 20:05:16 -0500679 auto hnd = buf->handle;
Naseer Ahmeda186b472017-07-07 18:50:49 -0400680 ALOGD_IF(DEBUG, "FreeBuffer handle:%p", hnd);
681
682 if (private_handle_t::validate(hnd) != 0) {
683 ALOGE("FreeBuffer: Invalid handle: %p", hnd);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500684 return Error::BAD_BUFFER;
Naseer Ahmeda186b472017-07-07 18:50:49 -0400685 }
686
Tharaga Balachandran40648032020-05-01 10:54:31 -0400687 auto meta_size = getMetaDataSize(buf->reserved_size);
688
Naseer Ahmede36f2242017-12-01 15:33:56 -0500689 if (allocator_->FreeBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset, hnd->fd,
690 buf->ion_handle_main) != 0) {
691 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530692 }
693
Tharaga Balachandran40648032020-05-01 10:54:31 -0400694 if (allocator_->FreeBuffer(reinterpret_cast<void *>(hnd->base_metadata),
695 static_cast<uint32_t>(meta_size), hnd->offset_metadata,
696 hnd->fd_metadata, buf->ion_handle_meta) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500697 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530698 }
699
Naseer Ahmede36f2242017-12-01 15:33:56 -0500700 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
Naseer Ahmed29a86dd2017-03-16 14:09:46 -0400701 handle->fd = -1;
702 handle->fd_metadata = -1;
Naseer Ahmed2f8f8d42017-06-09 18:17:26 -0400703 if (!(handle->flags & private_handle_t::PRIV_FLAGS_CLIENT_ALLOCATED)) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500704 delete handle;
Naseer Ahmed2f8f8d42017-06-09 18:17:26 -0400705 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500706 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530707}
708
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500709Error BufferManager::ValidateBufferSize(private_handle_t const *hnd, BufferInfo info) {
710 unsigned int size, alignedw, alignedh;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530711 info.format = GetImplDefinedFormat(info.usage, info.format);
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700712 int ret = GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh);
713 if (ret < 0) {
714 return Error::BAD_BUFFER;
715 }
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500716 auto ion_fd_size = static_cast<unsigned int>(lseek(hnd->fd, 0, SEEK_END));
717 if (size != ion_fd_size) {
718 return Error::BAD_VALUE;
719 }
720 return Error::NONE;
721}
722
Naseer Ahmede36f2242017-12-01 15:33:56 -0500723void BufferManager::RegisterHandleLocked(const private_handle_t *hnd, int ion_handle,
Naseer Ahmed378d8582017-03-28 21:56:08 -0400724 int ion_handle_meta) {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400725 auto buffer = std::make_shared<Buffer>(hnd, ion_handle, ion_handle_meta);
Tharaga Balachandran40648032020-05-01 10:54:31 -0400726
727 if (hnd->base_metadata) {
728 auto metadata = reinterpret_cast<MetaData_t *>(hnd->base_metadata);
729#ifdef METADATA_V2
730 buffer->reserved_size = metadata->reservedSize;
731 if (buffer->reserved_size > 0) {
732 buffer->reserved_region_ptr =
733 reinterpret_cast<void *>(hnd->base_metadata + sizeof(MetaData_t));
734 } else {
735 buffer->reserved_region_ptr = nullptr;
736 }
737#else
738 buffer->reserved_region_ptr = reinterpret_cast<void *>(&(metadata->reservedRegion.data));
739 buffer->reserved_size = metadata->reservedRegion.size;
740#endif
741 }
742
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400743 handles_map_.emplace(std::make_pair(hnd, buffer));
744}
745
Naseer Ahmede36f2242017-12-01 15:33:56 -0500746Error BufferManager::ImportHandleLocked(private_handle_t *hnd) {
Ramkumar Radhakrishnan372b5ee2018-09-20 13:17:36 -0700747 if (private_handle_t::validate(hnd) != 0) {
748 ALOGE("ImportHandleLocked: Invalid handle: %p", hnd);
749 return Error::BAD_BUFFER;
750 }
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400751 ALOGD_IF(DEBUG, "Importing handle:%p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400752 int ion_handle = allocator_->ImportBuffer(hnd->fd);
753 if (ion_handle < 0) {
754 ALOGE("Failed to import ion buffer: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500755 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400756 }
757 int ion_handle_meta = allocator_->ImportBuffer(hnd->fd_metadata);
758 if (ion_handle_meta < 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500759 ALOGE("Failed to import ion metadata buffer: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd,
760 hnd->id);
761 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400762 }
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500763 // Initialize members that aren't transported
764 hnd->size = static_cast<unsigned int>(lseek(hnd->fd, 0, SEEK_END));
765 hnd->offset = 0;
766 hnd->offset_metadata = 0;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400767 hnd->base = 0;
768 hnd->base_metadata = 0;
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500769 hnd->gpuaddr = 0;
Tharaga Balachandran40648032020-05-01 10:54:31 -0400770
771 if (validateAndMap(hnd)) {
772 ALOGE("Failed to map metadata: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd, hnd->id);
773 return Error::BAD_BUFFER;
774 }
775
Naseer Ahmed378d8582017-03-28 21:56:08 -0400776 RegisterHandleLocked(hnd, ion_handle, ion_handle_meta);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500777 return Error::NONE;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400778}
779
Naseer Ahmede36f2242017-12-01 15:33:56 -0500780std::shared_ptr<BufferManager::Buffer> BufferManager::GetBufferFromHandleLocked(
781 const private_handle_t *hnd) {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400782 auto it = handles_map_.find(hnd);
783 if (it != handles_map_.end()) {
784 return it->second;
785 } else {
786 return nullptr;
787 }
788}
789
Naseer Ahmede36f2242017-12-01 15:33:56 -0500790Error BufferManager::MapBuffer(private_handle_t const *handle) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530791 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400792 ALOGD_IF(DEBUG, "Map buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530793
794 hnd->base = 0;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530795 if (allocator_->MapBuffer(reinterpret_cast<void **>(&hnd->base), hnd->size, hnd->offset,
796 hnd->fd) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500797 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530798 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500799 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530800}
801
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500802Error BufferManager::IsBufferImported(const private_handle_t *hnd) {
803 std::lock_guard<std::mutex> lock(buffer_lock_);
804 auto buf = GetBufferFromHandleLocked(hnd);
805 if (buf != nullptr) {
806 return Error::NONE;
807 }
808 return Error::BAD_BUFFER;
809}
810
Naseer Ahmede36f2242017-12-01 15:33:56 -0500811Error BufferManager::RetainBuffer(private_handle_t const *hnd) {
Naseer Ahmed699b4572017-03-09 12:28:45 -0500812 ALOGD_IF(DEBUG, "Retain buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500813 auto err = Error::NONE;
Naseer Ahmed378d8582017-03-28 21:56:08 -0400814 std::lock_guard<std::mutex> lock(buffer_lock_);
815 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400816 if (buf != nullptr) {
817 buf->IncRef();
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530818 } else {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400819 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400820 err = ImportHandleLocked(handle);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530821 }
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400822 return err;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530823}
824
Naseer Ahmede36f2242017-12-01 15:33:56 -0500825Error BufferManager::ReleaseBuffer(private_handle_t const *hnd) {
Naseer Ahmeda186b472017-07-07 18:50:49 -0400826 ALOGD_IF(DEBUG, "Release buffer handle:%p", hnd);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400827 std::lock_guard<std::mutex> lock(buffer_lock_);
828 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400829 if (buf == nullptr) {
830 ALOGE("Could not find handle: %p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500831 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530832 } else {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400833 if (buf->DecRef()) {
834 handles_map_.erase(hnd);
835 // Unmap, close ion handle and close fd
Naseer Ahmede69031e2016-11-22 20:05:16 -0500836 FreeBuffer(buf);
837 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530838 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500839 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530840}
841
Naseer Ahmede36f2242017-12-01 15:33:56 -0500842Error BufferManager::LockBuffer(const private_handle_t *hnd, uint64_t usage) {
Naseer Ahmed378d8582017-03-28 21:56:08 -0400843 std::lock_guard<std::mutex> lock(buffer_lock_);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500844 auto err = Error::NONE;
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400845 ALOGD_IF(DEBUG, "LockBuffer buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530846
847 // If buffer is not meant for CPU return err
Naseer Ahmede36f2242017-12-01 15:33:56 -0500848 if (!CpuCanAccess(usage)) {
849 return Error::BAD_VALUE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530850 }
851
Naseer Ahmed378d8582017-03-28 21:56:08 -0400852 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400853 if (buf == nullptr) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500854 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530855 }
856
Naseer Ahmed67330702017-05-02 15:00:26 -0400857 if (hnd->base == 0) {
858 // we need to map for real
859 err = MapBuffer(hnd);
860 }
861
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530862 // Invalidate if CPU reads in software and there are non-CPU
863 // writers. No need to do this for the metadata buffer as it is
864 // only read/written in software.
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400865
866 // todo use handle here
Naseer Ahmede36f2242017-12-01 15:33:56 -0500867 if (err == Error::NONE && (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) &&
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530868 (hnd->flags & private_handle_t::PRIV_FLAGS_CACHED)) {
869 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
Rohit Kulkarni3ac98392017-10-20 12:04:34 -0700870 buf->ion_handle_main, CACHE_INVALIDATE, hnd->fd)) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500871 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530872 }
873 }
874
875 // Mark the buffer to be flushed after CPU write.
Naseer Ahmede36f2242017-12-01 15:33:56 -0500876 if (err == Error::NONE && CpuCanWrite(usage)) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530877 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
878 handle->flags |= private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
879 }
880
881 return err;
882}
Yichi Chena8304132020-03-23 12:23:48 +0800883
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500884Error BufferManager::FlushBuffer(const private_handle_t *handle) {
885 std::lock_guard<std::mutex> lock(buffer_lock_);
886 auto status = Error::NONE;
887
888 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
889 auto buf = GetBufferFromHandleLocked(hnd);
890 if (buf == nullptr) {
891 return Error::BAD_BUFFER;
892 }
893
894 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
895 buf->ion_handle_main, CACHE_CLEAN, hnd->fd) != 0) {
896 status = Error::BAD_BUFFER;
897 }
898
899 return status;
900}
901
902Error BufferManager::RereadBuffer(const private_handle_t *handle) {
903 std::lock_guard<std::mutex> lock(buffer_lock_);
904 auto status = Error::NONE;
905
906 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
907 auto buf = GetBufferFromHandleLocked(hnd);
908 if (buf == nullptr) {
909 return Error::BAD_BUFFER;
910 }
911
912 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
913 buf->ion_handle_main, CACHE_INVALIDATE, hnd->fd) != 0) {
914 status = Error::BAD_BUFFER;
915 }
916
917 return status;
918}
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530919
Naseer Ahmede36f2242017-12-01 15:33:56 -0500920Error BufferManager::UnlockBuffer(const private_handle_t *handle) {
Naseer Ahmed378d8582017-03-28 21:56:08 -0400921 std::lock_guard<std::mutex> lock(buffer_lock_);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500922 auto status = Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530923
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530924 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400925 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400926 if (buf == nullptr) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500927 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400928 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530929
930 if (hnd->flags & private_handle_t::PRIV_FLAGS_NEEDS_FLUSH) {
931 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
Rohit Kulkarni3ac98392017-10-20 12:04:34 -0700932 buf->ion_handle_main, CACHE_CLEAN, hnd->fd) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500933 status = Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530934 }
935 hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
Rohit Kulkarnib20abe72018-03-13 16:55:10 -0700936 } else {
937 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
938 buf->ion_handle_main, CACHE_READ_DONE, hnd->fd) != 0) {
939 status = Error::BAD_BUFFER;
940 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530941 }
942
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530943 return status;
944}
945
Naseer Ahmede36f2242017-12-01 15:33:56 -0500946Error BufferManager::AllocateBuffer(const BufferDescriptor &descriptor, buffer_handle_t *handle,
Tharaga Balachandranab150ab2019-09-26 19:17:58 -0400947 unsigned int bufferSize, bool testAlloc) {
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400948 if (!handle)
Naseer Ahmede36f2242017-12-01 15:33:56 -0500949 return Error::BAD_BUFFER;
950 std::lock_guard<std::mutex> buffer_lock(buffer_lock_);
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400951
Naseer Ahmede36f2242017-12-01 15:33:56 -0500952 uint64_t usage = descriptor.GetUsage();
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530953 int format = GetImplDefinedFormat(usage, descriptor.GetFormat());
Naseer Ahmedbaa39c52017-03-27 14:00:07 -0400954 uint32_t layer_count = descriptor.GetLayerCount();
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400955
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400956 unsigned int size;
957 unsigned int alignedw, alignedh;
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700958 int err = 0;
Naseer Ahmed95dc2882017-07-26 18:12:12 -0400959
960 int buffer_type = GetBufferType(format);
Saurabh Shah14c8e5b2017-04-07 10:37:23 -0700961 BufferInfo info = GetBufferInfo(descriptor);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500962 info.format = format;
Saurabh Dubey70957382018-05-15 16:05:32 +0530963 info.layer_count = layer_count;
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400964
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530965 GraphicsMetadata graphics_metadata = {};
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700966 err = GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh, &graphics_metadata);
967 if (err < 0) {
968 return Error::BAD_DESCRIPTOR;
969 }
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530970
Tharaga Balachandranab150ab2019-09-26 19:17:58 -0400971 if (testAlloc) {
972 return Error::NONE;
973 }
974
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +0530975 size = (bufferSize >= size) ? bufferSize : size;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530976 uint64_t flags = 0;
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400977 auto page_size = UINT(getpagesize());
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530978 AllocData data;
Naseer Ahmede36f2242017-12-01 15:33:56 -0500979 data.align = GetDataAlignment(format, usage);
Naseer Ahmedf8e9c432017-06-13 17:45:12 -0400980 data.size = size;
Naseer Ahmede36f2242017-12-01 15:33:56 -0500981 data.handle = (uintptr_t)handle;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530982 data.uncached = UseUncached(format, usage);
Naseer Ahmede69031e2016-11-22 20:05:16 -0500983
984 // Allocate buffer memory
Rohit Kulkarnib20abe72018-03-13 16:55:10 -0700985 err = allocator_->AllocateMem(&data, usage, format);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530986 if (err) {
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700987 ALOGE("gralloc failed to allocate err=%s format %d size %d WxH %dx%d usage %" PRIu64,
988 strerror(-err), format, size, alignedw, alignedh, usage);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500989 return Error::NO_RESOURCES;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530990 }
991
Naseer Ahmede69031e2016-11-22 20:05:16 -0500992 // Allocate memory for MetaData
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530993 AllocData e_data;
Tharaga Balachandran40648032020-05-01 10:54:31 -0400994 e_data.size = static_cast<unsigned int>(getMetaDataSize(descriptor.GetReservedSize()));
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530995 e_data.handle = data.handle;
Naseer Ahmede69031e2016-11-22 20:05:16 -0500996 e_data.align = page_size;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530997
Rohit Kulkarnib20abe72018-03-13 16:55:10 -0700998 err = allocator_->AllocateMem(&e_data, 0, 0);
Naseer Ahmede69031e2016-11-22 20:05:16 -0500999 if (err) {
1000 ALOGE("gralloc failed to allocate metadata error=%s", strerror(-err));
Naseer Ahmede36f2242017-12-01 15:33:56 -05001001 return Error::NO_RESOURCES;
Naseer Ahmede69031e2016-11-22 20:05:16 -05001002 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301003
Naseer Ahmede36f2242017-12-01 15:33:56 -05001004 flags = GetHandleFlags(format, usage);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301005 flags |= data.alloc_type;
1006
1007 // Create handle
Naseer Ahmede36f2242017-12-01 15:33:56 -05001008 private_handle_t *hnd = new private_handle_t(
Saurabh Dubey48b757d2018-05-24 19:13:53 +05301009 data.fd, e_data.fd, INT(flags), INT(alignedw), INT(alignedh), descriptor.GetWidth(),
Naseer Ahmede36f2242017-12-01 15:33:56 -05001010 descriptor.GetHeight(), format, buffer_type, data.size, usage);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301011
Naseer Ahmede69031e2016-11-22 20:05:16 -05001012 hnd->id = ++next_id_;
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -04001013 hnd->base = 0;
1014 hnd->base_metadata = 0;
Naseer Ahmedbaa39c52017-03-27 14:00:07 -04001015 hnd->layer_count = layer_count;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001016
Saurabh Dubeyefd7f9e2018-06-15 18:00:02 +05301017 bool use_adreno_for_size = CanUseAdrenoForSize(buffer_type, usage);
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +05301018 if (use_adreno_for_size) {
Praveen Chavancbaa5362018-07-06 18:19:46 -07001019 setMetaDataAndUnmap(hnd, SET_GRAPHICS_METADATA, reinterpret_cast<void *>(&graphics_metadata));
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +05301020 }
1021
Tharaga Balachandran40648032020-05-01 10:54:31 -04001022#ifdef METADATA_V2
1023 auto error = validateAndMap(hnd, descriptor.GetReservedSize());
1024#else
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001025 auto error = validateAndMap(hnd);
Tharaga Balachandran40648032020-05-01 10:54:31 -04001026#endif
1027
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001028 if (error != 0) {
1029 ALOGE("validateAndMap failed");
1030 return Error::BAD_BUFFER;
1031 }
1032 auto metadata = reinterpret_cast<MetaData_t *>(hnd->base_metadata);
Yichi Chena8304132020-03-23 12:23:48 +08001033 auto nameLength = std::min(descriptor.GetName().size(), size_t(MAX_NAME_LEN - 1));
1034 nameLength = descriptor.GetName().copy(metadata->name, nameLength);
1035 metadata->name[nameLength] = '\0';
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001036
Tharaga Balachandran40648032020-05-01 10:54:31 -04001037#ifdef METADATA_V2
1038 metadata->reservedSize = descriptor.GetReservedSize();
1039#else
1040 metadata->reservedRegion.size =
1041 static_cast<uint32_t>(std::min(descriptor.GetReservedSize(), (uint64_t)RESERVED_REGION_SIZE));
1042#endif
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001043 metadata->crop.top = 0;
1044 metadata->crop.left = 0;
1045 metadata->crop.right = hnd->width;
1046 metadata->crop.bottom = hnd->height;
1047
Tharaga Balachandran40648032020-05-01 10:54:31 -04001048 unmapAndReset(hnd, descriptor.GetReservedSize());
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001049
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301050 *handle = hnd;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001051
Naseer Ahmed378d8582017-03-28 21:56:08 -04001052 RegisterHandleLocked(hnd, data.ion_handle, e_data.ion_handle);
Naseer Ahmed699b4572017-03-09 12:28:45 -05001053 ALOGD_IF(DEBUG, "Allocated buffer handle: %p id: %" PRIu64, hnd, hnd->id);
1054 if (DEBUG) {
1055 private_handle_t::Dump(hnd);
1056 }
Naseer Ahmede36f2242017-12-01 15:33:56 -05001057 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301058}
1059
Naseer Ahmede36f2242017-12-01 15:33:56 -05001060Error BufferManager::Dump(std::ostringstream *os) {
Uday Kiran Pichikab58d8842018-04-10 15:37:35 +05301061 std::lock_guard<std::mutex> buffer_lock(buffer_lock_);
Naseer Ahmeddc918132017-03-07 15:25:14 -05001062 for (auto it : handles_map_) {
1063 auto buf = it.second;
1064 auto hnd = buf->handle;
1065 *os << "handle id: " << std::setw(4) << hnd->id;
Naseer Ahmede36f2242017-12-01 15:33:56 -05001066 *os << " fd: " << std::setw(3) << hnd->fd;
1067 *os << " fd_meta: " << std::setw(3) << hnd->fd_metadata;
1068 *os << " wxh: " << std::setw(4) << hnd->width << " x " << std::setw(4) << hnd->height;
1069 *os << " uwxuh: " << std::setw(4) << hnd->unaligned_width << " x ";
1070 *os << std::setw(4) << hnd->unaligned_height;
1071 *os << " size: " << std::setw(9) << hnd->size;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001072 *os << std::hex << std::setfill('0');
Naseer Ahmede36f2242017-12-01 15:33:56 -05001073 *os << " priv_flags: "
1074 << "0x" << std::setw(8) << hnd->flags;
1075 *os << " usage: "
1076 << "0x" << std::setw(8) << hnd->usage;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001077 // TODO(user): get format string from qdutils
Naseer Ahmede36f2242017-12-01 15:33:56 -05001078 *os << " format: "
1079 << "0x" << std::setw(8) << hnd->format;
1080 *os << std::dec << std::setfill(' ') << std::endl;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001081 }
Naseer Ahmede36f2242017-12-01 15:33:56 -05001082 return Error::NONE;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001083}
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001084
1085// Get list of private handles in handles_map_
1086Error BufferManager::GetAllHandles(std::vector<const private_handle_t *> *out_handle_list) {
1087 std::lock_guard<std::mutex> lock(buffer_lock_);
1088 if (handles_map_.empty()) {
1089 return Error::NO_RESOURCES;
1090 }
1091 out_handle_list->reserve(handles_map_.size());
1092 for (auto handle : handles_map_) {
1093 out_handle_list->push_back(handle.first);
1094 }
1095 return Error::NONE;
1096}
Yichi Chena8304132020-03-23 12:23:48 +08001097
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001098Error BufferManager::GetReservedRegion(private_handle_t *handle, void **reserved_region,
1099 uint64_t *reserved_region_size) {
1100 std::lock_guard<std::mutex> lock(buffer_lock_);
1101 if (!handle)
1102 return Error::BAD_BUFFER;
1103
1104 auto buf = GetBufferFromHandleLocked(handle);
1105 if (buf == nullptr)
1106 return Error::BAD_BUFFER;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001107 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001108 return Error::BAD_BUFFER;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001109 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001110
Tharaga Balachandran40648032020-05-01 10:54:31 -04001111 *reserved_region = buf->reserved_region_ptr;
1112 *reserved_region_size = buf->reserved_size;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001113
1114 return Error::NONE;
1115}
1116
1117Error BufferManager::GetMetadata(private_handle_t *handle, int64_t metadatatype_value,
1118 hidl_vec<uint8_t> *out) {
1119 std::lock_guard<std::mutex> lock(buffer_lock_);
1120 if (!handle)
1121 return Error::BAD_BUFFER;
1122 auto buf = GetBufferFromHandleLocked(handle);
1123 if (buf == nullptr)
1124 return Error::BAD_BUFFER;
1125
Tharaga Balachandran40648032020-05-01 10:54:31 -04001126 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001127 return Error::BAD_BUFFER;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001128 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001129
1130 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1131
1132 Error error = Error::NONE;
1133 switch (metadatatype_value) {
1134 case (int64_t)StandardMetadataType::BUFFER_ID:
1135 android::gralloc4::encodeBufferId((uint64_t)handle->id, out);
1136 break;
1137 case (int64_t)StandardMetadataType::NAME: {
1138 std::string name(metadata->name);
1139 android::gralloc4::encodeName(name, out);
1140 break;
1141 }
1142 case (int64_t)StandardMetadataType::WIDTH:
1143 android::gralloc4::encodeWidth((uint64_t)handle->unaligned_width, out);
1144 break;
1145 case (int64_t)StandardMetadataType::HEIGHT:
1146 android::gralloc4::encodeHeight((uint64_t)handle->unaligned_height, out);
1147 break;
1148 case (int64_t)StandardMetadataType::LAYER_COUNT:
1149 android::gralloc4::encodeLayerCount((uint64_t)handle->layer_count, out);
1150 break;
1151 case (int64_t)StandardMetadataType::PIXEL_FORMAT_REQUESTED:
1152 // TODO(tbalacha): need to return IMPLEMENTATION_DEFINED,
1153 // which wouldn't be known from private_handle_t
1154 android::gralloc4::encodePixelFormatRequested((PixelFormat)handle->format, out);
1155 break;
1156 case (int64_t)StandardMetadataType::PIXEL_FORMAT_FOURCC: {
1157 uint32_t drm_format = 0;
1158 uint64_t drm_format_modifier = 0;
1159 GetDRMFormat(handle->format, handle->flags, &drm_format, &drm_format_modifier);
1160 android::gralloc4::encodePixelFormatFourCC(drm_format, out);
1161 break;
1162 }
1163 case (int64_t)StandardMetadataType::PIXEL_FORMAT_MODIFIER: {
1164 uint32_t drm_format = 0;
1165 uint64_t drm_format_modifier = 0;
1166 GetDRMFormat(handle->format, handle->flags, &drm_format, &drm_format_modifier);
1167 android::gralloc4::encodePixelFormatModifier(drm_format_modifier, out);
1168 break;
1169 }
1170 case (int64_t)StandardMetadataType::USAGE:
1171 android::gralloc4::encodeUsage((uint64_t)handle->usage, out);
1172 break;
1173 case (int64_t)StandardMetadataType::ALLOCATION_SIZE:
1174 android::gralloc4::encodeAllocationSize((uint64_t)handle->size, out);
1175 break;
1176 case (int64_t)StandardMetadataType::PROTECTED_CONTENT: {
1177 uint64_t protected_content = (handle->flags & qtigralloc::PRIV_FLAGS_SECURE_BUFFER) ? 1 : 0;
1178 android::gralloc4::encodeProtectedContent(protected_content, out);
1179 break;
1180 }
1181 case (int64_t)StandardMetadataType::CHROMA_SITING:
Tharaga Balachandran676e3092020-04-27 15:30:03 -04001182 android::gralloc4::encodeChromaSiting(android::gralloc4::ChromaSiting_None, out);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001183 break;
1184 case (int64_t)StandardMetadataType::DATASPACE:
Tharaga Balachandran40648032020-05-01 10:54:31 -04001185#ifdef METADATA_V2
1186 if (metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)]) {
1187#endif
1188 Dataspace dataspace;
1189 colorMetadataToDataspace(metadata->color, &dataspace);
1190 android::gralloc4::encodeDataspace(dataspace, out);
1191#ifdef METADATA_V2
1192 } else {
1193 android::gralloc4::encodeDataspace(Dataspace::UNKNOWN, out);
1194 }
1195#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001196 break;
1197 case (int64_t)StandardMetadataType::INTERLACED:
Tharaga Balachandran4629b4e2020-05-13 17:18:25 -04001198 if (metadata->interlaced > 0) {
1199 android::gralloc4::encodeInterlaced(qtigralloc::Interlaced_Qti, out);
1200 } else {
1201 android::gralloc4::encodeInterlaced(android::gralloc4::Interlaced_None, out);
1202 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001203 break;
1204 case (int64_t)StandardMetadataType::COMPRESSION:
1205 if (handle->flags & qtigralloc::PRIV_FLAGS_UBWC_ALIGNED ||
1206 handle->flags & qtigralloc::PRIV_FLAGS_UBWC_ALIGNED_PI) {
1207 android::gralloc4::encodeCompression(qtigralloc::Compression_QtiUBWC, out);
1208 } else {
1209 android::gralloc4::encodeCompression(android::gralloc4::Compression_None, out);
1210 }
1211 break;
1212 case (int64_t)StandardMetadataType::PLANE_LAYOUTS: {
1213 std::vector<PlaneLayout> plane_layouts;
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001214 getFormatLayout(handle, &plane_layouts);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001215 android::gralloc4::encodePlaneLayouts(plane_layouts, out);
1216 break;
1217 }
1218 case (int64_t)StandardMetadataType::BLEND_MODE:
1219 android::gralloc4::encodeBlendMode((BlendMode)metadata->blendMode, out);
1220 break;
1221 case (int64_t)StandardMetadataType::SMPTE2086: {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001222 if (metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled) {
1223 Smpte2086 mastering_display_values;
1224 mastering_display_values.primaryRed = {
1225 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][0]) /
1226 50000.0f,
1227 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][1]) /
1228 50000.0f};
1229 mastering_display_values.primaryGreen = {
1230 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][0]) /
1231 50000.0f,
1232 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][1]) /
1233 50000.0f};
1234 mastering_display_values.primaryBlue = {
1235 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][0]) /
1236 50000.0f,
1237 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][1]) /
1238 50000.0f};
1239 mastering_display_values.whitePoint = {
1240 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.whitePoint[0]) /
1241 50000.0f,
1242 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.whitePoint[1]) /
1243 50000.0f};
1244 mastering_display_values.maxLuminance =
1245 static_cast<float>(metadata->color.masteringDisplayInfo.maxDisplayLuminance);
1246 mastering_display_values.minLuminance =
1247 static_cast<float>(metadata->color.masteringDisplayInfo.minDisplayLuminance) / 10000.0f;
1248 android::gralloc4::encodeSmpte2086(mastering_display_values, out);
1249 } else {
1250 android::gralloc4::encodeSmpte2086(std::nullopt, out);
1251 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001252 break;
1253 }
1254 case (int64_t)StandardMetadataType::CTA861_3: {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001255 if (metadata->color.contentLightLevel.lightLevelSEIEnabled) {
1256 Cta861_3 content_light_level;
1257 content_light_level.maxContentLightLevel =
1258 static_cast<float>(metadata->color.contentLightLevel.maxContentLightLevel);
1259 content_light_level.maxFrameAverageLightLevel =
1260 static_cast<float>(metadata->color.contentLightLevel.minPicAverageLightLevel) /
1261 10000.0f;
1262 android::gralloc4::encodeCta861_3(content_light_level, out);
1263 } else {
1264 android::gralloc4::encodeCta861_3(std::nullopt, out);
1265 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001266 break;
1267 }
1268 case (int64_t)StandardMetadataType::SMPTE2094_40: {
Tharaga Balachandran2c9873c2020-03-10 12:49:18 -04001269 if (metadata->color.dynamicMetaDataValid &&
1270 metadata->color.dynamicMetaDataLen <= HDR_DYNAMIC_META_DATA_SZ) {
Yichi Chena8304132020-03-23 12:23:48 +08001271 std::vector<uint8_t> dynamic_metadata_payload;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001272 dynamic_metadata_payload.resize(metadata->color.dynamicMetaDataLen);
Yichi Chena8304132020-03-23 12:23:48 +08001273 dynamic_metadata_payload.assign(
1274 metadata->color.dynamicMetaDataPayload,
1275 metadata->color.dynamicMetaDataPayload + metadata->color.dynamicMetaDataLen);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001276 android::gralloc4::encodeSmpte2094_40(dynamic_metadata_payload, out);
1277 } else {
1278 android::gralloc4::encodeSmpte2094_40(std::nullopt, out);
1279 }
1280 break;
1281 }
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001282 case (int64_t)StandardMetadataType::CROP: {
1283 // Crop is the same for all planes
1284 std::vector<Rect> out_crop = {{metadata->crop.left, metadata->crop.top, metadata->crop.right,
1285 metadata->crop.bottom}};
1286 android::gralloc4::encodeCrop(out_crop, out);
1287 break;
1288 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001289 case QTI_VT_TIMESTAMP:
1290 android::gralloc4::encodeUint64(qtigralloc::MetadataType_VTTimestamp, metadata->vtTimeStamp,
1291 out);
1292 break;
1293 case QTI_COLOR_METADATA:
1294 qtigralloc::encodeColorMetadata(metadata->color, out);
1295 break;
1296 case QTI_PP_PARAM_INTERLACED:
1297 android::gralloc4::encodeInt32(qtigralloc::MetadataType_PPParamInterlaced,
1298 metadata->interlaced, out);
1299 break;
1300 case QTI_VIDEO_PERF_MODE:
1301 android::gralloc4::encodeUint32(qtigralloc::MetadataType_VideoPerfMode,
1302 metadata->isVideoPerfMode, out);
1303 break;
1304 case QTI_GRAPHICS_METADATA:
1305 qtigralloc::encodeGraphicsMetadata(metadata->graphics_metadata, out);
1306 break;
1307 case QTI_UBWC_CR_STATS_INFO:
1308 qtigralloc::encodeUBWCStats(metadata->ubwcCRStats, out);
1309 break;
1310 case QTI_REFRESH_RATE:
1311 android::gralloc4::encodeFloat(qtigralloc::MetadataType_RefreshRate, metadata->refreshrate,
1312 out);
1313 break;
1314 case QTI_MAP_SECURE_BUFFER:
1315 android::gralloc4::encodeInt32(qtigralloc::MetadataType_MapSecureBuffer,
1316 metadata->mapSecureBuffer, out);
1317 break;
1318 case QTI_LINEAR_FORMAT:
1319 android::gralloc4::encodeUint32(qtigralloc::MetadataType_LinearFormat, metadata->linearFormat,
1320 out);
1321 break;
1322 case QTI_SINGLE_BUFFER_MODE:
1323 android::gralloc4::encodeUint32(qtigralloc::MetadataType_SingleBufferMode,
1324 metadata->isSingleBufferMode, out);
1325 break;
1326 case QTI_CVP_METADATA:
1327 qtigralloc::encodeCVPMetadata(metadata->cvpMetadata, out);
1328 break;
1329 case QTI_VIDEO_HISTOGRAM_STATS:
1330 qtigralloc::encodeVideoHistogramMetadata(metadata->video_histogram_stats, out);
1331 break;
1332 case QTI_FD:
1333 android::gralloc4::encodeInt32(qtigralloc::MetadataType_FD, handle->fd, out);
1334 break;
1335 case QTI_PRIVATE_FLAGS:
1336 android::gralloc4::encodeInt32(qtigralloc::MetadataType_PrivateFlags, handle->flags, out);
1337 break;
Tharaga Balachandran70b03c72020-03-10 14:00:15 -04001338 case QTI_ALIGNED_WIDTH_IN_PIXELS:
1339 android::gralloc4::encodeUint32(qtigralloc::MetadataType_AlignedWidthInPixels, handle->width,
1340 out);
1341 break;
1342 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
1343 android::gralloc4::encodeUint32(qtigralloc::MetadataType_AlignedHeightInPixels,
1344 handle->height, out);
1345 break;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001346#ifdef METADATA_V2
1347 case QTI_STANDARD_METADATA_STATUS:
1348 qtigralloc::encodeMetadataState(metadata->isStandardMetadataSet, out);
1349 break;
1350 case QTI_VENDOR_METADATA_STATUS:
1351 qtigralloc::encodeMetadataState(metadata->isVendorMetadataSet, out);
1352 break;
1353#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001354 default:
1355 error = Error::UNSUPPORTED;
1356 }
1357
1358 return error;
1359}
1360
1361Error BufferManager::SetMetadata(private_handle_t *handle, int64_t metadatatype_value,
1362 hidl_vec<uint8_t> in) {
1363 std::lock_guard<std::mutex> lock(buffer_lock_);
1364 if (!handle)
1365 return Error::BAD_BUFFER;
1366
1367 auto buf = GetBufferFromHandleLocked(handle);
1368 if (buf == nullptr)
1369 return Error::BAD_BUFFER;
1370
Tharaga Balachandran40648032020-05-01 10:54:31 -04001371 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001372 return Error::BAD_BUFFER;
Tharaga Balachandran40648032020-05-01 10:54:31 -04001373 }
Tharaga Balachandran96f24d02020-03-31 12:46:02 -04001374 if (in.size() == 0) {
1375 return Error::UNSUPPORTED;
1376 }
1377
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001378 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1379
Tharaga Balachandran40648032020-05-01 10:54:31 -04001380#ifdef METADATA_V2
1381 // By default, set these to true
1382 // Reset to false for special cases below
1383 if (IS_VENDOR_METADATA_TYPE(metadatatype_value)) {
1384 metadata->isVendorMetadataSet[GET_VENDOR_METADATA_STATUS_INDEX(metadatatype_value)] = true;
1385 } else {
1386 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] = true;
1387 }
1388#endif
1389
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001390 switch (metadatatype_value) {
1391 // These are constant (unchanged after allocation)
1392 case (int64_t)StandardMetadataType::BUFFER_ID:
1393 case (int64_t)StandardMetadataType::NAME:
1394 case (int64_t)StandardMetadataType::WIDTH:
1395 case (int64_t)StandardMetadataType::HEIGHT:
1396 case (int64_t)StandardMetadataType::LAYER_COUNT:
1397 case (int64_t)StandardMetadataType::PIXEL_FORMAT_REQUESTED:
1398 case (int64_t)StandardMetadataType::USAGE:
1399 return Error::BAD_VALUE;
1400 case (int64_t)StandardMetadataType::PIXEL_FORMAT_FOURCC:
1401 case (int64_t)StandardMetadataType::PIXEL_FORMAT_MODIFIER:
1402 case (int64_t)StandardMetadataType::PROTECTED_CONTENT:
1403 case (int64_t)StandardMetadataType::ALLOCATION_SIZE:
1404 case (int64_t)StandardMetadataType::PLANE_LAYOUTS:
1405 case (int64_t)StandardMetadataType::CHROMA_SITING:
1406 case (int64_t)StandardMetadataType::INTERLACED:
1407 case (int64_t)StandardMetadataType::COMPRESSION:
1408 case QTI_FD:
1409 case QTI_PRIVATE_FLAGS:
Tharaga Balachandran70b03c72020-03-10 14:00:15 -04001410 case QTI_ALIGNED_WIDTH_IN_PIXELS:
1411 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001412 return Error::UNSUPPORTED;
1413 case (int64_t)StandardMetadataType::DATASPACE:
1414 Dataspace dataspace;
1415 android::gralloc4::decodeDataspace(in, &dataspace);
1416 dataspaceToColorMetadata(dataspace, &metadata->color);
1417 break;
1418 case (int64_t)StandardMetadataType::BLEND_MODE:
1419 BlendMode mode;
1420 android::gralloc4::decodeBlendMode(in, &mode);
1421 metadata->blendMode = (int32_t)mode;
1422 break;
1423 case (int64_t)StandardMetadataType::SMPTE2086: {
1424 std::optional<Smpte2086> mastering_display_values;
1425 android::gralloc4::decodeSmpte2086(in, &mastering_display_values);
1426 if (mastering_display_values != std::nullopt) {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001427 metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = true;
1428
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001429 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][0] =
1430 static_cast<uint32_t>(mastering_display_values->primaryRed.x * 50000.0f);
1431 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][1] =
1432 static_cast<uint32_t>(mastering_display_values->primaryRed.y * 50000.0f);
1433
1434 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][0] =
1435 static_cast<uint32_t>(mastering_display_values->primaryGreen.x * 50000.0f);
1436 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][1] =
1437 static_cast<uint32_t>(mastering_display_values->primaryGreen.y * 50000.0f);
1438
1439 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][0] =
1440 static_cast<uint32_t>(mastering_display_values->primaryBlue.x * 50000.0f);
1441 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][1] =
1442 static_cast<uint32_t>(mastering_display_values->primaryBlue.y * 50000.0f);
1443
1444 metadata->color.masteringDisplayInfo.primaries.whitePoint[0] =
1445 static_cast<uint32_t>(mastering_display_values->whitePoint.x * 50000.0f);
1446 metadata->color.masteringDisplayInfo.primaries.whitePoint[1] =
1447 static_cast<uint32_t>(mastering_display_values->whitePoint.y * 50000.0f);
1448
1449 metadata->color.masteringDisplayInfo.maxDisplayLuminance =
1450 static_cast<uint32_t>(mastering_display_values->maxLuminance);
1451 metadata->color.masteringDisplayInfo.minDisplayLuminance =
1452 static_cast<uint32_t>(mastering_display_values->minLuminance * 10000.0f);
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001453 } else {
Tharaga Balachandran40648032020-05-01 10:54:31 -04001454#ifdef METADATA_V2
1455 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1456 false;
1457#endif
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001458 metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001459 }
1460 break;
1461 }
1462 case (int64_t)StandardMetadataType::CTA861_3: {
1463 std::optional<Cta861_3> content_light_level;
1464 android::gralloc4::decodeCta861_3(in, &content_light_level);
1465 if (content_light_level != std::nullopt) {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001466 metadata->color.contentLightLevel.lightLevelSEIEnabled = true;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001467 metadata->color.contentLightLevel.maxContentLightLevel =
1468 static_cast<uint32_t>(content_light_level->maxContentLightLevel);
1469 metadata->color.contentLightLevel.minPicAverageLightLevel =
1470 static_cast<uint32_t>(content_light_level->maxFrameAverageLightLevel * 10000.0f);
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001471 } else {
Tharaga Balachandran40648032020-05-01 10:54:31 -04001472#ifdef METADATA_V2
1473 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1474 false;
1475#endif
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001476 metadata->color.contentLightLevel.lightLevelSEIEnabled = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001477 }
1478 break;
1479 }
1480 case (int64_t)StandardMetadataType::SMPTE2094_40: {
1481 std::optional<std::vector<uint8_t>> dynamic_metadata_payload;
1482 android::gralloc4::decodeSmpte2094_40(in, &dynamic_metadata_payload);
1483 if (dynamic_metadata_payload != std::nullopt) {
Yichi Chena8304132020-03-23 12:23:48 +08001484 if (dynamic_metadata_payload->size() > HDR_DYNAMIC_META_DATA_SZ)
1485 return Error::BAD_VALUE;
1486
1487 metadata->color.dynamicMetaDataLen = static_cast<uint32_t>(dynamic_metadata_payload->size());
1488 std::copy(dynamic_metadata_payload->begin(), dynamic_metadata_payload->end(),
1489 metadata->color.dynamicMetaDataPayload);
1490 metadata->color.dynamicMetaDataValid = true;
Tharaga Balachandranf5861d52020-03-23 16:00:18 -04001491 } else {
1492 // Reset metadata by passing in std::nullopt
Tharaga Balachandran40648032020-05-01 10:54:31 -04001493#ifdef METADATA_V2
1494 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1495 false;
1496#endif
Tharaga Balachandranf5861d52020-03-23 16:00:18 -04001497 metadata->color.dynamicMetaDataValid = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001498 }
1499 break;
1500 }
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001501 case (int64_t)StandardMetadataType::CROP: {
1502 std::vector<Rect> in_crop;
1503 android::gralloc4::decodeCrop(in, &in_crop);
1504 if (in_crop.size() != 1)
1505 return Error::UNSUPPORTED;
1506
1507 metadata->crop.left = in_crop[0].left;
1508 metadata->crop.top = in_crop[0].top;
1509 metadata->crop.right = in_crop[0].right;
1510 metadata->crop.bottom = in_crop[0].bottom;
1511 break;
1512 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001513 case QTI_VT_TIMESTAMP:
1514 android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp, in,
1515 &metadata->vtTimeStamp);
1516 break;
1517 case QTI_COLOR_METADATA:
1518 ColorMetaData color;
1519 qtigralloc::decodeColorMetadata(in, &color);
1520 metadata->color = color;
1521 break;
1522 case QTI_PP_PARAM_INTERLACED:
1523 android::gralloc4::decodeInt32(qtigralloc::MetadataType_PPParamInterlaced, in,
1524 &metadata->interlaced);
1525 break;
1526 case QTI_VIDEO_PERF_MODE:
1527 android::gralloc4::decodeUint32(qtigralloc::MetadataType_VideoPerfMode, in,
1528 &metadata->isVideoPerfMode);
1529 break;
1530 case QTI_GRAPHICS_METADATA:
1531 qtigralloc::decodeGraphicsMetadata(in, &metadata->graphics_metadata);
1532 break;
1533 case QTI_UBWC_CR_STATS_INFO:
1534 qtigralloc::decodeUBWCStats(in, &metadata->ubwcCRStats[0]);
1535 break;
1536 case QTI_REFRESH_RATE:
1537 android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate, in,
1538 &metadata->refreshrate);
1539 break;
1540 case QTI_MAP_SECURE_BUFFER:
1541 android::gralloc4::decodeInt32(qtigralloc::MetadataType_MapSecureBuffer, in,
1542 &metadata->mapSecureBuffer);
1543 break;
1544 case QTI_LINEAR_FORMAT:
1545 android::gralloc4::decodeUint32(qtigralloc::MetadataType_LinearFormat, in,
1546 &metadata->linearFormat);
1547 break;
1548 case QTI_SINGLE_BUFFER_MODE:
1549 android::gralloc4::decodeUint32(qtigralloc::MetadataType_SingleBufferMode, in,
1550 &metadata->isSingleBufferMode);
1551 break;
1552 case QTI_CVP_METADATA:
1553 qtigralloc::decodeCVPMetadata(in, &metadata->cvpMetadata);
1554 break;
1555 case QTI_VIDEO_HISTOGRAM_STATS:
1556 qtigralloc::decodeVideoHistogramMetadata(in, &metadata->video_histogram_stats);
1557 break;
1558 default:
Tharaga Balachandran40648032020-05-01 10:54:31 -04001559#ifdef METADATA_V2
1560 if (IS_VENDOR_METADATA_TYPE(metadatatype_value)) {
1561 metadata->isVendorMetadataSet[GET_VENDOR_METADATA_STATUS_INDEX(metadatatype_value)] = false;
1562 } else {
1563 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1564 false;
1565 }
1566#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001567 return Error::BAD_VALUE;
1568 }
Tharaga Balachandran40648032020-05-01 10:54:31 -04001569
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001570 return Error::NONE;
1571}
1572
Naseer Ahmede36f2242017-12-01 15:33:56 -05001573} // namespace gralloc