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