blob: e78ba2eeea88458f1782aca4a261a02e1984dbf7 [file] [log] [blame]
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301/*
Tharaga Balachandran576571c2020-01-23 18:41:10 -05002 * Copyright (c) 2011-2018, 2020 The Linux Foundation. All rights reserved.
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05303 * Not a Contribution
4 *
5 * Copyright (C) 2010 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
Naseer Ahmed699b4572017-03-09 12:28:45 -050020#define DEBUG 0
Saurabh Shah14c8e5b2017-04-07 10:37:23 -070021
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050022#include "gr_buf_mgr.h"
23
24#include <QtiGralloc.h>
25#include <QtiGrallocPriv.h>
26#include <gralloctypes/Gralloc4.h>
27#include <sys/mman.h>
28
Naseer Ahmeddc918132017-03-07 15:25:14 -050029#include <iomanip>
Naseer Ahmede36f2242017-12-01 15:33:56 -050030#include <sstream>
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050031#include <string>
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053032#include <utility>
Naseer Ahmede69031e2016-11-22 20:05:16 -050033#include <vector>
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053034
Tharaga Balachandran576571c2020-01-23 18:41:10 -050035#include "gr_adreno_info.h"
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053036#include "gr_buf_descriptor.h"
Naseer Ahmede36f2242017-12-01 15:33:56 -050037#include "gr_priv_handle.h"
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050038#include "gr_utils.h"
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053039#include "qdMetaData.h"
Naseer Ahmede36f2242017-12-01 15:33:56 -050040#include "qd_utils.h"
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053041
Naseer Ahmede36f2242017-12-01 15:33:56 -050042namespace gralloc {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +053043
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050044using aidl::android::hardware::graphics::common::BlendMode;
45using aidl::android::hardware::graphics::common::Cta861_3;
46using aidl::android::hardware::graphics::common::Dataspace;
47using aidl::android::hardware::graphics::common::PlaneLayout;
48using aidl::android::hardware::graphics::common::PlaneLayoutComponent;
49using aidl::android::hardware::graphics::common::Rect;
50using aidl::android::hardware::graphics::common::Smpte2086;
51using aidl::android::hardware::graphics::common::StandardMetadataType;
52using aidl::android::hardware::graphics::common::XyColor;
53using ::android::hardware::graphics::common::V1_2::PixelFormat;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -040054
Saurabh Shah14c8e5b2017-04-07 10:37:23 -070055static BufferInfo GetBufferInfo(const BufferDescriptor &descriptor) {
56 return BufferInfo(descriptor.GetWidth(), descriptor.GetHeight(), descriptor.GetFormat(),
Naseer Ahmede36f2242017-12-01 15:33:56 -050057 descriptor.GetUsage());
Saurabh Shah14c8e5b2017-04-07 10:37:23 -070058}
59
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -040060static uint64_t getMetaDataSize(uint64_t reserved_region_size) {
61// Only include the reserved region size when using Metadata_t V2
62#ifndef METADATA_V2
63 reserved_region_size = 0;
64#endif
65 return static_cast<uint64_t>(ROUND_UP_PAGESIZE(sizeof(MetaData_t) +
66 static_cast<uint32_t>(reserved_region_size)));
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050067}
68
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -040069static void unmapAndReset(private_handle_t *handle, uint64_t reserved_region_size = 0) {
70 if (private_handle_t::validate(handle) == 0 && handle->base_metadata) {
71 munmap(reinterpret_cast<void *>(handle->base_metadata),
72 static_cast<uint32_t>(getMetaDataSize(reserved_region_size)));
73 handle->base_metadata = 0;
74 }
75}
76
77static int validateAndMap(private_handle_t *handle, uint64_t reserved_region_size = 0) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050078 if (private_handle_t::validate(handle)) {
79 ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
80 return -1;
81 }
82 if (handle->fd_metadata < 0) {
83 // Silently return, metadata cannot be used
84 return -1;
85 }
86
87 if (!handle->base_metadata) {
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -040088 uint64_t size = getMetaDataSize(reserved_region_size);
89 void *base = mmap(NULL, static_cast<uint32_t>(size), PROT_READ | PROT_WRITE,
90 MAP_SHARED, handle->fd_metadata, 0);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050091 if (base == reinterpret_cast<void *>(MAP_FAILED)) {
92 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s", __func__, handle,
93 handle->fd_metadata, strerror(errno));
Tharaga Balachandran74ab1112020-01-08 17:17:56 -050094 return -1;
95 }
96 handle->base_metadata = (uintptr_t)base;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -040097#ifdef METADATA_V2
98 // The allocator process gets the reserved region size from the BufferDescriptor.
99 // When importing to another process, the reserved size is unknown until mapping the metadata,
100 // hence the re-mapping below
101 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
102 if (reserved_region_size == 0 && metadata->reservedSize) {
103 size = getMetaDataSize(metadata->reservedSize);
104 unmapAndReset(handle);
105 void *new_base = mmap(NULL, static_cast<uint32_t>(size), PROT_READ | PROT_WRITE, MAP_SHARED, handle->fd_metadata, 0);
106 if (new_base == reinterpret_cast<void *>(MAP_FAILED)) {
107 ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s", __func__, handle,
108 handle->fd_metadata, strerror(errno));
109 return -1;
110 }
111 handle->base_metadata = (uintptr_t)new_base;
112 }
113#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500114 }
115 return 0;
116}
117
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500118static Error dataspaceToColorMetadata(Dataspace dataspace, ColorMetaData *color_metadata) {
119 ColorMetaData out;
120 uint32_t primaries = (uint32_t)dataspace & (uint32_t)Dataspace::STANDARD_MASK;
121 uint32_t transfer = (uint32_t)dataspace & (uint32_t)Dataspace::TRANSFER_MASK;
122 uint32_t range = (uint32_t)dataspace & (uint32_t)Dataspace::RANGE_MASK;
123
124 switch (primaries) {
125 case (uint32_t)Dataspace::STANDARD_BT709:
126 out.colorPrimaries = ColorPrimaries_BT709_5;
127 break;
128 // TODO(tbalacha): verify this is equivalent
129 case (uint32_t)Dataspace::STANDARD_BT470M:
130 out.colorPrimaries = ColorPrimaries_BT470_6M;
131 break;
132 case (uint32_t)Dataspace::STANDARD_BT601_625:
133 case (uint32_t)Dataspace::STANDARD_BT601_625_UNADJUSTED:
134 out.colorPrimaries = ColorPrimaries_BT601_6_625;
135 break;
136 case (uint32_t)Dataspace::STANDARD_BT601_525:
137 case (uint32_t)Dataspace::STANDARD_BT601_525_UNADJUSTED:
138 out.colorPrimaries = ColorPrimaries_BT601_6_525;
139 break;
140 case (uint32_t)Dataspace::STANDARD_FILM:
141 out.colorPrimaries = ColorPrimaries_GenericFilm;
142 break;
143 case (uint32_t)Dataspace::STANDARD_BT2020:
144 out.colorPrimaries = ColorPrimaries_BT2020;
145 break;
146 case (uint32_t)Dataspace::STANDARD_ADOBE_RGB:
147 out.colorPrimaries = ColorPrimaries_AdobeRGB;
148 break;
149 case (uint32_t)Dataspace::STANDARD_DCI_P3:
150 out.colorPrimaries = ColorPrimaries_DCIP3;
151 break;
152 default:
153 return Error::UNSUPPORTED;
154 /*
155 ColorPrimaries_SMPTE_240M;
156 ColorPrimaries_SMPTE_ST428;
157 ColorPrimaries_EBU3213;
158 */
159 }
160
161 switch (transfer) {
162 case (uint32_t)Dataspace::TRANSFER_SRGB:
163 out.transfer = Transfer_sRGB;
164 break;
165 case (uint32_t)Dataspace::TRANSFER_GAMMA2_2:
166 out.transfer = Transfer_Gamma2_2;
167 break;
168 case (uint32_t)Dataspace::TRANSFER_GAMMA2_8:
169 out.transfer = Transfer_Gamma2_8;
170 break;
171 case (uint32_t)Dataspace::TRANSFER_SMPTE_170M:
172 out.transfer = Transfer_SMPTE_170M;
173 break;
174 case (uint32_t)Dataspace::TRANSFER_LINEAR:
175 out.transfer = Transfer_Linear;
176 break;
177 case (uint32_t)Dataspace::TRANSFER_HLG:
178 out.transfer = Transfer_HLG;
179 break;
180 default:
181 return Error::UNSUPPORTED;
182 /*
183 Transfer_SMPTE_240M
184 Transfer_Log
185 Transfer_Log_Sqrt
186 Transfer_XvYCC
187 Transfer_BT1361
188 Transfer_sYCC
189 Transfer_BT2020_2_1
190 Transfer_BT2020_2_2
191 Transfer_SMPTE_ST2084
192 Transfer_ST_428
193 */
194 }
195
196 switch (range) {
197 case (uint32_t)Dataspace::RANGE_FULL:
198 out.range = Range_Full;
199 break;
200 case (uint32_t)Dataspace::RANGE_LIMITED:
201 out.range = Range_Limited;
202 break;
203 case (uint32_t)Dataspace::RANGE_EXTENDED:
204 out.range = Range_Extended;
205 break;
206 default:
207 return Error::UNSUPPORTED;
208 }
209
210 color_metadata->colorPrimaries = out.colorPrimaries;
211 color_metadata->transfer = out.transfer;
212 color_metadata->range = out.range;
213 return Error::NONE;
214}
215static Error colorMetadataToDataspace(ColorMetaData color_metadata, Dataspace *dataspace) {
216 Dataspace primaries, transfer, range = Dataspace::UNKNOWN;
217
218 switch (color_metadata.colorPrimaries) {
219 case ColorPrimaries_BT709_5:
220 primaries = Dataspace::STANDARD_BT709;
221 break;
222 // TODO(tbalacha): verify this is equivalent
223 case ColorPrimaries_BT470_6M:
224 primaries = Dataspace::STANDARD_BT470M;
225 break;
226 case ColorPrimaries_BT601_6_625:
227 primaries = Dataspace::STANDARD_BT601_625;
228 break;
229 case ColorPrimaries_BT601_6_525:
230 primaries = Dataspace::STANDARD_BT601_525;
231 break;
232 case ColorPrimaries_GenericFilm:
233 primaries = Dataspace::STANDARD_FILM;
234 break;
235 case ColorPrimaries_BT2020:
236 primaries = Dataspace::STANDARD_BT2020;
237 break;
238 case ColorPrimaries_AdobeRGB:
239 primaries = Dataspace::STANDARD_ADOBE_RGB;
240 break;
241 case ColorPrimaries_DCIP3:
242 primaries = Dataspace::STANDARD_DCI_P3;
243 break;
244 default:
245 return Error::UNSUPPORTED;
246 /*
247 ColorPrimaries_SMPTE_240M;
248 ColorPrimaries_SMPTE_ST428;
249 ColorPrimaries_EBU3213;
250 */
251 }
252
253 switch (color_metadata.transfer) {
254 case Transfer_sRGB:
255 transfer = Dataspace::TRANSFER_SRGB;
256 break;
257 case Transfer_Gamma2_2:
258 transfer = Dataspace::TRANSFER_GAMMA2_2;
259 break;
260 case Transfer_Gamma2_8:
261 transfer = Dataspace::TRANSFER_GAMMA2_8;
262 break;
263 case Transfer_SMPTE_170M:
264 transfer = Dataspace::TRANSFER_SMPTE_170M;
265 break;
266 case Transfer_Linear:
267 transfer = Dataspace::TRANSFER_LINEAR;
268 break;
269 case Transfer_HLG:
270 transfer = Dataspace::TRANSFER_HLG;
271 break;
272 default:
273 return Error::UNSUPPORTED;
274 /*
275 Transfer_SMPTE_240M
276 Transfer_Log
277 Transfer_Log_Sqrt
278 Transfer_XvYCC
279 Transfer_BT1361
280 Transfer_sYCC
281 Transfer_BT2020_2_1
282 Transfer_BT2020_2_2
283 Transfer_SMPTE_ST2084
284 Transfer_ST_428
285 */
286 }
287
288 switch (color_metadata.range) {
289 case Range_Full:
290 range = Dataspace::RANGE_FULL;
291 break;
292 case Range_Limited:
293 range = Dataspace::RANGE_LIMITED;
294 break;
295 case Range_Extended:
296 range = Dataspace::RANGE_EXTENDED;
297 break;
298 default:
299 return Error::UNSUPPORTED;
300 }
301
302 *dataspace = (Dataspace)((uint32_t)primaries | (uint32_t)transfer | (uint32_t)range);
303 return Error::NONE;
304}
305
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400306static Error getComponentSizeAndOffset(int32_t format, PlaneLayoutComponent &comp) {
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400307 switch (format) {
308 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_8888):
309 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBX_8888):
310 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGB_888):
311 comp.sizeInBits = 8;
312 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
313 comp.offsetInBits = 0;
314 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
315 comp.offsetInBits = 8;
316 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
317 comp.offsetInBits = 16;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400318 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value &&
319 format != HAL_PIXEL_FORMAT_RGB_888) {
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400320 comp.offsetInBits = 24;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400321 } else {
322 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400323 }
324 break;
325 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGB_565):
326 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
327 comp.offsetInBits = 0;
328 comp.sizeInBits = 5;
329 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
330 comp.offsetInBits = 5;
331 comp.sizeInBits = 6;
332 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
333 comp.offsetInBits = 11;
334 comp.sizeInBits = 5;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400335 } else {
336 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400337 }
338 break;
339 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGR_565):
340 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
341 comp.offsetInBits = 11;
342 comp.sizeInBits = 5;
343 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
344 comp.offsetInBits = 5;
345 comp.sizeInBits = 6;
346 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
347 comp.offsetInBits = 0;
348 comp.sizeInBits = 5;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400349 } else {
350 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400351 }
352 break;
353 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRA_8888):
354 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRX_8888):
355 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGR_888):
356 comp.sizeInBits = 8;
357 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
358 comp.offsetInBits = 16;
359 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
360 comp.offsetInBits = 8;
361 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
362 comp.offsetInBits = 0;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400363 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value &&
364 format != HAL_PIXEL_FORMAT_BGR_888) {
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400365 comp.offsetInBits = 24;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400366 } else {
367 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400368 }
369 break;
370 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_5551):
371 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
372 comp.sizeInBits = 5;
373 comp.offsetInBits = 0;
374 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
375 comp.sizeInBits = 5;
376 comp.offsetInBits = 5;
377 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
378 comp.sizeInBits = 5;
379 comp.offsetInBits = 10;
380 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
381 comp.sizeInBits = 1;
382 comp.offsetInBits = 15;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400383 } else {
384 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400385 }
386 break;
387 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_4444):
388 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
389 comp.sizeInBits = 4;
390 comp.offsetInBits = 0;
391 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
392 comp.sizeInBits = 4;
393 comp.offsetInBits = 4;
394 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
395 comp.sizeInBits = 4;
396 comp.offsetInBits = 8;
397 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
398 comp.sizeInBits = 4;
399 comp.offsetInBits = 12;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400400 } else {
401 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400402 }
403 break;
404 case static_cast<int32_t>(HAL_PIXEL_FORMAT_R_8):
405 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RG_88):
406 comp.sizeInBits = 8;
407 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
408 comp.offsetInBits = 0;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400409 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value &&
410 format != HAL_PIXEL_FORMAT_R_8) {
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400411 comp.offsetInBits = 8;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400412 } else {
413 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400414 }
415 break;
416 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_1010102):
417 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBX_1010102):
418 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
419 comp.sizeInBits = 10;
420 comp.offsetInBits = 0;
421 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
422 comp.sizeInBits = 10;
423 comp.offsetInBits = 10;
424 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
425 comp.sizeInBits = 10;
426 comp.offsetInBits = 20;
427 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
428 comp.sizeInBits = 2;
429 comp.offsetInBits = 30;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400430 } else {
431 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400432 }
433 break;
434 case static_cast<int32_t>(HAL_PIXEL_FORMAT_ARGB_2101010):
435 case static_cast<int32_t>(HAL_PIXEL_FORMAT_XRGB_2101010):
436 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
437 comp.sizeInBits = 10;
438 comp.offsetInBits = 2;
439 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
440 comp.sizeInBits = 10;
441 comp.offsetInBits = 12;
442 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
443 comp.sizeInBits = 10;
444 comp.offsetInBits = 22;
445 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
446 comp.sizeInBits = 2;
447 comp.offsetInBits = 0;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400448 } else {
449 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400450 }
451 break;
452 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRA_1010102):
453 case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRX_1010102):
454 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
455 comp.sizeInBits = 10;
456 comp.offsetInBits = 20;
457 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
458 comp.sizeInBits = 10;
459 comp.offsetInBits = 10;
460 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
461 comp.sizeInBits = 10;
462 comp.offsetInBits = 0;
463 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
464 comp.sizeInBits = 2;
465 comp.offsetInBits = 30;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400466 } else {
467 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400468 }
469 break;
470 case static_cast<int32_t>(HAL_PIXEL_FORMAT_ABGR_2101010):
471 case static_cast<int32_t>(HAL_PIXEL_FORMAT_XBGR_2101010):
472 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
473 comp.sizeInBits = 10;
474 comp.offsetInBits = 22;
475 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
476 comp.sizeInBits = 10;
477 comp.offsetInBits = 12;
478 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
479 comp.sizeInBits = 10;
480 comp.offsetInBits = 2;
481 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
482 comp.sizeInBits = 2;
483 comp.offsetInBits = 0;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400484 } else {
485 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400486 }
487 break;
488 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_FP16):
489 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
490 comp.sizeInBits = 16;
491 comp.offsetInBits = 0;
492 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
493 comp.sizeInBits = 16;
494 comp.offsetInBits = 16;
495 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
496 comp.sizeInBits = 16;
497 comp.offsetInBits = 32;
498 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
499 comp.sizeInBits = 16;
500 comp.offsetInBits = 48;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400501 } else {
502 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400503 }
504 break;
505 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_SP):
506 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_422_SP):
507 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS):
508 case static_cast<int32_t>(HAL_PIXEL_FORMAT_NV12_ENCODEABLE):
509 comp.sizeInBits = 8;
510 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
511 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value) {
512 comp.offsetInBits = 0;
513 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
514 comp.offsetInBits = 8;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400515 } else {
516 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400517 }
518 break;
519 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP):
520 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_422_SP):
521 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO):
522 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS):
523 case static_cast<int32_t>(HAL_PIXEL_FORMAT_NV21_ZSL):
524 comp.sizeInBits = 8;
525 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
526 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
527 comp.offsetInBits = 0;
528 } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value) {
529 comp.offsetInBits = 8;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400530 } else {
531 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400532 }
533 break;
534 case static_cast<int32_t>(HAL_PIXEL_FORMAT_Y16):
535 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value) {
536 comp.offsetInBits = 0;
537 comp.sizeInBits = 16;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400538 } else {
539 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400540 }
541 break;
542 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YV12):
543 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
544 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value ||
545 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
546 comp.offsetInBits = 0;
547 comp.sizeInBits = 8;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400548 } else {
549 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400550 }
551 break;
552 case static_cast<int32_t>(HAL_PIXEL_FORMAT_Y8):
553 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value) {
554 comp.offsetInBits = 0;
555 comp.sizeInBits = 8;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400556 } else {
557 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400558 }
559 break;
560 case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_P010):
561 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value ||
562 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value ||
563 comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
564 comp.offsetInBits = 0;
565 comp.sizeInBits = 10;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400566 } else {
567 return Error::BAD_VALUE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400568 }
569 break;
Yichi Chen96ad5c52020-05-27 20:16:13 +0800570 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW16):
571 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_RAW.value) {
572 comp.offsetInBits = 0;
573 comp.sizeInBits = 16;
574 } else {
575 return Error::BAD_VALUE;
576 }
577 break;
578 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW12):
579 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW10):
580 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_RAW.value) {
581 comp.offsetInBits = 0;
582 comp.sizeInBits = -1;
583 } else {
584 return Error::BAD_VALUE;
585 }
586 break;
587 case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW8):
588 if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_RAW.value) {
589 comp.offsetInBits = 0;
590 comp.sizeInBits = 8;
591 } else {
592 return Error::BAD_VALUE;
593 }
594 break;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400595 default:
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400596 ALOGI_IF(DEBUG, "Offset and size in bits unknown for format %d", format);
597 return Error::UNSUPPORTED;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400598 }
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400599 return Error::NONE;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400600}
601
602static void grallocToStandardPlaneLayoutComponentType(uint32_t in,
603 std::vector<PlaneLayoutComponent> *components,
604 int32_t format) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500605 PlaneLayoutComponent comp;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400606 comp.offsetInBits = -1;
607 comp.sizeInBits = -1;
608
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500609 if (in & PLANE_COMPONENT_Y) {
610 comp.type = android::gralloc4::PlaneLayoutComponentType_Y;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400611 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
612 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500613 }
614
615 if (in & PLANE_COMPONENT_Cb) {
616 comp.type = android::gralloc4::PlaneLayoutComponentType_CB;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400617 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
618 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500619 }
620
621 if (in & PLANE_COMPONENT_Cr) {
622 comp.type = android::gralloc4::PlaneLayoutComponentType_CR;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400623 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
624 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500625 }
626
627 if (in & PLANE_COMPONENT_R) {
628 comp.type = android::gralloc4::PlaneLayoutComponentType_R;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400629 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
630 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500631 }
632
633 if (in & PLANE_COMPONENT_G) {
634 comp.type = android::gralloc4::PlaneLayoutComponentType_G;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400635 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
636 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500637 }
638
639 if (in & PLANE_COMPONENT_B) {
640 comp.type = android::gralloc4::PlaneLayoutComponentType_B;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400641 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
642 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500643 }
644
645 if (in & PLANE_COMPONENT_A) {
646 comp.type = android::gralloc4::PlaneLayoutComponentType_A;
Tharaga Balachandranec391cd2020-06-25 11:54:58 -0400647 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
648 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500649 }
650
651 if (in & PLANE_COMPONENT_RAW) {
Yichi Chen96ad5c52020-05-27 20:16:13 +0800652 comp.type = android::gralloc4::PlaneLayoutComponentType_RAW;
653 if (getComponentSizeAndOffset(format, comp) == Error::NONE)
654 components->push_back(comp);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500655 }
656
657 if (in & PLANE_COMPONENT_META) {
658 comp.type = qtigralloc::PlaneLayoutComponentType_Meta;
659 components->push_back(comp);
660 }
661}
662
Tharaga Balachandran95175bb2020-03-20 13:26:55 -0400663static Error getFormatLayout(private_handle_t *handle, std::vector<PlaneLayout> *out) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500664 std::vector<PlaneLayout> plane_info;
665 int plane_count = 0;
666 BufferInfo info(handle->unaligned_width, handle->unaligned_height, handle->format, handle->usage);
667
668 gralloc::PlaneLayoutInfo plane_layout[8] = {};
669 if (gralloc::IsYuvFormat(handle->format)) {
670 gralloc::GetYUVPlaneInfo(info, handle->format, handle->width, handle->height, handle->flags,
671 &plane_count, plane_layout);
672 } else if (gralloc::IsUncompressedRGBFormat(handle->format) ||
673 gralloc::IsCompressedRGBFormat(handle->format)) {
674 gralloc::GetRGBPlaneInfo(info, handle->format, handle->width, handle->height, handle->flags,
675 &plane_count, plane_layout);
676 } else {
677 return Error::BAD_BUFFER;
678 }
679 plane_info.resize(plane_count);
680 for (int i = 0; i < plane_count; i++) {
681 std::vector<PlaneLayoutComponent> components;
Tharaga Balachandran69a0a692020-03-30 19:16:31 -0400682 grallocToStandardPlaneLayoutComponentType(plane_layout[i].component, &plane_info[i].components,
683 handle->format);
Yichi Chena8304132020-03-23 12:23:48 +0800684 plane_info[i].horizontalSubsampling = (1ull << plane_layout[i].h_subsampling);
685 plane_info[i].verticalSubsampling = (1ull << plane_layout[i].v_subsampling);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500686 plane_info[i].offsetInBytes = static_cast<int64_t>(plane_layout[i].offset);
687 plane_info[i].sampleIncrementInBits = static_cast<int64_t>(plane_layout[i].step * 8);
688 plane_info[i].strideInBytes = static_cast<int64_t>(plane_layout[i].stride_bytes);
689 plane_info[i].totalSizeInBytes = static_cast<int64_t>(plane_layout[i].size);
Tharaga Balachandranfe4cd072020-07-16 22:38:53 -0400690 plane_info[i].widthInSamples = handle->unaligned_width >> plane_layout[i].h_subsampling;
691 plane_info[i].heightInSamples = handle->unaligned_height >> plane_layout[i].v_subsampling;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500692 }
693 *out = plane_info;
694 return Error::NONE;
695}
696
Naseer Ahmede69031e2016-11-22 20:05:16 -0500697BufferManager::BufferManager() : next_id_(0) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530698 handles_map_.clear();
Naseer Ahmede69031e2016-11-22 20:05:16 -0500699 allocator_ = new Allocator();
700 allocator_->Init();
701}
702
Naseer Ahmede36f2242017-12-01 15:33:56 -0500703BufferManager *BufferManager::GetInstance() {
704 static BufferManager *instance = new BufferManager();
705 return instance;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530706}
707
708BufferManager::~BufferManager() {
709 if (allocator_) {
710 delete allocator_;
711 }
712}
713
Tharaga Balachandran576571c2020-01-23 18:41:10 -0500714void BufferManager::SetGrallocDebugProperties(gralloc::GrallocProperties props) {
715 allocator_->SetProperties(props);
716 AdrenoMemInfo::GetInstance()->AdrenoSetProperties(props);
717}
718
Naseer Ahmede36f2242017-12-01 15:33:56 -0500719Error BufferManager::FreeBuffer(std::shared_ptr<Buffer> buf) {
Naseer Ahmede69031e2016-11-22 20:05:16 -0500720 auto hnd = buf->handle;
Naseer Ahmeda186b472017-07-07 18:50:49 -0400721 ALOGD_IF(DEBUG, "FreeBuffer handle:%p", hnd);
722
723 if (private_handle_t::validate(hnd) != 0) {
724 ALOGE("FreeBuffer: Invalid handle: %p", hnd);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500725 return Error::BAD_BUFFER;
Naseer Ahmeda186b472017-07-07 18:50:49 -0400726 }
727
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -0400728 auto meta_size = getMetaDataSize(buf->reserved_size);
729
Naseer Ahmede36f2242017-12-01 15:33:56 -0500730 if (allocator_->FreeBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset, hnd->fd,
731 buf->ion_handle_main) != 0) {
732 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530733 }
734
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -0400735 if (allocator_->FreeBuffer(reinterpret_cast<void *>(hnd->base_metadata),
736 static_cast<uint32_t>(meta_size), hnd->offset_metadata,
737 hnd->fd_metadata, buf->ion_handle_meta) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500738 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530739 }
740
Naseer Ahmede36f2242017-12-01 15:33:56 -0500741 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
Naseer Ahmed29a86dd2017-03-16 14:09:46 -0400742 handle->fd = -1;
743 handle->fd_metadata = -1;
Naseer Ahmed2f8f8d42017-06-09 18:17:26 -0400744 if (!(handle->flags & private_handle_t::PRIV_FLAGS_CLIENT_ALLOCATED)) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500745 delete handle;
Naseer Ahmed2f8f8d42017-06-09 18:17:26 -0400746 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500747 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530748}
749
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500750Error BufferManager::ValidateBufferSize(private_handle_t const *hnd, BufferInfo info) {
751 unsigned int size, alignedw, alignedh;
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530752 info.format = GetImplDefinedFormat(info.usage, info.format);
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700753 int ret = GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh);
754 if (ret < 0) {
755 return Error::BAD_BUFFER;
756 }
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500757 auto ion_fd_size = static_cast<unsigned int>(lseek(hnd->fd, 0, SEEK_END));
758 if (size != ion_fd_size) {
759 return Error::BAD_VALUE;
760 }
761 return Error::NONE;
762}
763
Naseer Ahmede36f2242017-12-01 15:33:56 -0500764void BufferManager::RegisterHandleLocked(const private_handle_t *hnd, int ion_handle,
Naseer Ahmed378d8582017-03-28 21:56:08 -0400765 int ion_handle_meta) {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400766 auto buffer = std::make_shared<Buffer>(hnd, ion_handle, ion_handle_meta);
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -0400767
768 if (hnd->base_metadata) {
769 auto metadata = reinterpret_cast<MetaData_t *>(hnd->base_metadata);
770#ifdef METADATA_V2
771 buffer->reserved_size = metadata->reservedSize;
772 if (buffer->reserved_size > 0) {
773 buffer->reserved_region_ptr =
774 reinterpret_cast<void *>(hnd->base_metadata + sizeof(MetaData_t));
775 } else {
776 buffer->reserved_region_ptr = nullptr;
777 }
778#else
779 buffer->reserved_region_ptr = reinterpret_cast<void *>(&(metadata->reservedRegion.data));
780 buffer->reserved_size = metadata->reservedRegion.size;
781#endif
782 }
783
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400784 handles_map_.emplace(std::make_pair(hnd, buffer));
785}
786
Naseer Ahmede36f2242017-12-01 15:33:56 -0500787Error BufferManager::ImportHandleLocked(private_handle_t *hnd) {
Ramkumar Radhakrishnan372b5ee2018-09-20 13:17:36 -0700788 if (private_handle_t::validate(hnd) != 0) {
789 ALOGE("ImportHandleLocked: Invalid handle: %p", hnd);
790 return Error::BAD_BUFFER;
791 }
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400792 ALOGD_IF(DEBUG, "Importing handle:%p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400793 int ion_handle = allocator_->ImportBuffer(hnd->fd);
794 if (ion_handle < 0) {
795 ALOGE("Failed to import ion buffer: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500796 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400797 }
798 int ion_handle_meta = allocator_->ImportBuffer(hnd->fd_metadata);
799 if (ion_handle_meta < 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500800 ALOGE("Failed to import ion metadata buffer: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd,
801 hnd->id);
802 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400803 }
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500804 // Initialize members that aren't transported
805 hnd->size = static_cast<unsigned int>(lseek(hnd->fd, 0, SEEK_END));
806 hnd->offset = 0;
807 hnd->offset_metadata = 0;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400808 hnd->base = 0;
809 hnd->base_metadata = 0;
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500810 hnd->gpuaddr = 0;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -0400811
812 if (validateAndMap(hnd)) {
813 ALOGE("Failed to map metadata: hnd: %p, fd:%d, id:%" PRIu64, hnd, hnd->fd, hnd->id);
814 return Error::BAD_BUFFER;
815 }
816
Naseer Ahmed378d8582017-03-28 21:56:08 -0400817 RegisterHandleLocked(hnd, ion_handle, ion_handle_meta);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500818 return Error::NONE;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400819}
820
Naseer Ahmede36f2242017-12-01 15:33:56 -0500821std::shared_ptr<BufferManager::Buffer> BufferManager::GetBufferFromHandleLocked(
822 const private_handle_t *hnd) {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400823 auto it = handles_map_.find(hnd);
824 if (it != handles_map_.end()) {
825 return it->second;
826 } else {
827 return nullptr;
828 }
829}
830
Naseer Ahmede36f2242017-12-01 15:33:56 -0500831Error BufferManager::MapBuffer(private_handle_t const *handle) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530832 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400833 ALOGD_IF(DEBUG, "Map buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530834
835 hnd->base = 0;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530836 if (allocator_->MapBuffer(reinterpret_cast<void **>(&hnd->base), hnd->size, hnd->offset,
837 hnd->fd) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500838 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530839 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500840 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530841}
842
Naseer Ahmed920d71b2018-03-08 16:54:28 -0500843Error BufferManager::IsBufferImported(const private_handle_t *hnd) {
844 std::lock_guard<std::mutex> lock(buffer_lock_);
845 auto buf = GetBufferFromHandleLocked(hnd);
846 if (buf != nullptr) {
847 return Error::NONE;
848 }
849 return Error::BAD_BUFFER;
850}
851
Naseer Ahmede36f2242017-12-01 15:33:56 -0500852Error BufferManager::RetainBuffer(private_handle_t const *hnd) {
Naseer Ahmed699b4572017-03-09 12:28:45 -0500853 ALOGD_IF(DEBUG, "Retain buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500854 auto err = Error::NONE;
Naseer Ahmed378d8582017-03-28 21:56:08 -0400855 std::lock_guard<std::mutex> lock(buffer_lock_);
856 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400857 if (buf != nullptr) {
858 buf->IncRef();
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530859 } else {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400860 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400861 err = ImportHandleLocked(handle);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530862 }
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400863 return err;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530864}
865
Naseer Ahmede36f2242017-12-01 15:33:56 -0500866Error BufferManager::ReleaseBuffer(private_handle_t const *hnd) {
Naseer Ahmeda186b472017-07-07 18:50:49 -0400867 ALOGD_IF(DEBUG, "Release buffer handle:%p", hnd);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400868 std::lock_guard<std::mutex> lock(buffer_lock_);
869 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400870 if (buf == nullptr) {
871 ALOGE("Could not find handle: %p id: %" PRIu64, hnd, hnd->id);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500872 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530873 } else {
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400874 if (buf->DecRef()) {
875 handles_map_.erase(hnd);
876 // Unmap, close ion handle and close fd
Naseer Ahmede69031e2016-11-22 20:05:16 -0500877 FreeBuffer(buf);
878 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530879 }
Naseer Ahmede36f2242017-12-01 15:33:56 -0500880 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530881}
882
Naseer Ahmede36f2242017-12-01 15:33:56 -0500883Error BufferManager::LockBuffer(const private_handle_t *hnd, uint64_t usage) {
Naseer Ahmed378d8582017-03-28 21:56:08 -0400884 std::lock_guard<std::mutex> lock(buffer_lock_);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500885 auto err = Error::NONE;
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -0400886 ALOGD_IF(DEBUG, "LockBuffer buffer handle:%p id: %" PRIu64, hnd, hnd->id);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530887
888 // If buffer is not meant for CPU return err
Naseer Ahmede36f2242017-12-01 15:33:56 -0500889 if (!CpuCanAccess(usage)) {
890 return Error::BAD_VALUE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530891 }
892
Naseer Ahmed378d8582017-03-28 21:56:08 -0400893 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400894 if (buf == nullptr) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500895 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530896 }
897
Naseer Ahmed67330702017-05-02 15:00:26 -0400898 if (hnd->base == 0) {
899 // we need to map for real
900 err = MapBuffer(hnd);
901 }
902
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530903 // Invalidate if CPU reads in software and there are non-CPU
904 // writers. No need to do this for the metadata buffer as it is
905 // only read/written in software.
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400906
907 // todo use handle here
Naseer Ahmede36f2242017-12-01 15:33:56 -0500908 if (err == Error::NONE && (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) &&
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530909 (hnd->flags & private_handle_t::PRIV_FLAGS_CACHED)) {
910 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
Rohit Kulkarni3ac98392017-10-20 12:04:34 -0700911 buf->ion_handle_main, CACHE_INVALIDATE, hnd->fd)) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500912 return Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530913 }
914 }
915
916 // Mark the buffer to be flushed after CPU write.
Naseer Ahmede36f2242017-12-01 15:33:56 -0500917 if (err == Error::NONE && CpuCanWrite(usage)) {
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530918 private_handle_t *handle = const_cast<private_handle_t *>(hnd);
919 handle->flags |= private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
920 }
921
922 return err;
923}
Yichi Chena8304132020-03-23 12:23:48 +0800924
Tharaga Balachandran74ab1112020-01-08 17:17:56 -0500925Error BufferManager::FlushBuffer(const private_handle_t *handle) {
926 std::lock_guard<std::mutex> lock(buffer_lock_);
927 auto status = Error::NONE;
928
929 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
930 auto buf = GetBufferFromHandleLocked(hnd);
931 if (buf == nullptr) {
932 return Error::BAD_BUFFER;
933 }
934
935 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
936 buf->ion_handle_main, CACHE_CLEAN, hnd->fd) != 0) {
937 status = Error::BAD_BUFFER;
938 }
939
940 return status;
941}
942
943Error BufferManager::RereadBuffer(const private_handle_t *handle) {
944 std::lock_guard<std::mutex> lock(buffer_lock_);
945 auto status = Error::NONE;
946
947 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
948 auto buf = GetBufferFromHandleLocked(hnd);
949 if (buf == nullptr) {
950 return Error::BAD_BUFFER;
951 }
952
953 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
954 buf->ion_handle_main, CACHE_INVALIDATE, hnd->fd) != 0) {
955 status = Error::BAD_BUFFER;
956 }
957
958 return status;
959}
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530960
Naseer Ahmede36f2242017-12-01 15:33:56 -0500961Error BufferManager::UnlockBuffer(const private_handle_t *handle) {
Naseer Ahmed378d8582017-03-28 21:56:08 -0400962 std::lock_guard<std::mutex> lock(buffer_lock_);
Naseer Ahmede36f2242017-12-01 15:33:56 -0500963 auto status = Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530964
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530965 private_handle_t *hnd = const_cast<private_handle_t *>(handle);
Naseer Ahmed378d8582017-03-28 21:56:08 -0400966 auto buf = GetBufferFromHandleLocked(hnd);
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400967 if (buf == nullptr) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500968 return Error::BAD_BUFFER;
Naseer Ahmed3a9d53a2017-03-15 19:21:40 -0400969 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530970
971 if (hnd->flags & private_handle_t::PRIV_FLAGS_NEEDS_FLUSH) {
972 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
Rohit Kulkarni3ac98392017-10-20 12:04:34 -0700973 buf->ion_handle_main, CACHE_CLEAN, hnd->fd) != 0) {
Naseer Ahmede36f2242017-12-01 15:33:56 -0500974 status = Error::BAD_BUFFER;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530975 }
976 hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
Rohit Kulkarnib20abe72018-03-13 16:55:10 -0700977 } else {
978 if (allocator_->CleanBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset,
979 buf->ion_handle_main, CACHE_READ_DONE, hnd->fd) != 0) {
980 status = Error::BAD_BUFFER;
981 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530982 }
983
Prabhanjan Kandula96e92342016-03-24 21:03:35 +0530984 return status;
985}
986
Naseer Ahmede36f2242017-12-01 15:33:56 -0500987Error BufferManager::AllocateBuffer(const BufferDescriptor &descriptor, buffer_handle_t *handle,
Tharaga Balachandranab150ab2019-09-26 19:17:58 -0400988 unsigned int bufferSize, bool testAlloc) {
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400989 if (!handle)
Naseer Ahmede36f2242017-12-01 15:33:56 -0500990 return Error::BAD_BUFFER;
991 std::lock_guard<std::mutex> buffer_lock(buffer_lock_);
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400992
Naseer Ahmede36f2242017-12-01 15:33:56 -0500993 uint64_t usage = descriptor.GetUsage();
Saurabh Dubey48b757d2018-05-24 19:13:53 +0530994 int format = GetImplDefinedFormat(usage, descriptor.GetFormat());
Naseer Ahmedbaa39c52017-03-27 14:00:07 -0400995 uint32_t layer_count = descriptor.GetLayerCount();
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400996
Naseer Ahmed4c0eec92017-03-27 16:51:48 -0400997 unsigned int size;
998 unsigned int alignedw, alignedh;
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -0700999 int err = 0;
Naseer Ahmed95dc2882017-07-26 18:12:12 -04001000
1001 int buffer_type = GetBufferType(format);
Saurabh Shah14c8e5b2017-04-07 10:37:23 -07001002 BufferInfo info = GetBufferInfo(descriptor);
Naseer Ahmede36f2242017-12-01 15:33:56 -05001003 info.format = format;
Saurabh Dubey70957382018-05-15 16:05:32 +05301004 info.layer_count = layer_count;
Naseer Ahmed4c0eec92017-03-27 16:51:48 -04001005
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +05301006 GraphicsMetadata graphics_metadata = {};
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -07001007 err = GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh, &graphics_metadata);
1008 if (err < 0) {
1009 return Error::BAD_DESCRIPTOR;
1010 }
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +05301011
Tharaga Balachandranab150ab2019-09-26 19:17:58 -04001012 if (testAlloc) {
1013 return Error::NONE;
1014 }
1015
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +05301016 size = (bufferSize >= size) ? bufferSize : size;
Saurabh Dubey48b757d2018-05-24 19:13:53 +05301017 uint64_t flags = 0;
Naseer Ahmed4c0eec92017-03-27 16:51:48 -04001018 auto page_size = UINT(getpagesize());
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301019 AllocData data;
Naseer Ahmede36f2242017-12-01 15:33:56 -05001020 data.align = GetDataAlignment(format, usage);
Naseer Ahmedf8e9c432017-06-13 17:45:12 -04001021 data.size = size;
Naseer Ahmede36f2242017-12-01 15:33:56 -05001022 data.handle = (uintptr_t)handle;
Saurabh Dubey48b757d2018-05-24 19:13:53 +05301023 data.uncached = UseUncached(format, usage);
Naseer Ahmede69031e2016-11-22 20:05:16 -05001024
1025 // Allocate buffer memory
Rohit Kulkarnib20abe72018-03-13 16:55:10 -07001026 err = allocator_->AllocateMem(&data, usage, format);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301027 if (err) {
Ramkumar Radhakrishnan30ea0f02018-10-11 19:25:10 -07001028 ALOGE("gralloc failed to allocate err=%s format %d size %d WxH %dx%d usage %" PRIu64,
1029 strerror(-err), format, size, alignedw, alignedh, usage);
Naseer Ahmede36f2242017-12-01 15:33:56 -05001030 return Error::NO_RESOURCES;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301031 }
1032
Naseer Ahmede69031e2016-11-22 20:05:16 -05001033 // Allocate memory for MetaData
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301034 AllocData e_data;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001035 e_data.size = static_cast<unsigned int>(getMetaDataSize(descriptor.GetReservedSize()));
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301036 e_data.handle = data.handle;
Naseer Ahmede69031e2016-11-22 20:05:16 -05001037 e_data.align = page_size;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301038
Rohit Kulkarnib20abe72018-03-13 16:55:10 -07001039 err = allocator_->AllocateMem(&e_data, 0, 0);
Naseer Ahmede69031e2016-11-22 20:05:16 -05001040 if (err) {
1041 ALOGE("gralloc failed to allocate metadata error=%s", strerror(-err));
Naseer Ahmede36f2242017-12-01 15:33:56 -05001042 return Error::NO_RESOURCES;
Naseer Ahmede69031e2016-11-22 20:05:16 -05001043 }
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301044
Naseer Ahmede36f2242017-12-01 15:33:56 -05001045 flags = GetHandleFlags(format, usage);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301046 flags |= data.alloc_type;
1047
1048 // Create handle
Naseer Ahmede36f2242017-12-01 15:33:56 -05001049 private_handle_t *hnd = new private_handle_t(
Saurabh Dubey48b757d2018-05-24 19:13:53 +05301050 data.fd, e_data.fd, INT(flags), INT(alignedw), INT(alignedh), descriptor.GetWidth(),
Naseer Ahmede36f2242017-12-01 15:33:56 -05001051 descriptor.GetHeight(), format, buffer_type, data.size, usage);
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301052
Naseer Ahmede69031e2016-11-22 20:05:16 -05001053 hnd->id = ++next_id_;
Naseer Ahmed49f2e9c2017-03-23 22:13:17 -04001054 hnd->base = 0;
1055 hnd->base_metadata = 0;
Naseer Ahmedbaa39c52017-03-27 14:00:07 -04001056 hnd->layer_count = layer_count;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001057
Saurabh Dubeyefd7f9e2018-06-15 18:00:02 +05301058 bool use_adreno_for_size = CanUseAdrenoForSize(buffer_type, usage);
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +05301059 if (use_adreno_for_size) {
Praveen Chavancbaa5362018-07-06 18:19:46 -07001060 setMetaDataAndUnmap(hnd, SET_GRAPHICS_METADATA, reinterpret_cast<void *>(&graphics_metadata));
Saurabh Dubeyb28b82b2018-05-29 09:46:41 +05301061 }
1062
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001063#ifdef METADATA_V2
1064 auto error = validateAndMap(hnd, descriptor.GetReservedSize());
1065#else
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001066 auto error = validateAndMap(hnd);
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001067#endif
1068
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001069 if (error != 0) {
1070 ALOGE("validateAndMap failed");
1071 return Error::BAD_BUFFER;
1072 }
1073 auto metadata = reinterpret_cast<MetaData_t *>(hnd->base_metadata);
Yichi Chena8304132020-03-23 12:23:48 +08001074 auto nameLength = std::min(descriptor.GetName().size(), size_t(MAX_NAME_LEN - 1));
1075 nameLength = descriptor.GetName().copy(metadata->name, nameLength);
1076 metadata->name[nameLength] = '\0';
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001077
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001078#ifdef METADATA_V2
1079 metadata->reservedSize = descriptor.GetReservedSize();
1080#else
1081 metadata->reservedRegion.size =
1082 static_cast<uint32_t>(std::min(descriptor.GetReservedSize(), (uint64_t)RESERVED_REGION_SIZE));
1083#endif
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001084 metadata->crop.top = 0;
1085 metadata->crop.left = 0;
1086 metadata->crop.right = hnd->width;
1087 metadata->crop.bottom = hnd->height;
1088
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001089 unmapAndReset(hnd, descriptor.GetReservedSize());
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001090
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301091 *handle = hnd;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001092
Naseer Ahmed378d8582017-03-28 21:56:08 -04001093 RegisterHandleLocked(hnd, data.ion_handle, e_data.ion_handle);
Naseer Ahmed699b4572017-03-09 12:28:45 -05001094 ALOGD_IF(DEBUG, "Allocated buffer handle: %p id: %" PRIu64, hnd, hnd->id);
1095 if (DEBUG) {
1096 private_handle_t::Dump(hnd);
1097 }
Naseer Ahmede36f2242017-12-01 15:33:56 -05001098 return Error::NONE;
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301099}
1100
Naseer Ahmede36f2242017-12-01 15:33:56 -05001101Error BufferManager::Dump(std::ostringstream *os) {
Uday Kiran Pichikab58d8842018-04-10 15:37:35 +05301102 std::lock_guard<std::mutex> buffer_lock(buffer_lock_);
Naseer Ahmeddc918132017-03-07 15:25:14 -05001103 for (auto it : handles_map_) {
1104 auto buf = it.second;
1105 auto hnd = buf->handle;
1106 *os << "handle id: " << std::setw(4) << hnd->id;
Naseer Ahmede36f2242017-12-01 15:33:56 -05001107 *os << " fd: " << std::setw(3) << hnd->fd;
1108 *os << " fd_meta: " << std::setw(3) << hnd->fd_metadata;
1109 *os << " wxh: " << std::setw(4) << hnd->width << " x " << std::setw(4) << hnd->height;
1110 *os << " uwxuh: " << std::setw(4) << hnd->unaligned_width << " x ";
1111 *os << std::setw(4) << hnd->unaligned_height;
1112 *os << " size: " << std::setw(9) << hnd->size;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001113 *os << std::hex << std::setfill('0');
Naseer Ahmede36f2242017-12-01 15:33:56 -05001114 *os << " priv_flags: "
1115 << "0x" << std::setw(8) << hnd->flags;
1116 *os << " usage: "
1117 << "0x" << std::setw(8) << hnd->usage;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001118 // TODO(user): get format string from qdutils
Naseer Ahmede36f2242017-12-01 15:33:56 -05001119 *os << " format: "
1120 << "0x" << std::setw(8) << hnd->format;
1121 *os << std::dec << std::setfill(' ') << std::endl;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001122 }
Naseer Ahmede36f2242017-12-01 15:33:56 -05001123 return Error::NONE;
Naseer Ahmeddc918132017-03-07 15:25:14 -05001124}
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001125
1126// Get list of private handles in handles_map_
1127Error BufferManager::GetAllHandles(std::vector<const private_handle_t *> *out_handle_list) {
1128 std::lock_guard<std::mutex> lock(buffer_lock_);
1129 if (handles_map_.empty()) {
1130 return Error::NO_RESOURCES;
1131 }
1132 out_handle_list->reserve(handles_map_.size());
1133 for (auto handle : handles_map_) {
1134 out_handle_list->push_back(handle.first);
1135 }
1136 return Error::NONE;
1137}
Yichi Chena8304132020-03-23 12:23:48 +08001138
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001139Error BufferManager::GetReservedRegion(private_handle_t *handle, void **reserved_region,
1140 uint64_t *reserved_region_size) {
1141 std::lock_guard<std::mutex> lock(buffer_lock_);
1142 if (!handle)
1143 return Error::BAD_BUFFER;
1144
1145 auto buf = GetBufferFromHandleLocked(handle);
1146 if (buf == nullptr)
1147 return Error::BAD_BUFFER;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001148 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001149 return Error::BAD_BUFFER;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001150 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001151
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001152 *reserved_region = buf->reserved_region_ptr;
1153 *reserved_region_size = buf->reserved_size;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001154
1155 return Error::NONE;
1156}
1157
1158Error BufferManager::GetMetadata(private_handle_t *handle, int64_t metadatatype_value,
1159 hidl_vec<uint8_t> *out) {
1160 std::lock_guard<std::mutex> lock(buffer_lock_);
1161 if (!handle)
1162 return Error::BAD_BUFFER;
1163 auto buf = GetBufferFromHandleLocked(handle);
1164 if (buf == nullptr)
1165 return Error::BAD_BUFFER;
1166
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001167 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001168 return Error::BAD_BUFFER;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001169 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001170
1171 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1172
1173 Error error = Error::NONE;
1174 switch (metadatatype_value) {
1175 case (int64_t)StandardMetadataType::BUFFER_ID:
1176 android::gralloc4::encodeBufferId((uint64_t)handle->id, out);
1177 break;
1178 case (int64_t)StandardMetadataType::NAME: {
1179 std::string name(metadata->name);
1180 android::gralloc4::encodeName(name, out);
1181 break;
1182 }
1183 case (int64_t)StandardMetadataType::WIDTH:
1184 android::gralloc4::encodeWidth((uint64_t)handle->unaligned_width, out);
1185 break;
1186 case (int64_t)StandardMetadataType::HEIGHT:
1187 android::gralloc4::encodeHeight((uint64_t)handle->unaligned_height, out);
1188 break;
1189 case (int64_t)StandardMetadataType::LAYER_COUNT:
1190 android::gralloc4::encodeLayerCount((uint64_t)handle->layer_count, out);
1191 break;
1192 case (int64_t)StandardMetadataType::PIXEL_FORMAT_REQUESTED:
1193 // TODO(tbalacha): need to return IMPLEMENTATION_DEFINED,
1194 // which wouldn't be known from private_handle_t
1195 android::gralloc4::encodePixelFormatRequested((PixelFormat)handle->format, out);
1196 break;
1197 case (int64_t)StandardMetadataType::PIXEL_FORMAT_FOURCC: {
1198 uint32_t drm_format = 0;
1199 uint64_t drm_format_modifier = 0;
1200 GetDRMFormat(handle->format, handle->flags, &drm_format, &drm_format_modifier);
1201 android::gralloc4::encodePixelFormatFourCC(drm_format, out);
1202 break;
1203 }
1204 case (int64_t)StandardMetadataType::PIXEL_FORMAT_MODIFIER: {
1205 uint32_t drm_format = 0;
1206 uint64_t drm_format_modifier = 0;
1207 GetDRMFormat(handle->format, handle->flags, &drm_format, &drm_format_modifier);
1208 android::gralloc4::encodePixelFormatModifier(drm_format_modifier, out);
1209 break;
1210 }
1211 case (int64_t)StandardMetadataType::USAGE:
1212 android::gralloc4::encodeUsage((uint64_t)handle->usage, out);
1213 break;
1214 case (int64_t)StandardMetadataType::ALLOCATION_SIZE:
1215 android::gralloc4::encodeAllocationSize((uint64_t)handle->size, out);
1216 break;
1217 case (int64_t)StandardMetadataType::PROTECTED_CONTENT: {
1218 uint64_t protected_content = (handle->flags & qtigralloc::PRIV_FLAGS_SECURE_BUFFER) ? 1 : 0;
1219 android::gralloc4::encodeProtectedContent(protected_content, out);
1220 break;
1221 }
1222 case (int64_t)StandardMetadataType::CHROMA_SITING:
Tharaga Balachandran676e3092020-04-27 15:30:03 -04001223 android::gralloc4::encodeChromaSiting(android::gralloc4::ChromaSiting_None, out);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001224 break;
1225 case (int64_t)StandardMetadataType::DATASPACE:
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001226#ifdef METADATA_V2
1227 if (metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)]) {
1228#endif
1229 Dataspace dataspace;
1230 colorMetadataToDataspace(metadata->color, &dataspace);
1231 android::gralloc4::encodeDataspace(dataspace, out);
1232#ifdef METADATA_V2
1233 } else {
1234 android::gralloc4::encodeDataspace(Dataspace::UNKNOWN, out);
1235 }
1236#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001237 break;
1238 case (int64_t)StandardMetadataType::INTERLACED:
Tharaga Balachandran4629b4e2020-05-13 17:18:25 -04001239 if (metadata->interlaced > 0) {
1240 android::gralloc4::encodeInterlaced(qtigralloc::Interlaced_Qti, out);
1241 } else {
1242 android::gralloc4::encodeInterlaced(android::gralloc4::Interlaced_None, out);
1243 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001244 break;
1245 case (int64_t)StandardMetadataType::COMPRESSION:
1246 if (handle->flags & qtigralloc::PRIV_FLAGS_UBWC_ALIGNED ||
1247 handle->flags & qtigralloc::PRIV_FLAGS_UBWC_ALIGNED_PI) {
1248 android::gralloc4::encodeCompression(qtigralloc::Compression_QtiUBWC, out);
1249 } else {
1250 android::gralloc4::encodeCompression(android::gralloc4::Compression_None, out);
1251 }
1252 break;
1253 case (int64_t)StandardMetadataType::PLANE_LAYOUTS: {
1254 std::vector<PlaneLayout> plane_layouts;
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001255 getFormatLayout(handle, &plane_layouts);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001256 android::gralloc4::encodePlaneLayouts(plane_layouts, out);
1257 break;
1258 }
1259 case (int64_t)StandardMetadataType::BLEND_MODE:
1260 android::gralloc4::encodeBlendMode((BlendMode)metadata->blendMode, out);
1261 break;
1262 case (int64_t)StandardMetadataType::SMPTE2086: {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001263 if (metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled) {
1264 Smpte2086 mastering_display_values;
1265 mastering_display_values.primaryRed = {
1266 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][0]) /
1267 50000.0f,
1268 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][1]) /
1269 50000.0f};
1270 mastering_display_values.primaryGreen = {
1271 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][0]) /
1272 50000.0f,
1273 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][1]) /
1274 50000.0f};
1275 mastering_display_values.primaryBlue = {
1276 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][0]) /
1277 50000.0f,
1278 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][1]) /
1279 50000.0f};
1280 mastering_display_values.whitePoint = {
1281 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.whitePoint[0]) /
1282 50000.0f,
1283 static_cast<float>(metadata->color.masteringDisplayInfo.primaries.whitePoint[1]) /
1284 50000.0f};
1285 mastering_display_values.maxLuminance =
1286 static_cast<float>(metadata->color.masteringDisplayInfo.maxDisplayLuminance);
1287 mastering_display_values.minLuminance =
1288 static_cast<float>(metadata->color.masteringDisplayInfo.minDisplayLuminance) / 10000.0f;
1289 android::gralloc4::encodeSmpte2086(mastering_display_values, out);
1290 } else {
1291 android::gralloc4::encodeSmpte2086(std::nullopt, out);
1292 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001293 break;
1294 }
1295 case (int64_t)StandardMetadataType::CTA861_3: {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001296 if (metadata->color.contentLightLevel.lightLevelSEIEnabled) {
1297 Cta861_3 content_light_level;
1298 content_light_level.maxContentLightLevel =
1299 static_cast<float>(metadata->color.contentLightLevel.maxContentLightLevel);
1300 content_light_level.maxFrameAverageLightLevel =
1301 static_cast<float>(metadata->color.contentLightLevel.minPicAverageLightLevel) /
1302 10000.0f;
1303 android::gralloc4::encodeCta861_3(content_light_level, out);
1304 } else {
1305 android::gralloc4::encodeCta861_3(std::nullopt, out);
1306 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001307 break;
1308 }
1309 case (int64_t)StandardMetadataType::SMPTE2094_40: {
Tharaga Balachandran2c9873c2020-03-10 12:49:18 -04001310 if (metadata->color.dynamicMetaDataValid &&
1311 metadata->color.dynamicMetaDataLen <= HDR_DYNAMIC_META_DATA_SZ) {
Yichi Chena8304132020-03-23 12:23:48 +08001312 std::vector<uint8_t> dynamic_metadata_payload;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001313 dynamic_metadata_payload.resize(metadata->color.dynamicMetaDataLen);
Yichi Chena8304132020-03-23 12:23:48 +08001314 dynamic_metadata_payload.assign(
1315 metadata->color.dynamicMetaDataPayload,
1316 metadata->color.dynamicMetaDataPayload + metadata->color.dynamicMetaDataLen);
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001317 android::gralloc4::encodeSmpte2094_40(dynamic_metadata_payload, out);
1318 } else {
1319 android::gralloc4::encodeSmpte2094_40(std::nullopt, out);
1320 }
1321 break;
1322 }
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001323 case (int64_t)StandardMetadataType::CROP: {
1324 // Crop is the same for all planes
1325 std::vector<Rect> out_crop = {{metadata->crop.left, metadata->crop.top, metadata->crop.right,
1326 metadata->crop.bottom}};
1327 android::gralloc4::encodeCrop(out_crop, out);
1328 break;
1329 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001330 case QTI_VT_TIMESTAMP:
1331 android::gralloc4::encodeUint64(qtigralloc::MetadataType_VTTimestamp, metadata->vtTimeStamp,
1332 out);
1333 break;
1334 case QTI_COLOR_METADATA:
1335 qtigralloc::encodeColorMetadata(metadata->color, out);
1336 break;
1337 case QTI_PP_PARAM_INTERLACED:
1338 android::gralloc4::encodeInt32(qtigralloc::MetadataType_PPParamInterlaced,
1339 metadata->interlaced, out);
1340 break;
1341 case QTI_VIDEO_PERF_MODE:
1342 android::gralloc4::encodeUint32(qtigralloc::MetadataType_VideoPerfMode,
1343 metadata->isVideoPerfMode, out);
1344 break;
1345 case QTI_GRAPHICS_METADATA:
1346 qtigralloc::encodeGraphicsMetadata(metadata->graphics_metadata, out);
1347 break;
1348 case QTI_UBWC_CR_STATS_INFO:
1349 qtigralloc::encodeUBWCStats(metadata->ubwcCRStats, out);
1350 break;
1351 case QTI_REFRESH_RATE:
1352 android::gralloc4::encodeFloat(qtigralloc::MetadataType_RefreshRate, metadata->refreshrate,
1353 out);
1354 break;
1355 case QTI_MAP_SECURE_BUFFER:
1356 android::gralloc4::encodeInt32(qtigralloc::MetadataType_MapSecureBuffer,
1357 metadata->mapSecureBuffer, out);
1358 break;
1359 case QTI_LINEAR_FORMAT:
1360 android::gralloc4::encodeUint32(qtigralloc::MetadataType_LinearFormat, metadata->linearFormat,
1361 out);
1362 break;
1363 case QTI_SINGLE_BUFFER_MODE:
1364 android::gralloc4::encodeUint32(qtigralloc::MetadataType_SingleBufferMode,
1365 metadata->isSingleBufferMode, out);
1366 break;
1367 case QTI_CVP_METADATA:
1368 qtigralloc::encodeCVPMetadata(metadata->cvpMetadata, out);
1369 break;
1370 case QTI_VIDEO_HISTOGRAM_STATS:
1371 qtigralloc::encodeVideoHistogramMetadata(metadata->video_histogram_stats, out);
1372 break;
1373 case QTI_FD:
1374 android::gralloc4::encodeInt32(qtigralloc::MetadataType_FD, handle->fd, out);
1375 break;
1376 case QTI_PRIVATE_FLAGS:
1377 android::gralloc4::encodeInt32(qtigralloc::MetadataType_PrivateFlags, handle->flags, out);
1378 break;
Tharaga Balachandran70b03c72020-03-10 14:00:15 -04001379 case QTI_ALIGNED_WIDTH_IN_PIXELS:
1380 android::gralloc4::encodeUint32(qtigralloc::MetadataType_AlignedWidthInPixels, handle->width,
1381 out);
1382 break;
1383 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
1384 android::gralloc4::encodeUint32(qtigralloc::MetadataType_AlignedHeightInPixels,
1385 handle->height, out);
1386 break;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001387#ifdef METADATA_V2
1388 case QTI_STANDARD_METADATA_STATUS:
1389 qtigralloc::encodeMetadataState(metadata->isStandardMetadataSet, out);
1390 break;
1391 case QTI_VENDOR_METADATA_STATUS:
1392 qtigralloc::encodeMetadataState(metadata->isVendorMetadataSet, out);
1393 break;
1394#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001395 default:
1396 error = Error::UNSUPPORTED;
1397 }
1398
1399 return error;
1400}
1401
1402Error BufferManager::SetMetadata(private_handle_t *handle, int64_t metadatatype_value,
1403 hidl_vec<uint8_t> in) {
1404 std::lock_guard<std::mutex> lock(buffer_lock_);
1405 if (!handle)
1406 return Error::BAD_BUFFER;
1407
1408 auto buf = GetBufferFromHandleLocked(handle);
1409 if (buf == nullptr)
1410 return Error::BAD_BUFFER;
1411
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001412 if (!handle->base_metadata) {
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001413 return Error::BAD_BUFFER;
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001414 }
Tharaga Balachandran96f24d02020-03-31 12:46:02 -04001415 if (in.size() == 0) {
1416 return Error::UNSUPPORTED;
1417 }
1418
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001419 auto metadata = reinterpret_cast<MetaData_t *>(handle->base_metadata);
1420
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001421#ifdef METADATA_V2
1422 // By default, set these to true
1423 // Reset to false for special cases below
1424 if (IS_VENDOR_METADATA_TYPE(metadatatype_value)) {
1425 metadata->isVendorMetadataSet[GET_VENDOR_METADATA_STATUS_INDEX(metadatatype_value)] = true;
1426 } else {
1427 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] = true;
1428 }
1429#endif
1430
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001431 switch (metadatatype_value) {
1432 // These are constant (unchanged after allocation)
1433 case (int64_t)StandardMetadataType::BUFFER_ID:
1434 case (int64_t)StandardMetadataType::NAME:
1435 case (int64_t)StandardMetadataType::WIDTH:
1436 case (int64_t)StandardMetadataType::HEIGHT:
1437 case (int64_t)StandardMetadataType::LAYER_COUNT:
1438 case (int64_t)StandardMetadataType::PIXEL_FORMAT_REQUESTED:
1439 case (int64_t)StandardMetadataType::USAGE:
1440 return Error::BAD_VALUE;
1441 case (int64_t)StandardMetadataType::PIXEL_FORMAT_FOURCC:
1442 case (int64_t)StandardMetadataType::PIXEL_FORMAT_MODIFIER:
1443 case (int64_t)StandardMetadataType::PROTECTED_CONTENT:
1444 case (int64_t)StandardMetadataType::ALLOCATION_SIZE:
1445 case (int64_t)StandardMetadataType::PLANE_LAYOUTS:
1446 case (int64_t)StandardMetadataType::CHROMA_SITING:
1447 case (int64_t)StandardMetadataType::INTERLACED:
1448 case (int64_t)StandardMetadataType::COMPRESSION:
1449 case QTI_FD:
1450 case QTI_PRIVATE_FLAGS:
Tharaga Balachandran70b03c72020-03-10 14:00:15 -04001451 case QTI_ALIGNED_WIDTH_IN_PIXELS:
1452 case QTI_ALIGNED_HEIGHT_IN_PIXELS:
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001453 return Error::UNSUPPORTED;
1454 case (int64_t)StandardMetadataType::DATASPACE:
1455 Dataspace dataspace;
1456 android::gralloc4::decodeDataspace(in, &dataspace);
1457 dataspaceToColorMetadata(dataspace, &metadata->color);
1458 break;
1459 case (int64_t)StandardMetadataType::BLEND_MODE:
1460 BlendMode mode;
1461 android::gralloc4::decodeBlendMode(in, &mode);
1462 metadata->blendMode = (int32_t)mode;
1463 break;
1464 case (int64_t)StandardMetadataType::SMPTE2086: {
1465 std::optional<Smpte2086> mastering_display_values;
1466 android::gralloc4::decodeSmpte2086(in, &mastering_display_values);
1467 if (mastering_display_values != std::nullopt) {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001468 metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = true;
1469
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001470 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][0] =
1471 static_cast<uint32_t>(mastering_display_values->primaryRed.x * 50000.0f);
1472 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[0][1] =
1473 static_cast<uint32_t>(mastering_display_values->primaryRed.y * 50000.0f);
1474
1475 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][0] =
1476 static_cast<uint32_t>(mastering_display_values->primaryGreen.x * 50000.0f);
1477 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[1][1] =
1478 static_cast<uint32_t>(mastering_display_values->primaryGreen.y * 50000.0f);
1479
1480 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][0] =
1481 static_cast<uint32_t>(mastering_display_values->primaryBlue.x * 50000.0f);
1482 metadata->color.masteringDisplayInfo.primaries.rgbPrimaries[2][1] =
1483 static_cast<uint32_t>(mastering_display_values->primaryBlue.y * 50000.0f);
1484
1485 metadata->color.masteringDisplayInfo.primaries.whitePoint[0] =
1486 static_cast<uint32_t>(mastering_display_values->whitePoint.x * 50000.0f);
1487 metadata->color.masteringDisplayInfo.primaries.whitePoint[1] =
1488 static_cast<uint32_t>(mastering_display_values->whitePoint.y * 50000.0f);
1489
1490 metadata->color.masteringDisplayInfo.maxDisplayLuminance =
1491 static_cast<uint32_t>(mastering_display_values->maxLuminance);
1492 metadata->color.masteringDisplayInfo.minDisplayLuminance =
1493 static_cast<uint32_t>(mastering_display_values->minLuminance * 10000.0f);
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001494 } else {
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001495#ifdef METADATA_V2
1496 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1497 false;
1498#endif
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001499 metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001500 }
1501 break;
1502 }
1503 case (int64_t)StandardMetadataType::CTA861_3: {
1504 std::optional<Cta861_3> content_light_level;
1505 android::gralloc4::decodeCta861_3(in, &content_light_level);
1506 if (content_light_level != std::nullopt) {
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001507 metadata->color.contentLightLevel.lightLevelSEIEnabled = true;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001508 metadata->color.contentLightLevel.maxContentLightLevel =
1509 static_cast<uint32_t>(content_light_level->maxContentLightLevel);
1510 metadata->color.contentLightLevel.minPicAverageLightLevel =
1511 static_cast<uint32_t>(content_light_level->maxFrameAverageLightLevel * 10000.0f);
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001512 } else {
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001513#ifdef METADATA_V2
1514 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1515 false;
1516#endif
Tharaga Balachandranc6a5f7b2020-03-31 15:49:33 -04001517 metadata->color.contentLightLevel.lightLevelSEIEnabled = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001518 }
1519 break;
1520 }
1521 case (int64_t)StandardMetadataType::SMPTE2094_40: {
1522 std::optional<std::vector<uint8_t>> dynamic_metadata_payload;
1523 android::gralloc4::decodeSmpte2094_40(in, &dynamic_metadata_payload);
1524 if (dynamic_metadata_payload != std::nullopt) {
Yichi Chena8304132020-03-23 12:23:48 +08001525 if (dynamic_metadata_payload->size() > HDR_DYNAMIC_META_DATA_SZ)
1526 return Error::BAD_VALUE;
1527
1528 metadata->color.dynamicMetaDataLen = static_cast<uint32_t>(dynamic_metadata_payload->size());
1529 std::copy(dynamic_metadata_payload->begin(), dynamic_metadata_payload->end(),
1530 metadata->color.dynamicMetaDataPayload);
1531 metadata->color.dynamicMetaDataValid = true;
Tharaga Balachandranf5861d52020-03-23 16:00:18 -04001532 } else {
1533 // Reset metadata by passing in std::nullopt
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001534#ifdef METADATA_V2
1535 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1536 false;
1537#endif
Tharaga Balachandranf5861d52020-03-23 16:00:18 -04001538 metadata->color.dynamicMetaDataValid = false;
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001539 }
1540 break;
1541 }
Tharaga Balachandran95175bb2020-03-20 13:26:55 -04001542 case (int64_t)StandardMetadataType::CROP: {
1543 std::vector<Rect> in_crop;
1544 android::gralloc4::decodeCrop(in, &in_crop);
1545 if (in_crop.size() != 1)
1546 return Error::UNSUPPORTED;
1547
1548 metadata->crop.left = in_crop[0].left;
1549 metadata->crop.top = in_crop[0].top;
1550 metadata->crop.right = in_crop[0].right;
1551 metadata->crop.bottom = in_crop[0].bottom;
1552 break;
1553 }
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001554 case QTI_VT_TIMESTAMP:
1555 android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp, in,
1556 &metadata->vtTimeStamp);
1557 break;
1558 case QTI_COLOR_METADATA:
1559 ColorMetaData color;
1560 qtigralloc::decodeColorMetadata(in, &color);
1561 metadata->color = color;
1562 break;
1563 case QTI_PP_PARAM_INTERLACED:
1564 android::gralloc4::decodeInt32(qtigralloc::MetadataType_PPParamInterlaced, in,
1565 &metadata->interlaced);
1566 break;
1567 case QTI_VIDEO_PERF_MODE:
1568 android::gralloc4::decodeUint32(qtigralloc::MetadataType_VideoPerfMode, in,
1569 &metadata->isVideoPerfMode);
1570 break;
1571 case QTI_GRAPHICS_METADATA:
1572 qtigralloc::decodeGraphicsMetadata(in, &metadata->graphics_metadata);
1573 break;
1574 case QTI_UBWC_CR_STATS_INFO:
1575 qtigralloc::decodeUBWCStats(in, &metadata->ubwcCRStats[0]);
1576 break;
1577 case QTI_REFRESH_RATE:
1578 android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate, in,
1579 &metadata->refreshrate);
1580 break;
1581 case QTI_MAP_SECURE_BUFFER:
1582 android::gralloc4::decodeInt32(qtigralloc::MetadataType_MapSecureBuffer, in,
1583 &metadata->mapSecureBuffer);
1584 break;
1585 case QTI_LINEAR_FORMAT:
1586 android::gralloc4::decodeUint32(qtigralloc::MetadataType_LinearFormat, in,
1587 &metadata->linearFormat);
1588 break;
1589 case QTI_SINGLE_BUFFER_MODE:
1590 android::gralloc4::decodeUint32(qtigralloc::MetadataType_SingleBufferMode, in,
1591 &metadata->isSingleBufferMode);
1592 break;
1593 case QTI_CVP_METADATA:
1594 qtigralloc::decodeCVPMetadata(in, &metadata->cvpMetadata);
1595 break;
1596 case QTI_VIDEO_HISTOGRAM_STATS:
1597 qtigralloc::decodeVideoHistogramMetadata(in, &metadata->video_histogram_stats);
1598 break;
1599 default:
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001600#ifdef METADATA_V2
1601 if (IS_VENDOR_METADATA_TYPE(metadatatype_value)) {
1602 metadata->isVendorMetadataSet[GET_VENDOR_METADATA_STATUS_INDEX(metadatatype_value)] = false;
1603 } else {
1604 metadata->isStandardMetadataSet[GET_STANDARD_METADATA_STATUS_INDEX(metadatatype_value)] =
1605 false;
1606 }
1607#endif
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001608 return Error::BAD_VALUE;
1609 }
Tharaga Balachandranfd1029e2020-05-01 10:54:31 -04001610
Tharaga Balachandran74ab1112020-01-08 17:17:56 -05001611 return Error::NONE;
1612}
1613
Naseer Ahmede36f2242017-12-01 15:33:56 -05001614} // namespace gralloc