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