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