1 /*
2 * Copyright (c) 2011-2022, The Linux Foundation. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution.
13 * * Neither the name of The Linux Foundation nor the names of its
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 * Changes from Qualcomm Innovation Center are provided under the following license:
30 *
31 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
32 *
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted (subject to the limitations in the
35 * disclaimer below) provided that the following conditions are met:
36 *
37 * * Redistributions of source code must retain the above copyright
38 * notice, this list of conditions and the following disclaimer.
39 *
40 * * Redistributions in binary form must reproduce the above
41 * copyright notice, this list of conditions and the following
42 * disclaimer in the documentation and/or other materials provided
43 * with the distribution.
44 *
45 * * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
46 * contributors may be used to endorse or promote products derived
47 * from this software without specific prior written permission.
48 *
49 * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
50 * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
51 * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
52 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
53 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
54 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
55 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
56 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
57 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
58 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
59 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
60 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
61 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62 */
63
64 #ifndef QMAA
65 #include <media/msm_media_info.h>
66 #endif
67
68 #include <drm/drm_fourcc.h>
69
70 #include <cutils/properties.h>
71 #include <algorithm>
72
73 #include "gr_adreno_info.h"
74 #include "gr_camera_info.h"
75 #include "gr_utils.h"
76
77 #define ASTC_BLOCK_SIZE 16
78
79 namespace gralloc {
80
IsYuvFormat(int format)81 bool IsYuvFormat(int format) {
82 switch (format) {
83 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
84 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
85 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
86 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: // Same as YCbCr_420_SP_VENUS
87 case HAL_PIXEL_FORMAT_NV21_ENCODEABLE:
88 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
89 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
90 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
91 case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
92 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
93 case HAL_PIXEL_FORMAT_NV21_ZSL:
94 case HAL_PIXEL_FORMAT_RAW16:
95 case HAL_PIXEL_FORMAT_Y16:
96 case HAL_PIXEL_FORMAT_RAW12:
97 case HAL_PIXEL_FORMAT_RAW10:
98 case HAL_PIXEL_FORMAT_YV12:
99 case HAL_PIXEL_FORMAT_Y8:
100 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
101 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
102 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
103 case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
104 // Below formats used by camera and VR
105 case HAL_PIXEL_FORMAT_BLOB:
106 case HAL_PIXEL_FORMAT_RAW_OPAQUE:
107 case HAL_PIXEL_FORMAT_NV12_HEIF:
108 case HAL_PIXEL_FORMAT_CbYCrY_422_I:
109 case HAL_PIXEL_FORMAT_NV12_LINEAR_FLEX :
110 case HAL_PIXEL_FORMAT_NV12_UBWC_FLEX:
111 case HAL_PIXEL_FORMAT_NV12_UBWC_FLEX_2_BATCH:
112 case HAL_PIXEL_FORMAT_NV12_UBWC_FLEX_4_BATCH:
113 case HAL_PIXEL_FORMAT_NV12_UBWC_FLEX_8_BATCH:
114 case HAL_PIXEL_FORMAT_MULTIPLANAR_FLEX:
115 return true;
116 default:
117 return false;
118 }
119 }
120
IsUncompressedRGBFormat(int format)121 bool IsUncompressedRGBFormat(int format) {
122 switch (format) {
123 case HAL_PIXEL_FORMAT_RGBA_8888:
124 case HAL_PIXEL_FORMAT_RGBX_8888:
125 case HAL_PIXEL_FORMAT_RGB_888:
126 case HAL_PIXEL_FORMAT_RGB_565:
127 case HAL_PIXEL_FORMAT_BGR_565:
128 case HAL_PIXEL_FORMAT_BGRA_8888:
129 case HAL_PIXEL_FORMAT_RGBA_5551:
130 case HAL_PIXEL_FORMAT_RGBA_4444:
131 case HAL_PIXEL_FORMAT_R_8:
132 case HAL_PIXEL_FORMAT_RG_88:
133 case HAL_PIXEL_FORMAT_BGRX_8888:
134 case HAL_PIXEL_FORMAT_RGBA_1010102:
135 case HAL_PIXEL_FORMAT_ARGB_2101010:
136 case HAL_PIXEL_FORMAT_RGBX_1010102:
137 case HAL_PIXEL_FORMAT_XRGB_2101010:
138 case HAL_PIXEL_FORMAT_BGRA_1010102:
139 case HAL_PIXEL_FORMAT_ABGR_2101010:
140 case HAL_PIXEL_FORMAT_BGRX_1010102:
141 case HAL_PIXEL_FORMAT_XBGR_2101010:
142 case HAL_PIXEL_FORMAT_RGBA_FP16:
143 case HAL_PIXEL_FORMAT_BGR_888:
144 return true;
145 default:
146 break;
147 }
148
149 return false;
150 }
151
IsCompressedRGBFormat(int format)152 bool IsCompressedRGBFormat(int format) {
153 switch (format) {
154 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR:
155 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
156 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x4_KHR:
157 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
158 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x5_KHR:
159 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
160 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x5_KHR:
161 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
162 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x6_KHR:
163 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
164 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x5_KHR:
165 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
166 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x6_KHR:
167 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
168 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x8_KHR:
169 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
170 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x5_KHR:
171 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
172 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x6_KHR:
173 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
174 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x8_KHR:
175 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
176 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x10_KHR:
177 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
178 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x10_KHR:
179 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
180 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x12_KHR:
181 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
182 return true;
183 default:
184 break;
185 }
186
187 return false;
188 }
189
IsCameraCustomFormat(int format)190 bool IsCameraCustomFormat(int format) {
191 switch (format) {
192 case HAL_PIXEL_FORMAT_NV21_ZSL:
193 if (CameraInfo::GetInstance() &&
194 !(CameraInfo::GetInstance()->IsCameraUtilsPresent())) {
195 // If the mapping is made to a camera custom format and lib
196 // is absent, we return false and handle internally.
197 return false;
198 }
199 [[fallthrough]];
200 case HAL_PIXEL_FORMAT_NV12_LINEAR_FLEX:
201 case HAL_PIXEL_FORMAT_NV12_UBWC_FLEX:
202 case HAL_PIXEL_FORMAT_NV12_UBWC_FLEX_2_BATCH:
203 case HAL_PIXEL_FORMAT_NV12_UBWC_FLEX_4_BATCH:
204 case HAL_PIXEL_FORMAT_NV12_UBWC_FLEX_8_BATCH:
205 case HAL_PIXEL_FORMAT_MULTIPLANAR_FLEX:
206 case HAL_PIXEL_FORMAT_RAW_OPAQUE:
207 case HAL_PIXEL_FORMAT_RAW10:
208 case HAL_PIXEL_FORMAT_RAW12:
209 return true;
210 default:
211 break;
212 }
213
214 return false;
215 }
216
GetBppForUncompressedRGB(int format)217 uint32_t GetBppForUncompressedRGB(int format) {
218 uint32_t bpp = 0;
219 switch (format) {
220 case HAL_PIXEL_FORMAT_RGBA_FP16:
221 bpp = 8;
222 break;
223 case HAL_PIXEL_FORMAT_RGBA_8888:
224 case HAL_PIXEL_FORMAT_RGBX_8888:
225 case HAL_PIXEL_FORMAT_BGRA_8888:
226 case HAL_PIXEL_FORMAT_BGRX_8888:
227 case HAL_PIXEL_FORMAT_RGBA_1010102:
228 case HAL_PIXEL_FORMAT_ARGB_2101010:
229 case HAL_PIXEL_FORMAT_RGBX_1010102:
230 case HAL_PIXEL_FORMAT_XRGB_2101010:
231 case HAL_PIXEL_FORMAT_BGRA_1010102:
232 case HAL_PIXEL_FORMAT_ABGR_2101010:
233 case HAL_PIXEL_FORMAT_BGRX_1010102:
234 case HAL_PIXEL_FORMAT_XBGR_2101010:
235 bpp = 4;
236 break;
237 case HAL_PIXEL_FORMAT_RGB_888:
238 case HAL_PIXEL_FORMAT_BGR_888:
239 bpp = 3;
240 break;
241 case HAL_PIXEL_FORMAT_RGB_565:
242 case HAL_PIXEL_FORMAT_BGR_565:
243 case HAL_PIXEL_FORMAT_RGBA_5551:
244 case HAL_PIXEL_FORMAT_RGBA_4444:
245 case HAL_PIXEL_FORMAT_RG_88:
246 bpp = 2;
247 break;
248 case HAL_PIXEL_FORMAT_R_8:
249 bpp = 1;
250 break;
251 default:
252 ALOGE("Error : %s New format request = 0x%x", __FUNCTION__, format);
253 break;
254 }
255
256 return bpp;
257 }
258
CpuCanAccess(uint64_t usage)259 bool CpuCanAccess(uint64_t usage) {
260 return CpuCanRead(usage) || CpuCanWrite(usage);
261 }
262
CpuCanRead(uint64_t usage)263 bool CpuCanRead(uint64_t usage) {
264 if (usage & BufferUsage::CPU_READ_MASK) {
265 return true;
266 }
267
268 return false;
269 }
270
CpuCanWrite(uint64_t usage)271 bool CpuCanWrite(uint64_t usage) {
272 if (usage & BufferUsage::CPU_WRITE_MASK) {
273 // Application intends to use CPU for rendering
274 return true;
275 }
276
277 return false;
278 }
279
GetDataAlignment(int format,uint64_t usage)280 uint32_t GetDataAlignment(int format, uint64_t usage) {
281 uint32_t align = UINT(getpagesize());
282 if (format == HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED) {
283 align = SIZE_8K;
284 }
285
286 if (usage & BufferUsage::PROTECTED) {
287 if ((usage & BufferUsage::CAMERA_OUTPUT) || (usage & GRALLOC_USAGE_PRIVATE_SECURE_DISPLAY)) {
288 // The alignment here reflects qsee mmu V7L/V8L requirement
289 align = SZ_2M;
290 } else {
291 align = SECURE_ALIGN;
292 }
293 }
294
295 return align;
296 }
297
IsGPUFlagSupported(uint64_t usage)298 bool IsGPUFlagSupported(uint64_t usage) {
299 bool ret = true;
300 if ((usage & BufferUsage::GPU_MIPMAP_COMPLETE)) {
301 ALOGE("GPU_MIPMAP_COMPLETE not supported");
302 ret = false;
303 }
304
305 if ((usage & BufferUsage::GPU_CUBE_MAP)) {
306 ALOGE("GPU_CUBE_MAP not supported");
307 ret = false;
308 }
309
310 return ret;
311 }
312
GetBpp(int format)313 int GetBpp(int format) {
314 if (IsUncompressedRGBFormat(format)) {
315 return GetBppForUncompressedRGB(format);
316 }
317 switch (format) {
318 case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR:
319 case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
320 case HAL_PIXEL_FORMAT_RAW8:
321 case HAL_PIXEL_FORMAT_Y8:
322 return 1;
323 case HAL_PIXEL_FORMAT_RAW16:
324 case HAL_PIXEL_FORMAT_Y16:
325 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
326 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
327 case HAL_PIXEL_FORMAT_YCbCr_422_I:
328 case HAL_PIXEL_FORMAT_YCrCb_422_I:
329 case HAL_PIXEL_FORMAT_CbYCrY_422_I:
330 return 2;
331 case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
332 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
333 return 3;
334 default:
335 return -1;
336 }
337 }
338
339 // Returns the final buffer size meant to be allocated with ion
GetSize(const BufferInfo & info,unsigned int alignedw,unsigned int alignedh)340 unsigned int GetSize(const BufferInfo &info, unsigned int alignedw, unsigned int alignedh) {
341 unsigned int size = 0;
342 int format = info.format;
343 int width = info.width;
344 int height = info.height;
345 uint64_t usage = info.usage;
346
347 if (!IsGPUFlagSupported(usage)) {
348 ALOGE("Unsupported GPU usage flags present 0x%" PRIx64, usage);
349 return 0;
350 }
351
352 if (IsCameraCustomFormat(format) && CameraInfo::GetInstance()) {
353 int result = CameraInfo::GetInstance()->GetBufferSize(format, width, height, &size);
354 if (result != 0) {
355 ALOGE("%s: Failed to get the buffer size through camera library. Error code: %d",
356 __FUNCTION__, result);
357 return 0;
358 }
359 } else if (IsUBwcEnabled(format, usage)) {
360 size = GetUBwcSize(width, height, format, alignedw, alignedh);
361 } else if (IsUncompressedRGBFormat(format)) {
362 uint32_t bpp = GetBppForUncompressedRGB(format);
363 size = alignedw * alignedh * bpp;
364 } else if (IsCompressedRGBFormat(format)) {
365 size = alignedw * alignedh * ASTC_BLOCK_SIZE;
366 } else {
367 // Below switch should be for only YUV/custom formats
368 switch (format) {
369 case HAL_PIXEL_FORMAT_RAW16:
370 case HAL_PIXEL_FORMAT_Y16:size = alignedw * alignedh * 2;
371 break;
372 case HAL_PIXEL_FORMAT_RAW10:
373 case HAL_PIXEL_FORMAT_RAW12:size = ALIGN(alignedw * alignedh, SIZE_4K);
374 break;
375 case HAL_PIXEL_FORMAT_RAW8:
376 case HAL_PIXEL_FORMAT_Y8:size = alignedw * alignedh * 1;
377 break;
378 // adreno formats
379 case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: // NV21
380 size = ALIGN(alignedw * alignedh, SIZE_4K);
381 size += (unsigned int) ALIGN(2 * ALIGN(width / 2, 32) * ALIGN(height / 2, 32), SIZE_4K);
382 break;
383 case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: // NV12
384 // The chroma plane is subsampled,
385 // but the pitch in bytes is unchanged
386 // The GPU needs 4K alignment, but the video decoder needs 8K
387 size = ALIGN(alignedw * alignedh, SIZE_8K);
388 size += ALIGN(alignedw * (unsigned int) ALIGN(height / 2, 32), SIZE_8K);
389 break;
390 case HAL_PIXEL_FORMAT_YV12:
391 if ((format == HAL_PIXEL_FORMAT_YV12) && ((width & 1) || (height & 1))) {
392 ALOGE("w or h is odd for the YV12 format");
393 return 0;
394 }
395 size = alignedw * alignedh + (ALIGN(alignedw / 2, 16) * (alignedh / 2)) * 2;
396 size = ALIGN(size, (unsigned int) SIZE_4K);
397 break;
398 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
399 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
400 size = ALIGN((alignedw * alignedh) + (alignedw * alignedh) / 2 + 1, SIZE_4K);
401 break;
402 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
403 size = ALIGN((alignedw * alignedh * 2) + (alignedw * alignedh) + 1, SIZE_4K);
404 break;
405 #ifndef QMAA
406 case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
407 size = VENUS_BUFFER_SIZE(COLOR_FMT_P010,
408 width,
409 height);
410 break;
411 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
412 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
413 case HAL_PIXEL_FORMAT_YCbCr_422_I:
414 case HAL_PIXEL_FORMAT_YCrCb_422_I:
415 case HAL_PIXEL_FORMAT_CbYCrY_422_I:
416 if (width & 1) {
417 ALOGE("width is odd for the YUV422_SP format");
418 return 0;
419 }
420 size = ALIGN(alignedw * alignedh * 2, SIZE_4K);
421 break;
422 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
423 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
424 size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height);
425 break;
426 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
427 case HAL_PIXEL_FORMAT_NV21_ENCODEABLE:
428 size = VENUS_BUFFER_SIZE(COLOR_FMT_NV21, width, height);
429 break;
430 case HAL_PIXEL_FORMAT_BLOB:
431 if (height != 1) {
432 ALOGE("%s: Buffers with HAL_PIXEL_FORMAT_BLOB must have height 1 ", __FUNCTION__);
433 return 0;
434 }
435 size = (unsigned int) width;
436 break;
437 case HAL_PIXEL_FORMAT_NV12_HEIF:
438 size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12_512, width, height);
439 break;
440 case HAL_PIXEL_FORMAT_NV21_ZSL:
441 size = ALIGN((alignedw * alignedh) + (alignedw * alignedh) / 2,
442 SIZE_4K);
443 break;
444 #endif
445 default:ALOGE("%s: Unrecognized pixel format: 0x%x", __FUNCTION__, format);
446 return 0;
447 }
448 }
449 auto align = GetDataAlignment(format, usage);
450 size = ALIGN(size, align) * info.layer_count;
451 return size;
452 }
453
GetBufferSizeAndDimensions(const BufferInfo & info,unsigned int * size,unsigned int * alignedw,unsigned int * alignedh)454 int GetBufferSizeAndDimensions(const BufferInfo &info, unsigned int *size, unsigned int *alignedw,
455 unsigned int *alignedh) {
456 GraphicsMetadata graphics_metadata = {};
457 return GetBufferSizeAndDimensions(info, size, alignedw, alignedh, &graphics_metadata);
458 }
459
GetBufferSizeAndDimensions(const BufferInfo & info,unsigned int * size,unsigned int * alignedw,unsigned int * alignedh,GraphicsMetadata * graphics_metadata)460 int GetBufferSizeAndDimensions(const BufferInfo &info, unsigned int *size, unsigned int *alignedw,
461 unsigned int *alignedh, GraphicsMetadata *graphics_metadata) {
462 int buffer_type = GetBufferType(info.format);
463 if (CanUseAdrenoForSize(buffer_type, info.usage)) {
464 return GetGpuResourceSizeAndDimensions(info, size, alignedw, alignedh, graphics_metadata);
465 } else {
466 GetAlignedWidthAndHeight(info, alignedw, alignedh);
467 *size = GetSize(info, *alignedw, *alignedh);
468 }
469 return 0;
470 }
471
GetYuvUbwcSPPlaneInfo(uint32_t width,uint32_t height,int color_format,PlaneLayoutInfo * plane_info)472 void GetYuvUbwcSPPlaneInfo(uint32_t width, uint32_t height, int color_format,
473 PlaneLayoutInfo *plane_info) {
474 // UBWC buffer has these 4 planes in the following sequence:
475 // Y_Plane, UV_Plane, Y_Meta_Plane, UV_Meta_Plane
476 unsigned int y_meta_stride = 0, y_meta_height = 0, y_meta_size = 0;
477 unsigned int y_stride = 0, y_height = 0, y_size = 0;
478 unsigned int c_meta_stride = 0, c_meta_height = 0, c_meta_size = 0;
479 unsigned int alignment = 4096;
480 unsigned int c_stride = 0, c_height = 0, c_size = 0;
481 uint64_t yOffset = 0, cOffset = 0, yMetaOffset = 0, cMetaOffset = 0;
482
483 #ifndef QMAA
484 y_meta_stride = VENUS_Y_META_STRIDE(color_format, INT(width));
485 y_meta_height = VENUS_Y_META_SCANLINES(color_format, INT(height));
486 y_meta_size = ALIGN((y_meta_stride * y_meta_height), alignment);
487
488 y_stride = VENUS_Y_STRIDE(color_format, INT(width));
489 y_height = VENUS_Y_SCANLINES(color_format, INT(height));
490 y_size = ALIGN((y_stride * y_height), alignment);
491
492 c_meta_stride = VENUS_UV_META_STRIDE(color_format, INT(width));
493 c_meta_height = VENUS_UV_META_SCANLINES(color_format, INT(height));
494 c_meta_size = ALIGN((c_meta_stride * c_meta_height), alignment);
495
496 c_stride = VENUS_UV_STRIDE(color_format, INT(width));
497 c_height = VENUS_UV_SCANLINES(color_format, INT(height));
498 c_size = ALIGN((c_stride * c_height), alignment);
499 #endif
500 yMetaOffset = 0;
501 yOffset = y_meta_size;
502 cMetaOffset = y_meta_size + y_size;
503 cOffset = y_meta_size + y_size + c_meta_size;
504
505 plane_info[0].component = (PlaneComponent)PLANE_COMPONENT_Y;
506 plane_info[0].offset = (uint32_t)yOffset;
507 plane_info[0].stride = static_cast<int32_t>(UINT(width));
508 plane_info[0].stride_bytes = static_cast<int32_t>(y_stride);
509 plane_info[0].scanlines = static_cast<int32_t>(y_height);
510 plane_info[0].size = static_cast<uint32_t>(y_size);
511
512 plane_info[1].component = (PlaneComponent)(PLANE_COMPONENT_Cb | PLANE_COMPONENT_Cr);
513 plane_info[1].offset = (uint32_t)cOffset;
514 plane_info[1].stride = static_cast<int32_t>(UINT(width));
515 plane_info[1].stride_bytes = static_cast<int32_t>(c_stride);
516 plane_info[1].scanlines = static_cast<int32_t>(c_height);
517 plane_info[1].size = static_cast<uint32_t>(c_size);
518
519 plane_info[2].component = (PlaneComponent)(PLANE_COMPONENT_META | PLANE_COMPONENT_Y);
520 plane_info[2].offset = (uint32_t)yMetaOffset;
521 plane_info[2].stride = static_cast<int32_t>(UINT(width));
522 plane_info[2].stride_bytes = static_cast<int32_t>(y_meta_stride);
523 plane_info[2].scanlines = static_cast<int32_t>(y_meta_height);
524 plane_info[2].size = static_cast<uint32_t>(y_meta_size);
525
526 plane_info[3].component =
527 (PlaneComponent)(PLANE_COMPONENT_META | PLANE_COMPONENT_Cb | PLANE_COMPONENT_Cr);
528 plane_info[3].offset = (uint32_t)cMetaOffset;
529 plane_info[3].stride = static_cast<int32_t>(UINT(width));
530 plane_info[3].stride_bytes = static_cast<int32_t>(c_meta_stride);
531 plane_info[3].scanlines = static_cast<int32_t>(c_meta_height);
532 plane_info[3].size = static_cast<uint32_t>(c_meta_size);
533 }
534
535 // This API gets information about 8 planes (Y_Plane, UV_Plane, Y_Meta_Plane, UV_Meta_Plane,
536 // Y_Plane, UV_Plane, Y_Meta_Plane, UV_Meta_Plane) and it stores the
537 // information in PlaneLayoutInfo array.
GetYuvUbwcInterlacedSPPlaneInfo(uint32_t width,uint32_t height,PlaneLayoutInfo plane_info[8])538 void GetYuvUbwcInterlacedSPPlaneInfo(uint32_t width, uint32_t height,
539 PlaneLayoutInfo plane_info[8]) {
540 // UBWC interlaced has top-bottom field layout with each field as
541 // 8-plane (including meta plane also) NV12_UBWC with width = image_width
542 // & height = image_height / 2.
543 // Client passed plane_info argument is ptr to struct PlaneLayoutInfo[8].
544 // Plane info to be filled for each field separately.
545 height = (height + 1) >> 1;
546
547 #ifndef QMAA
548 GetYuvUbwcSPPlaneInfo(width, height, COLOR_FMT_NV12_UBWC, &plane_info[0]);
549
550 GetYuvUbwcSPPlaneInfo(width, height, COLOR_FMT_NV12_UBWC, &plane_info[4]);
551 #endif
552 }
553
554 // This API gets information about 2 planes (Y_Plane & UV_Plane).
555 // Here width and height are aligned width and aligned height.
556 // bpp: bits per pixel.
GetYuvSPPlaneInfo(const BufferInfo & info,int format,uint32_t width,uint32_t height,uint32_t bpp,PlaneLayoutInfo * plane_info)557 void GetYuvSPPlaneInfo(const BufferInfo &info, int format, uint32_t width, uint32_t height,
558 uint32_t bpp, PlaneLayoutInfo *plane_info) {
559 int unaligned_width = info.width;
560 int unaligned_height = info.height;
561 unsigned int y_stride = 0, y_height = 0, y_size = 0;
562 unsigned int c_stride = 0, c_height = 0, c_size = 0;
563 uint64_t yOffset, cOffset;
564
565 y_stride = c_stride = UINT(width) * bpp;
566 y_height = INT(height);
567 y_size = y_stride * y_height;
568 switch (format) {
569 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
570 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
571 c_size = (width * height) / 2 + 1;
572 c_height = height >> 1;
573 break;
574 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
575 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
576 if (unaligned_width & 1) {
577 ALOGE("width is odd for the YUV422_SP format");
578 return;
579 }
580 c_size = width * height;
581 c_height = height;
582 break;
583 #ifndef QMAA
584 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
585 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
586 c_height = VENUS_UV_SCANLINES(COLOR_FMT_NV12, height);
587 c_size = c_stride * c_height;
588 break;
589 case HAL_PIXEL_FORMAT_NV12_HEIF:
590 c_height = VENUS_UV_SCANLINES(COLOR_FMT_NV12_512, height);
591 c_size = c_stride * c_height;
592 break;
593 case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
594 y_size = ALIGN(width * height, 4096);
595 c_size = ALIGN(2 * ALIGN(unaligned_width / 2, 32) * ALIGN(unaligned_height / 2, 32), 4096);
596 break;
597 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
598 case HAL_PIXEL_FORMAT_NV21_ENCODEABLE:
599 c_height = VENUS_UV_SCANLINES(COLOR_FMT_NV21, height);
600 c_size = c_stride * c_height;
601 break;
602 #endif
603 case HAL_PIXEL_FORMAT_Y16:
604 c_size = c_stride = 0;
605 c_height = 0;
606 break;
607 case HAL_PIXEL_FORMAT_Y8:
608 c_size = c_stride = 0;
609 c_height = 0;
610 break;
611 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
612 c_size = (width * height) + 1;
613 c_height = height;
614 break;
615 default:
616 break;
617 }
618
619 yOffset = 0;
620 cOffset = y_size;
621
622 plane_info[0].component = (PlaneComponent)PLANE_COMPONENT_Y;
623 plane_info[0].offset = (uint32_t)yOffset;
624 plane_info[0].step = 1;
625 plane_info[0].stride = static_cast<int32_t>(UINT(width));
626 plane_info[0].stride_bytes = static_cast<int32_t>(y_stride);
627 plane_info[0].scanlines = static_cast<int32_t>(y_height);
628 plane_info[0].size = static_cast<uint32_t>(y_size);
629
630 plane_info[1].component = (PlaneComponent)(PLANE_COMPONENT_Cb | PLANE_COMPONENT_Cr);
631 plane_info[1].offset = (uint32_t)cOffset;
632 plane_info[1].step = 2 * bpp;
633 plane_info[1].stride = static_cast<int32_t>(UINT(width));
634 plane_info[1].stride_bytes = static_cast<int32_t>(c_stride);
635 plane_info[1].scanlines = static_cast<int32_t>(c_height);
636 plane_info[1].size = static_cast<uint32_t>(c_size);
637 }
638
GetYUVPlaneInfo(const private_handle_t * hnd,struct android_ycbcr ycbcr[2])639 int GetYUVPlaneInfo(const private_handle_t *hnd, struct android_ycbcr ycbcr[2]) {
640 int err = 0;
641 uint32_t width = UINT(hnd->width);
642 uint32_t height = UINT(hnd->height);
643 int format = hnd->format;
644 uint64_t usage = hnd->usage;
645 int32_t interlaced = 0;
646 int plane_count = 0;
647 int unaligned_width = INT(hnd->unaligned_width);
648 int unaligned_height = INT(hnd->unaligned_height);
649 BufferInfo info(unaligned_width, unaligned_height, format, usage);
650
651 memset(ycbcr->reserved, 0, sizeof(ycbcr->reserved));
652
653 // Check if UBWC buffer has been rendered in linear format.
654 int linear_format = 0;
655 if (getMetaData(const_cast<private_handle_t *>(hnd), GET_LINEAR_FORMAT, &linear_format) == 0) {
656 format = INT(linear_format);
657 }
658
659 // Check metadata if the geometry has been updated.
660 BufferDim_t buffer_dim;
661 if (getMetaData(const_cast<private_handle_t *>(hnd), GET_BUFFER_GEOMETRY, &buffer_dim) == 0) {
662 BufferInfo info(buffer_dim.sliceWidth, buffer_dim.sliceHeight, format, usage);
663 GetAlignedWidthAndHeight(info, &width, &height);
664 }
665
666 // Check metadata for interlaced content.
667 int interlace_flag = 0;
668 if (getMetaData(const_cast<private_handle_t *>(hnd), GET_PP_PARAM_INTERLACED, &interlace_flag) ==
669 0) {
670 if (interlace_flag) {
671 interlaced = LAYOUT_INTERLACED_FLAG;
672 }
673 }
674
675 PlaneLayoutInfo plane_info[8] = {};
676 // Get the chroma offsets from the handle width/height. We take advantage
677 // of the fact the width _is_ the stride
678 err = GetYUVPlaneInfo(info, format, width, height, interlaced, &plane_count, plane_info);
679 if (err == 0) {
680 if (interlaced && format == HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC) {
681 CopyPlaneLayoutInfotoAndroidYcbcr(hnd->base, plane_count, &plane_info[0], &ycbcr[0]);
682 unsigned int uv_stride = 0, uv_height = 0, uv_size = 0;
683 unsigned int alignment = 4096;
684 uint64_t field_base;
685 height = (height + 1) >> 1;
686 #ifndef QMAA
687 uv_stride = VENUS_UV_STRIDE(COLOR_FMT_NV12_UBWC, INT(width));
688 uv_height = VENUS_UV_SCANLINES(COLOR_FMT_NV12_UBWC, INT(height));
689 #endif
690 uv_size = ALIGN((uv_stride * uv_height), alignment);
691 field_base = hnd->base + plane_info[1].offset + uv_size;
692 memset(ycbcr[1].reserved, 0, sizeof(ycbcr[1].reserved));
693 CopyPlaneLayoutInfotoAndroidYcbcr(field_base, plane_count, &plane_info[4], &ycbcr[1]);
694 } else {
695 CopyPlaneLayoutInfotoAndroidYcbcr(hnd->base, plane_count, plane_info, ycbcr);
696 switch (format) {
697 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
698 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
699 case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
700 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
701 case HAL_PIXEL_FORMAT_NV21_ZSL:
702 std::swap(ycbcr->cb, ycbcr->cr);
703 }
704 }
705 }
706 return err;
707 }
708
GetRawPlaneInfo(int32_t format,int32_t width,int32_t height,PlaneLayoutInfo * plane_info)709 int GetRawPlaneInfo(int32_t format, int32_t width, int32_t height, PlaneLayoutInfo *plane_info) {
710 int32_t step = 0;
711
712 switch (format) {
713 case HAL_PIXEL_FORMAT_RAW16:
714 step = 2;
715 break;
716 case HAL_PIXEL_FORMAT_RAW8:
717 step = 1;
718 break;
719 case HAL_PIXEL_FORMAT_RAW12:
720 case HAL_PIXEL_FORMAT_RAW10:
721 case HAL_PIXEL_FORMAT_BLOB:
722 step = 0;
723 break;
724 default:
725 ALOGW("RawPlaneInfo is unsupported for format 0x%x", format);
726 return -EINVAL;
727 }
728
729 BufferInfo info(width, height, format);
730 uint32_t alignedWidth, alignedHeight;
731 GetAlignedWidthAndHeight(info, &alignedWidth, &alignedHeight);
732
733 uint32_t size = GetSize(info, alignedWidth, alignedHeight);
734
735 plane_info[0].component = (PlaneComponent)PLANE_COMPONENT_RAW;
736 plane_info[0].h_subsampling = 0;
737 plane_info[0].v_subsampling = 0;
738 plane_info[0].offset = 0;
739 plane_info[0].step = step;
740 plane_info[0].stride = width;
741 plane_info[0].stride_bytes = static_cast<int32_t>(alignedWidth);
742 if (format == HAL_PIXEL_FORMAT_RAW16) {
743 plane_info[0].stride_bytes = static_cast<int32_t>(alignedWidth * GetBpp(format));
744 }
745 plane_info[0].scanlines = height;
746 plane_info[0].size = size;
747
748 return 0;
749 }
750
751 // Explicitly defined UBWC formats
IsUBwcFormat(int format)752 bool IsUBwcFormat(int format) {
753 switch (format) {
754 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
755 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
756 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
757 return true;
758 default:
759 return false;
760 }
761 }
762
IsUBwcSupported(int format)763 bool IsUBwcSupported(int format) {
764 // Existing HAL formats with UBWC support
765 switch (format) {
766 case HAL_PIXEL_FORMAT_BGR_565:
767 case HAL_PIXEL_FORMAT_RGBA_8888:
768 case HAL_PIXEL_FORMAT_RGBX_8888:
769 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
770 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
771 case HAL_PIXEL_FORMAT_RGBA_1010102:
772 case HAL_PIXEL_FORMAT_RGBX_1010102:
773 case HAL_PIXEL_FORMAT_DEPTH_16:
774 case HAL_PIXEL_FORMAT_DEPTH_24:
775 case HAL_PIXEL_FORMAT_DEPTH_24_STENCIL_8:
776 case HAL_PIXEL_FORMAT_DEPTH_32F:
777 case HAL_PIXEL_FORMAT_STENCIL_8:
778 case HAL_PIXEL_FORMAT_RGBA_FP16:
779 return true;
780 default:
781 break;
782 }
783
784 return false;
785 }
786
IsUBwcPISupported(int format,uint64_t usage)787 bool IsUBwcPISupported(int format, uint64_t usage) {
788 // TODO(user): try and differentiate b/w mdp capability to support PI.
789 if (!(usage & GRALLOC_USAGE_PRIVATE_ALLOC_UBWC_PI)) {
790 return false;
791 }
792
793 // As of now only two formats
794 switch (format) {
795 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
796 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC: {
797 if ((usage & BufferUsage::GPU_TEXTURE) || (usage & BufferUsage::GPU_RENDER_TARGET)) {
798 if (AdrenoMemInfo::GetInstance()) {
799 return AdrenoMemInfo::GetInstance()->IsPISupportedByGPU(format, usage);
800 }
801 } else {
802 return true;
803 }
804 }
805 }
806
807 return false;
808 }
809
IsUBwcEnabled(int format,uint64_t usage)810 bool IsUBwcEnabled(int format, uint64_t usage) {
811 // Allow UBWC, if client is using an explicitly defined UBWC pixel format.
812 if (IsUBwcFormat(format)) {
813 return true;
814 }
815
816 // Allow UBWC, if an OpenGL client sets UBWC usage flag and GPU plus MDP
817 // support the format. OR if a non-OpenGL client like Rotator, sets UBWC
818 // usage flag and MDP supports the format.
819 if (((usage & GRALLOC_USAGE_PRIVATE_ALLOC_UBWC) ||
820 (usage & GRALLOC_USAGE_PRIVATE_ALLOC_UBWC_PI) ||
821 (usage & BufferUsage::COMPOSER_CLIENT_TARGET))
822 && IsUBwcSupported(format)) {
823 bool enable = true;
824 // Query GPU for UBWC only if buffer is intended to be used by GPU.
825 if ((usage & BufferUsage::GPU_TEXTURE) || (usage & BufferUsage::GPU_RENDER_TARGET)) {
826 if (AdrenoMemInfo::GetInstance()) {
827 enable = AdrenoMemInfo::GetInstance()->IsUBWCSupportedByGPU(format);
828 }
829 }
830
831 // Allow UBWC, only if CPU usage flags are not set
832 if (enable && !(CpuCanAccess(usage))) {
833 return true;
834 }
835 }
836
837 return false;
838 }
839
GetYuvUBwcWidthAndHeight(int width,int height,int format,unsigned int * aligned_w,unsigned int * aligned_h)840 void GetYuvUBwcWidthAndHeight(int width, int height, int format, unsigned int *aligned_w,
841 unsigned int *aligned_h) {
842 switch (format) {
843 #ifndef QMAA
844 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
845 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
846 *aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV12, width);
847 *aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height);
848 break;
849 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
850 *aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, width);
851 *aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, height);
852 break;
853 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
854 // The macro returns the stride which is 4/3 times the width, hence * 3/4
855 *aligned_w = (VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, width) * 3) / 4;
856 *aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, height);
857 break;
858 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
859 // The macro returns the stride which is 2 times the width, hence / 2
860 *aligned_w = (VENUS_Y_STRIDE(COLOR_FMT_P010_UBWC, width) / 2);
861 *aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_P010_UBWC, height);
862 break;
863 #endif
864 default:
865 ALOGE("%s: Unsupported pixel format: 0x%x", __FUNCTION__, format);
866 *aligned_w = 0;
867 *aligned_h = 0;
868 break;
869 }
870 }
871
GetRgbUBwcBlockSize(uint32_t bpp,int * block_width,int * block_height)872 void GetRgbUBwcBlockSize(uint32_t bpp, int *block_width, int *block_height) {
873 *block_width = 0;
874 *block_height = 0;
875
876 switch (bpp) {
877 case 2:
878 case 4:
879 *block_width = 16;
880 *block_height = 4;
881 break;
882 case 8:
883 *block_width = 8;
884 *block_height = 4;
885 break;
886 case 16:
887 *block_width = 4;
888 *block_height = 4;
889 break;
890 default:
891 ALOGE("%s: Unsupported bpp: %d", __FUNCTION__, bpp);
892 break;
893 }
894 }
895
GetRgbUBwcMetaBufferSize(int width,int height,uint32_t bpp)896 unsigned int GetRgbUBwcMetaBufferSize(int width, int height, uint32_t bpp) {
897 unsigned int size = 0;
898 int meta_width, meta_height;
899 int block_width, block_height;
900
901 GetRgbUBwcBlockSize(bpp, &block_width, &block_height);
902 if (!block_width || !block_height) {
903 ALOGE("%s: Unsupported bpp: %d", __FUNCTION__, bpp);
904 return size;
905 }
906
907 // Align meta buffer height to 16 blocks
908 meta_height = ALIGN(((height + block_height - 1) / block_height), 16);
909
910 // Align meta buffer width to 64 blocks
911 meta_width = ALIGN(((width + block_width - 1) / block_width), 64);
912
913 // Align meta buffer size to 4K
914 size = (unsigned int)ALIGN((meta_width * meta_height), 4096);
915
916 return size;
917 }
918
GetUBwcSize(int width,int height,int format,unsigned int alignedw,unsigned int alignedh)919 unsigned int GetUBwcSize(int width, int height, int format, unsigned int alignedw,
920 unsigned int alignedh) {
921 unsigned int size = 0;
922 uint32_t bpp = 0;
923 switch (format) {
924 case HAL_PIXEL_FORMAT_BGR_565:
925 case HAL_PIXEL_FORMAT_RGBA_8888:
926 case HAL_PIXEL_FORMAT_RGBX_8888:
927 case HAL_PIXEL_FORMAT_RGBA_1010102:
928 case HAL_PIXEL_FORMAT_RGBX_1010102:
929 case HAL_PIXEL_FORMAT_RGBA_FP16:
930 bpp = GetBppForUncompressedRGB(format);
931 size = alignedw * alignedh * bpp;
932 size += GetRgbUBwcMetaBufferSize(width, height, bpp);
933 break;
934 #ifndef QMAA
935 /*
936 * 1. The CtsMediaV2TestCases#CodecEncoderSurfaceTest is a transcode use case and shares
937 * same surface between encoder and decoder.
938 * 2. Configures encoder with Opaque color format thus encoder sets ubwc usage bits and
939 * is configured with NV12_UBWC format.
940 * 3. Configures decoder as 'flexible', thus configuring decoder with NV12 format.
941 * 4. Decoder should produce output to surface that will be fed back to encoder as input.
942 * 5. Though UBWC is enabled, we need to compute the actual buffer size (including aligned
943 * width and height) based on pixel format that is set.
944 */
945 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
946 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
947 size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height);
948 break;
949 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
950 size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12_UBWC, width, height);
951 break;
952 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
953 size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12_BPP10_UBWC, width, height);
954 break;
955 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
956 size = VENUS_BUFFER_SIZE(COLOR_FMT_P010_UBWC, width, height);
957 break;
958 #endif
959 default:
960 ALOGE("%s: Unsupported pixel format: 0x%x", __FUNCTION__, format);
961 break;
962 }
963
964 return size;
965 }
966
GetRgbMetaSize(int format,uint32_t width,uint32_t height,uint64_t usage)967 unsigned int GetRgbMetaSize(int format, uint32_t width, uint32_t height, uint64_t usage) {
968 unsigned int meta_size = 0;
969 if (!IsUBwcEnabled(format, usage)) {
970 return meta_size;
971 }
972 uint32_t bpp = GetBppForUncompressedRGB(format);
973 switch (format) {
974 case HAL_PIXEL_FORMAT_BGR_565:
975 case HAL_PIXEL_FORMAT_RGBA_8888:
976 case HAL_PIXEL_FORMAT_RGBX_8888:
977 case HAL_PIXEL_FORMAT_RGBA_1010102:
978 case HAL_PIXEL_FORMAT_RGBX_1010102:
979 case HAL_PIXEL_FORMAT_RGBA_FP16:
980 meta_size = GetRgbUBwcMetaBufferSize(width, height, bpp);
981 break;
982 default:
983 ALOGE("%s:Unsupported RGB format: 0x%x", __FUNCTION__, format);
984 break;
985 }
986 return meta_size;
987 }
988
GetRgbDataAddress(private_handle_t * hnd,void ** rgb_data)989 int GetRgbDataAddress(private_handle_t *hnd, void **rgb_data) {
990 int err = 0;
991
992 // This api is for RGB* formats
993 if (!IsUncompressedRGBFormat(hnd->format)) {
994 return -EINVAL;
995 }
996
997 // linear buffer, nothing to do further
998 if (!(hnd->flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED)) {
999 *rgb_data = reinterpret_cast<void *>(hnd->base);
1000 return err;
1001 }
1002 unsigned int meta_size = GetRgbMetaSize(hnd->format, hnd->width, hnd->height, hnd->usage);
1003
1004 *rgb_data = reinterpret_cast<void *>(hnd->base + meta_size);
1005
1006 return err;
1007 }
1008
GetCustomDimensions(private_handle_t * hnd,int * stride,int * height)1009 void GetCustomDimensions(private_handle_t *hnd, int *stride, int *height) {
1010 BufferDim_t buffer_dim;
1011 int interlaced = 0;
1012
1013 *stride = hnd->width;
1014 *height = hnd->height;
1015 if (getMetaData(hnd, GET_BUFFER_GEOMETRY, &buffer_dim) == 0) {
1016 *stride = buffer_dim.sliceWidth;
1017 *height = buffer_dim.sliceHeight;
1018 } else if (getMetaData(hnd, GET_PP_PARAM_INTERLACED, &interlaced) == 0) {
1019 if (interlaced && IsUBwcFormat(hnd->format)) {
1020 unsigned int alignedw = 0, alignedh = 0;
1021 // Get re-aligned height for single ubwc interlaced field and
1022 // multiply by 2 to get frame height.
1023 BufferInfo info(hnd->width, ((hnd->height + 1) >> 1), hnd->format);
1024 GetAlignedWidthAndHeight(info, &alignedw, &alignedh);
1025 *stride = static_cast<int>(alignedw);
1026 *height = static_cast<int>(alignedh * 2);
1027 }
1028 }
1029 }
1030
GetColorSpaceFromMetadata(private_handle_t * hnd,int * color_space)1031 void GetColorSpaceFromMetadata(private_handle_t *hnd, int *color_space) {
1032 ColorMetaData color_metadata;
1033 if (getMetaData(hnd, GET_COLOR_METADATA, &color_metadata) == 0) {
1034 switch (color_metadata.colorPrimaries) {
1035 case ColorPrimaries_BT709_5:
1036 *color_space = HAL_CSC_ITU_R_709;
1037 break;
1038 case ColorPrimaries_BT601_6_525:
1039 case ColorPrimaries_BT601_6_625:
1040 *color_space = ((color_metadata.range) ? HAL_CSC_ITU_R_601_FR : HAL_CSC_ITU_R_601);
1041 break;
1042 case ColorPrimaries_BT2020:
1043 *color_space = (color_metadata.range) ? HAL_CSC_ITU_R_2020_FR : HAL_CSC_ITU_R_2020;
1044 break;
1045 default:
1046 ALOGW("Unknown Color primary = %d", color_metadata.colorPrimaries);
1047 break;
1048 }
1049 } else if (getMetaData(hnd, GET_COLOR_SPACE, color_space) != 0) {
1050 *color_space = 0;
1051 }
1052 }
1053
GetAlignedWidthAndHeight(const BufferInfo & info,unsigned int * alignedw,unsigned int * alignedh)1054 void GetAlignedWidthAndHeight(const BufferInfo &info, unsigned int *alignedw,
1055 unsigned int *alignedh) {
1056 int width = info.width;
1057 int height = info.height;
1058 int format = info.format;
1059 uint64_t usage = info.usage;
1060
1061 // Currently surface padding is only computed for RGB* surfaces.
1062 bool ubwc_enabled = IsUBwcEnabled(format, usage);
1063 int tile = ubwc_enabled;
1064
1065 // Use of aligned width and aligned height is to calculate the size of buffer,
1066 // but in case of camera custom format size is being calculated from given width
1067 // and given height.
1068 if (IsCameraCustomFormat(format) && CameraInfo::GetInstance()) {
1069 int aligned_w = width;
1070 int aligned_h = height;
1071 int result = CameraInfo::GetInstance()->GetStrideInBytes(
1072 format, (PlaneComponent)PLANE_COMPONENT_Y, width, &aligned_w);
1073 if (result != 0) {
1074 ALOGE(
1075 "%s: Failed to get the aligned width for camera custom format. width: %d, height: %d,"
1076 "format: %d, Error code: %d",
1077 __FUNCTION__, width, height, format, result);
1078 *alignedw = width;
1079 *alignedh = aligned_h;
1080 return;
1081 }
1082
1083 result = CameraInfo::GetInstance()->GetScanline(format, (PlaneComponent)PLANE_COMPONENT_Y,
1084 height, &aligned_h);
1085 if (result != 0) {
1086 ALOGE(
1087 "%s: Failed to get the aligned height for camera custom format. width: %d,"
1088 "height: %d, format: %d, Error code: %d",
1089 __FUNCTION__, width, height, format, result);
1090 *alignedw = aligned_w;
1091 *alignedh = height;
1092 return;
1093 }
1094
1095 *alignedw = aligned_w;
1096 *alignedh = aligned_h;
1097 return;
1098 }
1099
1100 if (IsUncompressedRGBFormat(format)) {
1101 if (AdrenoMemInfo::GetInstance()) {
1102 AdrenoMemInfo::GetInstance()->AlignUnCompressedRGB(width, height, format, tile, alignedw,
1103 alignedh);
1104 }
1105 return;
1106 }
1107
1108 if (ubwc_enabled) {
1109 GetYuvUBwcWidthAndHeight(width, height, format, alignedw, alignedh);
1110 return;
1111 }
1112
1113 if (IsCompressedRGBFormat(format)) {
1114 if (AdrenoMemInfo::GetInstance()) {
1115 AdrenoMemInfo::GetInstance()->AlignCompressedRGB(width, height, format, alignedw, alignedh);
1116 }
1117 return;
1118 }
1119
1120 int aligned_w = width;
1121 int aligned_h = height;
1122 unsigned int alignment = 32;
1123
1124 // Below should be only YUV family
1125 switch (format) {
1126 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1127 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
1128 if (AdrenoMemInfo::GetInstance() == nullptr) {
1129 return;
1130 }
1131 alignment = AdrenoMemInfo::GetInstance()->GetGpuPixelAlignment();
1132 aligned_w = ALIGN(width, alignment);
1133 break;
1134 case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
1135 aligned_w = ALIGN(width, alignment);
1136 break;
1137 case HAL_PIXEL_FORMAT_RAW16:
1138 case HAL_PIXEL_FORMAT_Y16:
1139 case HAL_PIXEL_FORMAT_Y8:
1140 aligned_w = ALIGN(width, 16);
1141 break;
1142 case HAL_PIXEL_FORMAT_RAW12:
1143 aligned_w = ALIGN(width * 12 / 8, 16);
1144 break;
1145 case HAL_PIXEL_FORMAT_RAW10:
1146 {
1147 const unsigned int gpu_alignment =
1148 AdrenoMemInfo::GetInstance()->GetGpuPixelAlignment();
1149 // gpu_alignment can return 1. Make sure it's at least 64.
1150 const unsigned int raw10_alignment = std::max(gpu_alignment, 64u);
1151 aligned_w = ALIGN(width * 10 / 8, raw10_alignment);
1152 }
1153 break;
1154 case HAL_PIXEL_FORMAT_RAW8:
1155 aligned_w = ALIGN(width, 16);
1156 break;
1157 case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
1158 aligned_w = ALIGN(width, 128);
1159 break;
1160 case HAL_PIXEL_FORMAT_YV12:
1161 if ((usage & BufferUsage::GPU_TEXTURE) || (usage & BufferUsage::GPU_RENDER_TARGET)) {
1162 if (AdrenoMemInfo::GetInstance() == nullptr) {
1163 return;
1164 }
1165 alignment = AdrenoMemInfo::GetInstance()->GetGpuPixelAlignment();
1166 aligned_w = ALIGN(width, alignment);
1167 } else {
1168 aligned_w = ALIGN(width, 16);
1169 }
1170 break;
1171 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1172 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
1173 case HAL_PIXEL_FORMAT_YCbCr_422_I:
1174 case HAL_PIXEL_FORMAT_YCrCb_422_I:
1175 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
1176 aligned_w = ALIGN(width, 16);
1177 break;
1178 #ifndef QMAA
1179 case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
1180 aligned_w = INT(VENUS_Y_STRIDE(COLOR_FMT_P010, width) / 2);
1181 aligned_h = INT(VENUS_Y_SCANLINES(COLOR_FMT_P010, height));
1182 break;
1183 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
1184 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
1185 aligned_w = INT(VENUS_Y_STRIDE(COLOR_FMT_NV12, width));
1186 aligned_h = INT(VENUS_Y_SCANLINES(COLOR_FMT_NV12, height));
1187 break;
1188 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
1189 case HAL_PIXEL_FORMAT_NV21_ENCODEABLE:
1190 aligned_w = INT(VENUS_Y_STRIDE(COLOR_FMT_NV21, width));
1191 aligned_h = INT(VENUS_Y_SCANLINES(COLOR_FMT_NV21, height));
1192 break;
1193 case HAL_PIXEL_FORMAT_BLOB:
1194 break;
1195 case HAL_PIXEL_FORMAT_NV12_HEIF:
1196 aligned_w = INT(VENUS_Y_STRIDE(COLOR_FMT_NV12_512, width));
1197 aligned_h = INT(VENUS_Y_SCANLINES(COLOR_FMT_NV12_512, height));
1198 break;
1199 case HAL_PIXEL_FORMAT_NV21_ZSL:
1200 aligned_w = ALIGN(width, 64);
1201 aligned_h = ALIGN(height, 64);
1202 break;
1203 #endif
1204 default:
1205 break;
1206 }
1207
1208 *alignedw = (unsigned int)aligned_w;
1209 *alignedh = (unsigned int)aligned_h;
1210 }
1211
GetBufferLayout(private_handle_t * hnd,uint32_t stride[4],uint32_t offset[4],uint32_t * num_planes)1212 int GetBufferLayout(private_handle_t *hnd, uint32_t stride[4], uint32_t offset[4],
1213 uint32_t *num_planes) {
1214 if (!hnd || !stride || !offset || !num_planes) {
1215 return -EINVAL;
1216 }
1217
1218 struct android_ycbcr yuvPlaneInfo[2] = {};
1219 *num_planes = 1;
1220
1221 if (IsUncompressedRGBFormat(hnd->format)) {
1222 uint32_t bpp = GetBppForUncompressedRGB(hnd->format);
1223 stride[0] = static_cast<uint32_t>(hnd->width * bpp);
1224 return 0;
1225 }
1226
1227 (*num_planes)++;
1228 int ret = GetYUVPlaneInfo(hnd, yuvPlaneInfo);
1229 if (ret < 0) {
1230 ALOGE("%s failed", __FUNCTION__);
1231 return ret;
1232 }
1233
1234 // We are only returning buffer layout for progressive or single field formats.
1235 struct android_ycbcr yuvInfo = yuvPlaneInfo[0];
1236 stride[0] = static_cast<uint32_t>(yuvInfo.ystride);
1237 offset[0] = static_cast<uint32_t>(reinterpret_cast<uint64_t>(yuvInfo.y) - hnd->base);
1238 stride[1] = static_cast<uint32_t>(yuvInfo.cstride);
1239 switch (hnd->format) {
1240 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
1241 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1242 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
1243 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
1244 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
1245 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
1246 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
1247 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
1248 case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
1249 case HAL_PIXEL_FORMAT_NV12_HEIF:
1250 offset[1] = static_cast<uint32_t>(reinterpret_cast<uint64_t>(yuvInfo.cb) - hnd->base);
1251 break;
1252 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1253 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
1254 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
1255 case HAL_PIXEL_FORMAT_NV21_ENCODEABLE:
1256 offset[1] = static_cast<uint32_t>(reinterpret_cast<uint64_t>(yuvInfo.cr) - hnd->base);
1257 break;
1258 case HAL_PIXEL_FORMAT_YV12:
1259 offset[1] = static_cast<uint32_t>(reinterpret_cast<uint64_t>(yuvInfo.cr) - hnd->base);
1260 stride[2] = static_cast<uint32_t>(yuvInfo.cstride);
1261 offset[2] = static_cast<uint32_t>(reinterpret_cast<uint64_t>(yuvInfo.cb) - hnd->base);
1262 (*num_planes)++;
1263 break;
1264 case HAL_PIXEL_FORMAT_CbYCrY_422_I:
1265 *num_planes = 1;
1266 break;
1267 default:
1268 ALOGW("%s: Unsupported format", __FUNCTION__);
1269 ret = -EINVAL;
1270 }
1271
1272 if (hnd->flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
1273 std::fill(offset, offset + 4, 0);
1274 }
1275
1276 return 0;
1277 }
1278
GetGpuResourceSizeAndDimensions(const BufferInfo & info,unsigned int * size,unsigned int * alignedw,unsigned int * alignedh,GraphicsMetadata * graphics_metadata)1279 int GetGpuResourceSizeAndDimensions(const BufferInfo &info, unsigned int *size,
1280 unsigned int *alignedw, unsigned int *alignedh,
1281 GraphicsMetadata *graphics_metadata) {
1282 GetAlignedWidthAndHeight(info, alignedw, alignedh);
1283 AdrenoMemInfo* adreno_mem_info = AdrenoMemInfo::GetInstance();
1284 graphics_metadata->size = adreno_mem_info->AdrenoGetMetadataBlobSize();
1285 uint64_t adreno_usage = info.usage;
1286 // If gralloc disables UBWC based on any of the checks,
1287 // we pass modified usage flag to adreno to convey this.
1288 int is_ubwc_enabled = IsUBwcEnabled(info.format, info.usage);
1289 if (!is_ubwc_enabled) {
1290 adreno_usage &= ~(GRALLOC_USAGE_PRIVATE_ALLOC_UBWC);
1291 } else {
1292 adreno_usage |= GRALLOC_USAGE_PRIVATE_ALLOC_UBWC;
1293 }
1294
1295 // Call adreno api for populating metadata blob
1296 // Layer count is for 2D/Cubemap arrays and depth is used for 3D slice
1297 // Using depth to pass layer_count here
1298 int ret = adreno_mem_info->AdrenoInitMemoryLayout(graphics_metadata->data, info.width,
1299 info.height, info.layer_count, /* depth */
1300 info.format, 1, is_ubwc_enabled,
1301 adreno_usage, 1);
1302 if (ret != 0) {
1303 ALOGE("%s Graphics metadata init failed", __FUNCTION__);
1304 *size = 0;
1305 return -EINVAL;
1306 }
1307 // Call adreno api with the metadata blob to get buffer size
1308 *size = adreno_mem_info->AdrenoGetAlignedGpuBufferSize(graphics_metadata->data);
1309 return 0;
1310 }
1311
CanUseAdrenoForSize(int buffer_type,uint64_t usage)1312 bool CanUseAdrenoForSize(int buffer_type, uint64_t usage) {
1313 if (buffer_type == BUFFER_TYPE_VIDEO || !GetAdrenoSizeAPIStatus()) {
1314 return false;
1315 }
1316
1317 if ((usage & BufferUsage::PROTECTED) && ((usage & BufferUsage::CAMERA_OUTPUT) ||
1318 (usage & GRALLOC_USAGE_PRIVATE_SECURE_DISPLAY))) {
1319 return false;
1320 }
1321
1322 return true;
1323 }
1324
GetAdrenoSizeAPIStatus()1325 bool GetAdrenoSizeAPIStatus() {
1326 AdrenoMemInfo* adreno_mem_info = AdrenoMemInfo::GetInstance();
1327 if (adreno_mem_info) {
1328 return adreno_mem_info->AdrenoSizeAPIAvaliable();
1329 }
1330 return false;
1331 }
1332
UseUncached(int format,uint64_t usage)1333 bool UseUncached(int format, uint64_t usage) {
1334 if ((usage & GRALLOC_USAGE_PRIVATE_UNCACHED) || (usage & BufferUsage::PROTECTED)) {
1335 return true;
1336 }
1337
1338 // CPU read rarely
1339 if ((usage & BufferUsage::CPU_READ_MASK) == static_cast<uint64_t>(BufferUsage::CPU_READ_RARELY)) {
1340 return true;
1341 }
1342
1343 // CPU write rarely
1344 if ((usage & BufferUsage::CPU_WRITE_MASK) ==
1345 static_cast<uint64_t>(BufferUsage::CPU_WRITE_RARELY)) {
1346 return true;
1347 }
1348
1349 if ((usage & BufferUsage::SENSOR_DIRECT_DATA) || (usage & BufferUsage::GPU_DATA_BUFFER)) {
1350 return true;
1351 }
1352
1353 if (format && IsUBwcEnabled(format, usage)) {
1354 return true;
1355 }
1356
1357 return false;
1358 }
1359
GetHandleFlags(int format,uint64_t usage)1360 uint64_t GetHandleFlags(int format, uint64_t usage) {
1361 uint64_t priv_flags = 0;
1362
1363 if (usage & BufferUsage::VIDEO_ENCODER) {
1364 priv_flags |= private_handle_t::PRIV_FLAGS_VIDEO_ENCODER;
1365 }
1366
1367 if (usage & BufferUsage::CAMERA_OUTPUT) {
1368 priv_flags |= private_handle_t::PRIV_FLAGS_CAMERA_WRITE;
1369 }
1370
1371 if (usage & BufferUsage::CAMERA_INPUT) {
1372 priv_flags |= private_handle_t::PRIV_FLAGS_CAMERA_READ;
1373 }
1374
1375 if (usage & BufferUsage::COMPOSER_OVERLAY) {
1376 priv_flags |= private_handle_t::PRIV_FLAGS_DISP_CONSUMER;
1377 }
1378
1379 if (usage & BufferUsage::GPU_TEXTURE) {
1380 priv_flags |= private_handle_t::PRIV_FLAGS_HW_TEXTURE;
1381 }
1382
1383 if (usage & GRALLOC_USAGE_PRIVATE_SECURE_DISPLAY) {
1384 priv_flags |= private_handle_t::PRIV_FLAGS_SECURE_DISPLAY;
1385 }
1386
1387 if (IsUBwcEnabled(format, usage)) {
1388 priv_flags |= private_handle_t::PRIV_FLAGS_UBWC_ALIGNED;
1389 if (IsUBwcPISupported(format, usage)) {
1390 priv_flags |= private_handle_t::PRIV_FLAGS_UBWC_ALIGNED_PI;
1391 }
1392 }
1393
1394 if (usage & (BufferUsage::CPU_READ_MASK | BufferUsage::CPU_WRITE_MASK)) {
1395 priv_flags |= private_handle_t::PRIV_FLAGS_CPU_RENDERED;
1396 }
1397
1398 if ((usage & (BufferUsage::VIDEO_ENCODER | BufferUsage::VIDEO_DECODER |
1399 BufferUsage::CAMERA_OUTPUT | BufferUsage::GPU_RENDER_TARGET))) {
1400 priv_flags |= private_handle_t::PRIV_FLAGS_NON_CPU_WRITER;
1401 }
1402
1403 if (!UseUncached(format, usage)) {
1404 priv_flags |= private_handle_t::PRIV_FLAGS_CACHED;
1405 }
1406
1407 return priv_flags;
1408 }
1409
GetImplDefinedFormat(uint64_t usage,int format)1410 int GetImplDefinedFormat(uint64_t usage, int format) {
1411 int gr_format = format;
1412
1413 // If input format is HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED then based on
1414 // the usage bits, gralloc assigns a format.
1415 if (format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED ||
1416 format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
1417 if ((usage & GRALLOC_USAGE_PRIVATE_ALLOC_UBWC || usage & GRALLOC_USAGE_PRIVATE_ALLOC_UBWC_PI)
1418 && format != HAL_PIXEL_FORMAT_YCbCr_420_888) {
1419 gr_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC;
1420 } else if (usage & BufferUsage::VIDEO_ENCODER) {
1421 if (usage & GRALLOC_USAGE_PRIVATE_VIDEO_NV21_ENCODER) {
1422 gr_format = HAL_PIXEL_FORMAT_NV21_ENCODEABLE; // NV21
1423 } else if (usage & GRALLOC_USAGE_PRIVATE_HEIF) {
1424 gr_format = HAL_PIXEL_FORMAT_NV12_HEIF;
1425 } else if (format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
1426 gr_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS;
1427 } else {
1428 gr_format = HAL_PIXEL_FORMAT_NV12_ENCODEABLE; // NV12
1429 }
1430 } else if (usage & BufferUsage::CAMERA_INPUT) {
1431 if (usage & BufferUsage::CAMERA_OUTPUT) {
1432 // Assumed ZSL if both producer and consumer camera flags set
1433 gr_format = HAL_PIXEL_FORMAT_NV21_ZSL; // NV21
1434 } else {
1435 gr_format = HAL_PIXEL_FORMAT_YCrCb_420_SP; // NV21
1436 }
1437 } else if (usage & BufferUsage::CAMERA_OUTPUT) {
1438 if (format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
1439 if ((usage & BufferUsage::PROTECTED) && (!CanAllocateZSLForSecureCamera())) {
1440 gr_format = HAL_PIXEL_FORMAT_YCrCb_420_SP; // NV21
1441 } else {
1442 gr_format = HAL_PIXEL_FORMAT_NV21_ZSL; // NV21
1443 }
1444 } else {
1445 gr_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS; // NV12 preview
1446 }
1447 } else if (usage & BufferUsage::COMPOSER_OVERLAY) {
1448 // XXX: If we still haven't set a format, default to RGBA8888
1449 gr_format = HAL_PIXEL_FORMAT_RGBA_8888;
1450 } else if (format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
1451 // If no other usage flags are detected, default the
1452 // flexible YUV format to YCrCb_420_SP
1453 gr_format = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1454 }
1455 }
1456
1457 return gr_format;
1458 }
1459
GetCustomFormatFlags(int format,uint64_t usage,int * custom_format,uint64_t * priv_flags)1460 int GetCustomFormatFlags(int format, uint64_t usage,
1461 int *custom_format, uint64_t *priv_flags) {
1462 *custom_format = GetImplDefinedFormat(usage, format);
1463 *priv_flags = GetHandleFlags(*custom_format, usage);
1464
1465 if (usage & GRALLOC_USAGE_PROTECTED) {
1466 *priv_flags |= private_handle_t::PRIV_FLAGS_SECURE_BUFFER;
1467 }
1468
1469 *priv_flags |= private_handle_t::PRIV_FLAGS_USES_ION;
1470
1471 return 0;
1472 }
1473
GetBufferType(int inputFormat)1474 int GetBufferType(int inputFormat) {
1475 return IsYuvFormat(inputFormat) ? BUFFER_TYPE_VIDEO : BUFFER_TYPE_UI;
1476 }
1477
1478 // Here width and height are aligned width and aligned height.
GetYUVPlaneInfo(const BufferInfo & info,int32_t format,int32_t width,int32_t height,int32_t flags,int * plane_count,PlaneLayoutInfo * plane_info)1479 int GetYUVPlaneInfo(const BufferInfo &info, int32_t format, int32_t width, int32_t height,
1480 int32_t flags, int *plane_count, PlaneLayoutInfo *plane_info) {
1481 int err = 0;
1482 unsigned int y_stride, c_stride, y_height, c_height, y_size, c_size;
1483 uint64_t yOffset, cOffset, crOffset, cbOffset;
1484 int h_subsampling = 0, v_subsampling = 0;
1485 if (IsCameraCustomFormat(format) && CameraInfo::GetInstance()) {
1486 int result = CameraInfo::GetInstance()->GetCameraFormatPlaneInfo(
1487 format, info.width, info.height, plane_count, plane_info);
1488 if (result != 0) {
1489 ALOGE(
1490 "%s: Failed to get the plane info through camera library. width: %d, height: %d,"
1491 "format: %d, Error code: %d",
1492 __FUNCTION__, width, height, format, result);
1493 }
1494 return result;
1495 }
1496
1497 switch (format) {
1498 // Semiplanar
1499 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
1500 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1501 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
1502 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: // Same as YCbCr_420_SP_VENUS
1503 case HAL_PIXEL_FORMAT_NV21_ENCODEABLE:
1504 case HAL_PIXEL_FORMAT_NV12_HEIF:
1505 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1506 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
1507 case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
1508 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
1509 case HAL_PIXEL_FORMAT_NV21_ZSL:
1510 *plane_count = 2;
1511 GetYuvSPPlaneInfo(info, format, width, height, 1, plane_info);
1512 GetYuvSubSamplingFactor(format, &h_subsampling, &v_subsampling);
1513 plane_info[0].h_subsampling = 0;
1514 plane_info[0].v_subsampling = 0;
1515 plane_info[1].h_subsampling = h_subsampling;
1516 plane_info[1].v_subsampling = v_subsampling;
1517 break;
1518
1519 case HAL_PIXEL_FORMAT_RAW16:
1520 case HAL_PIXEL_FORMAT_RAW12:
1521 case HAL_PIXEL_FORMAT_RAW10:
1522 case HAL_PIXEL_FORMAT_RAW8:
1523 case HAL_PIXEL_FORMAT_BLOB:
1524 *plane_count = 1;
1525 GetRawPlaneInfo(format, info.width, info.height, plane_info);
1526 break;
1527
1528 case HAL_PIXEL_FORMAT_Y8:
1529 *plane_count = 1;
1530 GetYuvSPPlaneInfo(info, format, width, height, 1, plane_info);
1531 GetYuvSubSamplingFactor(format, &h_subsampling, &v_subsampling);
1532 plane_info[0].h_subsampling = h_subsampling;
1533 plane_info[0].v_subsampling = v_subsampling;
1534 break;
1535
1536 case HAL_PIXEL_FORMAT_Y16:
1537 *plane_count = 1;
1538 GetYuvSPPlaneInfo(info, format, width, height, 2, plane_info);
1539 GetYuvSubSamplingFactor(format, &h_subsampling, &v_subsampling);
1540 plane_info[0].h_subsampling = h_subsampling;
1541 plane_info[0].v_subsampling = v_subsampling;
1542 break;
1543
1544 #ifndef QMAA
1545 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
1546 GetYuvSubSamplingFactor(format, &h_subsampling, &v_subsampling);
1547 if (flags & LAYOUT_INTERLACED_FLAG) {
1548 *plane_count = 8;
1549 GetYuvUbwcInterlacedSPPlaneInfo(width, height, plane_info);
1550 plane_info[0].step = plane_info[4].step = 1;
1551 plane_info[1].step = plane_info[5].step = 2;
1552 plane_info[0].h_subsampling = plane_info[4].h_subsampling = 0;
1553 plane_info[0].v_subsampling = plane_info[4].v_subsampling = 0;
1554 plane_info[1].h_subsampling = plane_info[5].h_subsampling = h_subsampling;
1555 plane_info[1].v_subsampling = plane_info[5].v_subsampling = v_subsampling;
1556 plane_info[2].h_subsampling = plane_info[3].h_subsampling = 0;
1557 plane_info[2].v_subsampling = plane_info[3].v_subsampling = 0;
1558 plane_info[2].step = plane_info[3].step = 0;
1559 plane_info[6].h_subsampling = plane_info[7].h_subsampling = 0;
1560 plane_info[6].v_subsampling = plane_info[7].v_subsampling = 0;
1561 plane_info[6].step = plane_info[7].step = 0;
1562 } else {
1563 *plane_count = 4;
1564 GetYuvUbwcSPPlaneInfo(width, height, COLOR_FMT_NV12_UBWC, plane_info);
1565 plane_info[0].h_subsampling = 0;
1566 plane_info[0].v_subsampling = 0;
1567 plane_info[0].step = 1;
1568 plane_info[1].h_subsampling = h_subsampling;
1569 plane_info[1].v_subsampling = v_subsampling;
1570 plane_info[1].step = 2;
1571 plane_info[2].h_subsampling = plane_info[3].h_subsampling = 0;
1572 plane_info[2].v_subsampling = plane_info[3].v_subsampling = 0;
1573 plane_info[2].step = plane_info[3].step = 0;
1574 }
1575 break;
1576
1577 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
1578 *plane_count = 2;
1579 GetYuvSPPlaneInfo(info, format, width, height, 2, plane_info);
1580 GetYuvSubSamplingFactor(format, &h_subsampling, &v_subsampling);
1581 plane_info[0].h_subsampling = 0;
1582 plane_info[0].v_subsampling = 0;
1583 plane_info[0].step = 2;
1584 plane_info[1].h_subsampling = h_subsampling;
1585 plane_info[1].v_subsampling = v_subsampling;
1586 plane_info[1].step = 4;
1587 break;
1588
1589 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
1590 *plane_count = 4;
1591 GetYuvUbwcSPPlaneInfo(width, height, COLOR_FMT_NV12_BPP10_UBWC, plane_info);
1592 GetYuvSubSamplingFactor(format, &h_subsampling, &v_subsampling);
1593 plane_info[0].h_subsampling = 0;
1594 plane_info[0].v_subsampling = 0;
1595 plane_info[1].step = 1;
1596 plane_info[1].h_subsampling = h_subsampling;
1597 plane_info[1].v_subsampling = v_subsampling;
1598 plane_info[1].step = 3;
1599 plane_info[2].h_subsampling = plane_info[3].h_subsampling = 0;
1600 plane_info[2].v_subsampling = plane_info[3].v_subsampling = 0;
1601 plane_info[2].step = plane_info[3].step = 0;
1602 break;
1603
1604 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
1605 *plane_count = 4;
1606 GetYuvUbwcSPPlaneInfo(width, height, COLOR_FMT_P010_UBWC, plane_info);
1607 GetYuvSubSamplingFactor(format, &h_subsampling, &v_subsampling);
1608 plane_info[0].h_subsampling = 0;
1609 plane_info[0].v_subsampling = 0;
1610 plane_info[1].step = 1;
1611 plane_info[1].h_subsampling = h_subsampling;
1612 plane_info[1].v_subsampling = v_subsampling;
1613 plane_info[1].step = 4;
1614 plane_info[2].h_subsampling = plane_info[3].h_subsampling = 0;
1615 plane_info[2].v_subsampling = plane_info[3].v_subsampling = 0;
1616 plane_info[2].step = plane_info[3].step = 0;
1617 break;
1618
1619 case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
1620 *plane_count = 2;
1621 y_stride = VENUS_Y_STRIDE(COLOR_FMT_P010, width);
1622 c_stride = VENUS_UV_STRIDE(COLOR_FMT_P010, width);
1623 y_height = VENUS_Y_SCANLINES(COLOR_FMT_P010, height);
1624 y_size = y_stride * y_height;
1625 yOffset = 0;
1626 cOffset = y_size;
1627 c_height = VENUS_UV_SCANLINES(COLOR_FMT_P010, INT(height));
1628 c_size = c_stride * c_height;
1629 GetYuvSubSamplingFactor(format, &h_subsampling, &v_subsampling);
1630
1631 plane_info[0].component = (PlaneComponent)PLANE_COMPONENT_Y;
1632 plane_info[0].offset = (uint32_t)yOffset;
1633 plane_info[0].stride = static_cast<int32_t>(UINT(width));
1634 plane_info[0].stride_bytes = static_cast<int32_t>(y_stride);
1635 plane_info[0].scanlines = static_cast<int32_t>(y_height);
1636 plane_info[0].size = static_cast<uint32_t>(y_size);
1637 plane_info[0].step = 2;
1638 plane_info[0].h_subsampling = 0;
1639 plane_info[0].v_subsampling = 0;
1640
1641 plane_info[1].component = (PlaneComponent)(PLANE_COMPONENT_Cb | PLANE_COMPONENT_Cr);
1642 plane_info[1].offset = (uint32_t)cOffset;
1643 plane_info[1].stride = static_cast<int32_t>(UINT(width));
1644 plane_info[1].stride_bytes = static_cast<int32_t>(c_stride);
1645 plane_info[1].scanlines = static_cast<int32_t>(c_height);
1646 plane_info[1].size = static_cast<uint32_t>(c_size);
1647 plane_info[1].step = 4;
1648 plane_info[1].h_subsampling = h_subsampling;
1649 plane_info[1].v_subsampling = v_subsampling;
1650 break;
1651 #endif
1652 // Planar
1653 case HAL_PIXEL_FORMAT_YV12:
1654 if ((info.width & 1) || (info.height & 1)) {
1655 ALOGE("w or h is odd for the YV12 format");
1656 err = -EINVAL;
1657 return err;
1658 }
1659 *plane_count = 3;
1660 y_stride = width;
1661 c_stride = ALIGN(width / 2, 16);
1662 y_height = UINT(height);
1663 y_size = (y_stride * y_height);
1664 height = height >> 1;
1665 c_height = UINT(height);
1666 c_size = (c_stride * c_height);
1667 yOffset = 0;
1668 crOffset = y_size;
1669 cbOffset = (y_size + c_size);
1670 GetYuvSubSamplingFactor(format, &h_subsampling, &v_subsampling);
1671
1672 plane_info[0].component = (PlaneComponent)PLANE_COMPONENT_Y;
1673 plane_info[0].offset = (uint32_t)yOffset;
1674 plane_info[0].stride = static_cast<int32_t>(UINT(width));
1675 plane_info[0].stride_bytes = static_cast<int32_t>(y_stride);
1676 plane_info[0].scanlines = static_cast<int32_t>(y_height);
1677 plane_info[0].size = static_cast<uint32_t>(y_size);
1678 plane_info[0].step = 1;
1679 plane_info[0].h_subsampling = 0;
1680 plane_info[0].v_subsampling = 0;
1681
1682 plane_info[1].component = (PlaneComponent)PLANE_COMPONENT_Cb;
1683 plane_info[1].offset = (uint32_t)cbOffset;
1684 plane_info[2].component = (PlaneComponent)PLANE_COMPONENT_Cr;
1685 plane_info[2].offset = (uint32_t)crOffset;
1686 for (int i = 1; i < 3; i++) {
1687 plane_info[i].stride = static_cast<int32_t>(UINT(width));
1688 plane_info[i].stride_bytes = static_cast<int32_t>(c_stride);
1689 plane_info[i].scanlines = static_cast<int32_t>(c_height);
1690 plane_info[i].size = static_cast<uint32_t>(c_size);
1691 plane_info[i].step = 1;
1692 plane_info[i].h_subsampling = h_subsampling;
1693 plane_info[i].v_subsampling = v_subsampling;
1694 }
1695 break;
1696 case HAL_PIXEL_FORMAT_CbYCrY_422_I:
1697 if (info.width & 1) {
1698 ALOGE("width is odd for the YUV422_SP format");
1699 err = -EINVAL;
1700 return err;
1701 }
1702 *plane_count = 1;
1703 y_stride = width * 2;
1704 y_height = UINT(height);
1705 y_size = y_stride * y_height;
1706 yOffset = 0;
1707 plane_info[0].component = (PlaneComponent)PLANE_COMPONENT_Y;
1708 plane_info[0].offset = (uint32_t)yOffset;
1709 plane_info[0].stride = static_cast<int32_t>(UINT(width));
1710 plane_info[0].stride_bytes = static_cast<int32_t>(y_stride);
1711 plane_info[0].scanlines = static_cast<int32_t>(y_height);
1712 plane_info[0].size = static_cast<uint32_t>(y_size);
1713 plane_info[0].step = 1;
1714 plane_info[0].h_subsampling = 0;
1715 plane_info[0].v_subsampling = 0;
1716 break;
1717
1718 // Unsupported formats
1719 case HAL_PIXEL_FORMAT_YCbCr_422_I:
1720 case HAL_PIXEL_FORMAT_YCrCb_422_I:
1721 case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
1722 default:
1723 *plane_count = 0;
1724 ALOGD("%s: Invalid format passed: 0x%x", __FUNCTION__, format);
1725 err = -EINVAL;
1726 }
1727 return err;
1728 }
1729
GetYuvSubSamplingFactor(int32_t format,int * h_subsampling,int * v_subsampling)1730 void GetYuvSubSamplingFactor(int32_t format, int *h_subsampling, int *v_subsampling) {
1731 switch (format) {
1732 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
1733 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
1734 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
1735 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
1736 case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
1737 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
1738 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
1739 case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
1740 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
1741 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1742 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: // Same as YCbCr_420_SP_VENUS
1743 case HAL_PIXEL_FORMAT_NV21_ENCODEABLE:
1744 case HAL_PIXEL_FORMAT_YV12:
1745 case HAL_PIXEL_FORMAT_NV12_HEIF:
1746 case HAL_PIXEL_FORMAT_NV21_ZSL:
1747 *h_subsampling = 1;
1748 *v_subsampling = 1;
1749 break;
1750 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1751 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
1752 case HAL_PIXEL_FORMAT_CbYCrY_422_I:
1753 *h_subsampling = 1;
1754 *v_subsampling = 0;
1755 break;
1756 case HAL_PIXEL_FORMAT_Y16:
1757 case HAL_PIXEL_FORMAT_Y8:
1758 case HAL_PIXEL_FORMAT_BLOB:
1759 default:
1760 *h_subsampling = 0;
1761 *v_subsampling = 0;
1762 break;
1763 }
1764 }
1765
CopyPlaneLayoutInfotoAndroidYcbcr(uint64_t base,int plane_count,PlaneLayoutInfo * plane_info,struct android_ycbcr * ycbcr)1766 void CopyPlaneLayoutInfotoAndroidYcbcr(uint64_t base, int plane_count, PlaneLayoutInfo *plane_info,
1767 struct android_ycbcr *ycbcr) {
1768 ycbcr->y = reinterpret_cast<void *>(base + plane_info[0].offset);
1769 ycbcr->ystride = plane_info[0].stride_bytes;
1770 if (plane_count == 1) {
1771 ycbcr->cb = NULL;
1772 ycbcr->cr = NULL;
1773 ycbcr->cstride = 0;
1774 ycbcr->chroma_step = 0;
1775 } else if (plane_count == 2 || plane_count == 4 || plane_count == 8) {
1776 /* For YUV semiplanar :-
1777 * - In progressive & linear case plane count is 2 and plane_info[0] will
1778 * contain info about Y plane and plane_info[1] will contain info about UV plane.
1779 * - In progressive & compressed case plane count is 4 then plane_info[0] will
1780 * contain info about Y plane and plane_info[1] will contain info about UV plane.
1781 * Remaining two plane (plane_info[2] & plane_info[3]) contain info about the
1782 * Y_Meta_Plane and UV_Meta_Plane.
1783 * - In interlaced & compressed case plane count is 8 then plane_info[0], plane_info[1],
1784 * plane_info[4] & plane_info[5] will contain info about Y_plane, UV_plane, Y_plane
1785 * & UV_plane. Remaining plane will contain info about the meta planes. As in this case
1786 * this API is called twice through GetYUVPlaneInfo() with address of plane_info[0] &
1787 * plane_info[4], so this will calculate the information accordingly and will fill the
1788 * ycbcr structure with interlaced plane info only.
1789 */
1790 ycbcr->cb = reinterpret_cast<void *>(base + plane_info[1].offset);
1791 ycbcr->cr = reinterpret_cast<void *>(base + plane_info[1].offset + 1);
1792 ycbcr->cstride = plane_info[1].stride_bytes;
1793 ycbcr->chroma_step = plane_info[1].step;
1794 } else if (plane_count == 3) {
1795 /* For YUV planar :-
1796 * Plane size is 3 and plane_info[0], plane_info[1], plane_info[2] will
1797 * contain info about y_plane, cb_plane and cr_plane accordingly.
1798 */
1799 ycbcr->cb = reinterpret_cast<void *>(base + plane_info[1].offset);
1800 ycbcr->cr = reinterpret_cast<void *>(base + plane_info[2].offset);
1801 ycbcr->cstride = plane_info[1].stride_bytes;
1802 ycbcr->chroma_step = plane_info[1].step;
1803 }
1804 }
1805
HasAlphaComponent(int32_t format)1806 bool HasAlphaComponent(int32_t format) {
1807 switch (format) {
1808 case HAL_PIXEL_FORMAT_RGBA_8888:
1809 case HAL_PIXEL_FORMAT_BGRA_8888:
1810 case HAL_PIXEL_FORMAT_RGBA_5551:
1811 case HAL_PIXEL_FORMAT_RGBA_4444:
1812 case HAL_PIXEL_FORMAT_RGBA_1010102:
1813 case HAL_PIXEL_FORMAT_ARGB_2101010:
1814 case HAL_PIXEL_FORMAT_BGRA_1010102:
1815 case HAL_PIXEL_FORMAT_ABGR_2101010:
1816 case HAL_PIXEL_FORMAT_RGBA_FP16:
1817 return true;
1818 default:
1819 return false;
1820 }
1821 }
1822
GetRGBPlaneInfo(const BufferInfo & info,int32_t format,int32_t width,int32_t height,int32_t,int * plane_count,PlaneLayoutInfo * plane_info)1823 void GetRGBPlaneInfo(const BufferInfo &info, int32_t format, int32_t width, int32_t height,
1824 int32_t /* flags */, int *plane_count, PlaneLayoutInfo *plane_info) {
1825 uint64_t usage = info.usage;
1826 *plane_count = 1;
1827 plane_info->component =
1828 (PlaneComponent)(PLANE_COMPONENT_R | PLANE_COMPONENT_G | PLANE_COMPONENT_B);
1829 if (HasAlphaComponent(format)) {
1830 plane_info->component = (PlaneComponent)(plane_info->component | PLANE_COMPONENT_A);
1831 }
1832 GetBufferSizeAndDimensions(info, &(plane_info->size), (unsigned int *) &width,
1833 (unsigned int *) &height);
1834 plane_info->step = GetBpp(format);
1835 plane_info->offset = GetRgbMetaSize(format, width, height, usage);
1836 plane_info->h_subsampling = 0;
1837 plane_info->v_subsampling = 0;
1838 plane_info->stride = width;
1839 plane_info->stride_bytes = width * plane_info->step;
1840 plane_info->scanlines = height;
1841 }
1842
1843 // TODO(tbalacha): tile vs ubwc -- may need to find a diff way to differentiate
GetDRMFormat(uint32_t format,uint32_t flags,uint32_t * drm_format,uint64_t * drm_format_modifier)1844 void GetDRMFormat(uint32_t format, uint32_t flags, uint32_t *drm_format,
1845 uint64_t *drm_format_modifier) {
1846 bool compressed = (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) ? true : false;
1847 switch (format) {
1848 case HAL_PIXEL_FORMAT_RGBA_8888:
1849 *drm_format = DRM_FORMAT_ABGR8888;
1850 break;
1851 case HAL_PIXEL_FORMAT_RGBA_5551:
1852 *drm_format = DRM_FORMAT_ABGR1555;
1853 break;
1854 case HAL_PIXEL_FORMAT_RGBA_4444:
1855 *drm_format = DRM_FORMAT_ABGR4444;
1856 break;
1857 case HAL_PIXEL_FORMAT_BGRA_8888:
1858 *drm_format = DRM_FORMAT_ARGB8888;
1859 break;
1860 case HAL_PIXEL_FORMAT_RGBX_8888:
1861 *drm_format = DRM_FORMAT_XBGR8888;
1862 if (compressed)
1863 *drm_format_modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED;
1864 break;
1865 case HAL_PIXEL_FORMAT_BGRX_8888:
1866 *drm_format = DRM_FORMAT_XRGB8888;
1867 break;
1868 case HAL_PIXEL_FORMAT_RGB_888:
1869 *drm_format = DRM_FORMAT_BGR888;
1870 break;
1871 case HAL_PIXEL_FORMAT_RGB_565:
1872 *drm_format = DRM_FORMAT_BGR565;
1873 break;
1874 case HAL_PIXEL_FORMAT_BGR_565:
1875 *drm_format = DRM_FORMAT_BGR565;
1876 if (compressed)
1877 *drm_format_modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED;
1878 break;
1879 case HAL_PIXEL_FORMAT_RGBA_1010102:
1880 *drm_format = DRM_FORMAT_ABGR2101010;
1881 if (compressed)
1882 *drm_format_modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED;
1883 break;
1884 case HAL_PIXEL_FORMAT_ARGB_2101010:
1885 *drm_format = DRM_FORMAT_BGRA1010102;
1886 break;
1887 case HAL_PIXEL_FORMAT_RGBX_1010102:
1888 *drm_format = DRM_FORMAT_XBGR2101010;
1889 if (compressed)
1890 *drm_format_modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED;
1891 break;
1892 case HAL_PIXEL_FORMAT_XRGB_2101010:
1893 *drm_format = DRM_FORMAT_BGRX1010102;
1894 break;
1895 case HAL_PIXEL_FORMAT_BGRA_1010102:
1896 *drm_format = DRM_FORMAT_ARGB2101010;
1897 break;
1898 case HAL_PIXEL_FORMAT_ABGR_2101010:
1899 *drm_format = DRM_FORMAT_RGBA1010102;
1900 break;
1901 case HAL_PIXEL_FORMAT_BGRX_1010102:
1902 *drm_format = DRM_FORMAT_XRGB2101010;
1903 break;
1904 case HAL_PIXEL_FORMAT_XBGR_2101010:
1905 *drm_format = DRM_FORMAT_RGBX1010102;
1906 break;
1907 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
1908 *drm_format = DRM_FORMAT_NV12;
1909 break;
1910 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
1911 *drm_format = DRM_FORMAT_NV12;
1912 if (compressed) {
1913 *drm_format_modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED;
1914 } else {
1915 *drm_format_modifier = DRM_FORMAT_MOD_QCOM_TILE;
1916 }
1917 break;
1918 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1919 *drm_format = DRM_FORMAT_NV21;
1920 break;
1921 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
1922 *drm_format = DRM_FORMAT_NV21;
1923 break;
1924 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
1925 case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
1926 *drm_format = DRM_FORMAT_NV12;
1927 *drm_format_modifier = DRM_FORMAT_MOD_QCOM_DX;
1928 break;
1929 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
1930 *drm_format = DRM_FORMAT_NV12;
1931 if (compressed) {
1932 *drm_format_modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED | DRM_FORMAT_MOD_QCOM_DX;
1933 } else {
1934 *drm_format_modifier = DRM_FORMAT_MOD_QCOM_TILE | DRM_FORMAT_MOD_QCOM_DX;
1935 }
1936 break;
1937 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
1938 *drm_format = DRM_FORMAT_NV12;
1939 if (compressed) {
1940 *drm_format_modifier =
1941 DRM_FORMAT_MOD_QCOM_COMPRESSED | DRM_FORMAT_MOD_QCOM_DX | DRM_FORMAT_MOD_QCOM_TIGHT;
1942 } else {
1943 *drm_format_modifier =
1944 DRM_FORMAT_MOD_QCOM_TILE | DRM_FORMAT_MOD_QCOM_DX | DRM_FORMAT_MOD_QCOM_TIGHT;
1945 }
1946 break;
1947 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1948 *drm_format = DRM_FORMAT_NV16;
1949 break;
1950 /*
1951 TODO: No HAL_PIXEL_FORMAT equivalent?
1952 case kFormatYCrCb422H2V1SemiPlanar:
1953 *drm_format = DRM_FORMAT_NV61;
1954 break;*/
1955 case HAL_PIXEL_FORMAT_YV12:
1956 *drm_format = DRM_FORMAT_YVU420;
1957 break;
1958 case HAL_PIXEL_FORMAT_RGBA_FP16:
1959 ALOGW("HAL_PIXEL_FORMAT_RGBA_FP16 currently not supported");
1960 break;
1961 default:
1962 ALOGE("Unsupported format %d", format);
1963 }
1964 }
1965
CanAllocateZSLForSecureCamera()1966 bool CanAllocateZSLForSecureCamera() {
1967 static bool inited = false;
1968 static bool can_allocate = true;
1969 if (inited) {
1970 return can_allocate;
1971 }
1972 char property[PROPERTY_VALUE_MAX];
1973 property_get("vendor.gralloc.secure_preview_buffer_format", property, "0");
1974 if (!(strncmp(property, "420_sp", PROPERTY_VALUE_MAX))) {
1975 can_allocate = false;
1976 }
1977 inited = true;
1978 ALOGI("CanAllocateZSLForSecureCamera: %d", can_allocate);
1979
1980 return can_allocate;
1981 }
1982 } // namespace gralloc
1983