Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/msm/dpu: rewrite _dpu_format_populate_plane_sizes_ubwc()

Drop extra wrapping layer (msm_media_info.h) and inline all VENUS_*()
functions, simplifying the code.

Patchwork: https://patchwork.freedesktop.org/patch/688184/
Link: https://lore.kernel.org/r/20251114-dpu-formats-v3-11-cae312379d49@oss.qualcomm.com
Tested-by: Luca Weiss <luca.weiss@fairphone.com> # qcm6490-fairphone-fp5
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>

+57 -1219
+57 -64
drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c
··· 7 7 #include <uapi/drm/drm_fourcc.h> 8 8 #include <drm/drm_framebuffer.h> 9 9 10 - #include "msm_media_info.h" 11 10 #include "dpu_kms.h" 12 11 #include "dpu_formats.h" 12 + 13 + #ifndef MSM_MEDIA_ALIGN 14 + #define MSM_MEDIA_ALIGN(__sz, __align) (((__align) & ((__align) - 1)) ?\ 15 + ((((__sz) + (__align) - 1) / (__align)) * (__align)) :\ 16 + (((__sz) + (__align) - 1) & (~((__align) - 1)))) 17 + #endif 18 + 19 + #ifndef MSM_MEDIA_ROUNDUP 20 + #define MSM_MEDIA_ROUNDUP(__sz, __r) (((__sz) + ((__r) - 1)) / (__r)) 21 + #endif 13 22 14 23 #define DPU_UBWC_PLANE_SIZE_ALIGNMENT 4096 15 24 ··· 63 54 } 64 55 } 65 56 66 - static int _dpu_format_get_media_color_ubwc(const struct msm_format *fmt) 67 - { 68 - static const struct dpu_media_color_map dpu_media_ubwc_map[] = { 69 - {DRM_FORMAT_ABGR8888, COLOR_FMT_RGBA8888_UBWC}, 70 - {DRM_FORMAT_ARGB8888, COLOR_FMT_RGBA8888_UBWC}, 71 - {DRM_FORMAT_XBGR8888, COLOR_FMT_RGBA8888_UBWC}, 72 - {DRM_FORMAT_XRGB8888, COLOR_FMT_RGBA8888_UBWC}, 73 - {DRM_FORMAT_ABGR2101010, COLOR_FMT_RGBA1010102_UBWC}, 74 - {DRM_FORMAT_ARGB2101010, COLOR_FMT_RGBA1010102_UBWC}, 75 - {DRM_FORMAT_XRGB2101010, COLOR_FMT_RGBA1010102_UBWC}, 76 - {DRM_FORMAT_XBGR2101010, COLOR_FMT_RGBA1010102_UBWC}, 77 - {DRM_FORMAT_BGR565, COLOR_FMT_RGB565_UBWC}, 78 - }; 79 - int color_fmt = -1; 80 - int i; 81 - 82 - if (fmt->pixel_format == DRM_FORMAT_NV12 || 83 - fmt->pixel_format == DRM_FORMAT_P010) { 84 - if (MSM_FORMAT_IS_DX(fmt)) { 85 - if (fmt->flags & MSM_FORMAT_FLAG_UNPACK_TIGHT) 86 - color_fmt = COLOR_FMT_NV12_BPP10_UBWC; 87 - else 88 - color_fmt = COLOR_FMT_P010_UBWC; 89 - } else 90 - color_fmt = COLOR_FMT_NV12_UBWC; 91 - return color_fmt; 92 - } 93 - 94 - for (i = 0; i < ARRAY_SIZE(dpu_media_ubwc_map); ++i) 95 - if (fmt->pixel_format == dpu_media_ubwc_map[i].format) { 96 - color_fmt = dpu_media_ubwc_map[i].color; 97 - break; 98 - } 99 - return color_fmt; 100 - } 101 - 102 57 static int _dpu_format_populate_plane_sizes_ubwc( 103 58 const struct msm_format *fmt, 104 59 struct drm_framebuffer *fb, 105 60 struct dpu_hw_fmt_layout *layout) 106 61 { 107 - int color; 108 62 bool meta = MSM_FORMAT_IS_UBWC(fmt); 109 63 110 - color = _dpu_format_get_media_color_ubwc(fmt); 111 - if (color < 0) { 112 - DRM_ERROR("UBWC format not supported for fmt: %p4cc\n", 113 - &fmt->pixel_format); 114 - return -EINVAL; 115 - } 116 - 117 64 if (MSM_FORMAT_IS_YUV(fmt)) { 118 - uint32_t y_sclines, uv_sclines; 119 - uint32_t y_meta_scanlines = 0; 120 - uint32_t uv_meta_scanlines = 0; 65 + unsigned int stride, sclines; 66 + unsigned int y_tile_width, y_tile_height; 67 + unsigned int y_meta_stride, y_meta_scanlines; 68 + unsigned int uv_meta_stride, uv_meta_scanlines; 121 69 122 - layout->plane_pitch[0] = VENUS_Y_STRIDE(color, fb->width); 123 - y_sclines = VENUS_Y_SCANLINES(color, fb->height); 70 + if (MSM_FORMAT_IS_DX(fmt)) { 71 + if (fmt->flags & MSM_FORMAT_FLAG_UNPACK_TIGHT) { 72 + stride = MSM_MEDIA_ALIGN(fb->width, 192); 73 + stride = MSM_MEDIA_ALIGN(stride * 4 / 3, 256); 74 + y_tile_width = 48; 75 + } else { 76 + stride = MSM_MEDIA_ALIGN(fb->width * 2, 256); 77 + y_tile_width = 32; 78 + } 79 + 80 + sclines = MSM_MEDIA_ALIGN(fb->height, 16); 81 + y_tile_height = 4; 82 + } else { 83 + stride = MSM_MEDIA_ALIGN(fb->width, 128); 84 + y_tile_width = 32; 85 + 86 + sclines = MSM_MEDIA_ALIGN(fb->height, 32); 87 + y_tile_height = 8; 88 + } 89 + 90 + layout->plane_pitch[0] = stride; 124 91 layout->plane_size[0] = MSM_MEDIA_ALIGN(layout->plane_pitch[0] * 125 - y_sclines, DPU_UBWC_PLANE_SIZE_ALIGNMENT); 92 + sclines, DPU_UBWC_PLANE_SIZE_ALIGNMENT); 126 93 127 - layout->plane_pitch[1] = VENUS_UV_STRIDE(color, fb->width); 128 - uv_sclines = VENUS_UV_SCANLINES(color, fb->height); 94 + layout->plane_pitch[1] = stride; 129 95 layout->plane_size[1] = MSM_MEDIA_ALIGN(layout->plane_pitch[1] * 130 - uv_sclines, DPU_UBWC_PLANE_SIZE_ALIGNMENT); 96 + sclines, DPU_UBWC_PLANE_SIZE_ALIGNMENT); 131 97 132 98 if (!meta) 133 99 return 0; 134 100 135 - layout->plane_pitch[2] = VENUS_Y_META_STRIDE(color, fb->width); 136 - y_meta_scanlines = VENUS_Y_META_SCANLINES(color, fb->height); 101 + y_meta_stride = MSM_MEDIA_ROUNDUP(fb->width, y_tile_width); 102 + layout->plane_pitch[2] = MSM_MEDIA_ALIGN(y_meta_stride, 64); 103 + 104 + y_meta_scanlines = MSM_MEDIA_ROUNDUP(fb->height, y_tile_height); 105 + y_meta_scanlines = MSM_MEDIA_ALIGN(y_meta_scanlines, 16); 137 106 layout->plane_size[2] = MSM_MEDIA_ALIGN(layout->plane_pitch[2] * 138 107 y_meta_scanlines, DPU_UBWC_PLANE_SIZE_ALIGNMENT); 139 108 140 - layout->plane_pitch[3] = VENUS_UV_META_STRIDE(color, fb->width); 141 - uv_meta_scanlines = VENUS_UV_META_SCANLINES(color, fb->height); 109 + uv_meta_stride = MSM_MEDIA_ROUNDUP((fb->width+1)>>1, y_tile_width / 2); 110 + layout->plane_pitch[3] = MSM_MEDIA_ALIGN(uv_meta_stride, 64); 111 + 112 + uv_meta_scanlines = MSM_MEDIA_ROUNDUP((fb->height+1)>>1, y_tile_height); 113 + uv_meta_scanlines = MSM_MEDIA_ALIGN(uv_meta_scanlines, 16); 142 114 layout->plane_size[3] = MSM_MEDIA_ALIGN(layout->plane_pitch[3] * 143 115 uv_meta_scanlines, DPU_UBWC_PLANE_SIZE_ALIGNMENT); 144 - 145 116 } else { 146 - uint32_t rgb_scanlines, rgb_meta_scanlines; 117 + unsigned int rgb_scanlines, rgb_meta_scanlines, rgb_meta_stride; 147 118 148 - layout->plane_pitch[0] = VENUS_RGB_STRIDE(color, fb->width); 149 - rgb_scanlines = VENUS_RGB_SCANLINES(color, fb->height); 119 + layout->plane_pitch[0] = MSM_MEDIA_ALIGN(fb->width * fmt->bpp, 256); 120 + rgb_scanlines = MSM_MEDIA_ALIGN(fb->height, 16); 150 121 layout->plane_size[0] = MSM_MEDIA_ALIGN(layout->plane_pitch[0] * 151 122 rgb_scanlines, DPU_UBWC_PLANE_SIZE_ALIGNMENT); 152 123 ··· 136 147 /* uAPI leaves plane[1] empty and plane[2] as meta */ 137 148 layout->num_planes += 1; 138 149 139 - layout->plane_pitch[2] = VENUS_RGB_META_STRIDE(color, fb->width); 140 - rgb_meta_scanlines = VENUS_RGB_META_SCANLINES(color, fb->height); 150 + rgb_meta_stride = MSM_MEDIA_ROUNDUP(fb->width, 16); 151 + layout->plane_pitch[2] = MSM_MEDIA_ALIGN(rgb_meta_stride, 64); 152 + 153 + rgb_meta_scanlines = MSM_MEDIA_ROUNDUP(fb->height, 4); 154 + rgb_meta_scanlines = MSM_MEDIA_ALIGN(rgb_meta_scanlines, 16); 155 + 141 156 layout->plane_size[2] = MSM_MEDIA_ALIGN(layout->plane_pitch[2] * 142 157 rgb_meta_scanlines, DPU_UBWC_PLANE_SIZE_ALIGNMENT); 143 158 }
-1155
drivers/gpu/drm/msm/disp/dpu1/msm_media_info.h
··· 1 - #ifndef __MEDIA_INFO_H__ 2 - #define __MEDIA_INFO_H__ 3 - 4 - #ifndef MSM_MEDIA_ALIGN 5 - #define MSM_MEDIA_ALIGN(__sz, __align) (((__align) & ((__align) - 1)) ?\ 6 - ((((__sz) + (__align) - 1) / (__align)) * (__align)) :\ 7 - (((__sz) + (__align) - 1) & (~((__align) - 1)))) 8 - #endif 9 - 10 - #ifndef MSM_MEDIA_ROUNDUP 11 - #define MSM_MEDIA_ROUNDUP(__sz, __r) (((__sz) + ((__r) - 1)) / (__r)) 12 - #endif 13 - 14 - #ifndef MSM_MEDIA_MAX 15 - #define MSM_MEDIA_MAX(__a, __b) ((__a) > (__b)?(__a):(__b)) 16 - #endif 17 - 18 - enum color_fmts { 19 - /* Venus NV12: 20 - * YUV 4:2:0 image with a plane of 8 bit Y samples followed 21 - * by an interleaved U/V plane containing 8 bit 2x2 subsampled 22 - * colour difference samples. 23 - * 24 - * <-------- Y/UV_Stride --------> 25 - * <------- Width -------> 26 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . ^ ^ 27 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | 28 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height | 29 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines 30 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | 31 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | 32 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | 33 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V | 34 - * . . . . . . . . . . . . . . . . | 35 - * . . . . . . . . . . . . . . . . | 36 - * . . . . . . . . . . . . . . . . | 37 - * . . . . . . . . . . . . . . . . V 38 - * U V U V U V U V U V U V . . . . ^ 39 - * U V U V U V U V U V U V . . . . | 40 - * U V U V U V U V U V U V . . . . | 41 - * U V U V U V U V U V U V . . . . UV_Scanlines 42 - * . . . . . . . . . . . . . . . . | 43 - * . . . . . . . . . . . . . . . . V 44 - * . . . . . . . . . . . . . . . . --> Buffer size alignment 45 - * 46 - * Y_Stride : Width aligned to 128 47 - * UV_Stride : Width aligned to 128 48 - * Y_Scanlines: Height aligned to 32 49 - * UV_Scanlines: Height/2 aligned to 16 50 - * Extradata: Arbitrary (software-imposed) padding 51 - * Total size = align((Y_Stride * Y_Scanlines 52 - * + UV_Stride * UV_Scanlines 53 - * + max(Extradata, Y_Stride * 8), 4096) 54 - */ 55 - COLOR_FMT_NV12, 56 - 57 - /* Venus NV21: 58 - * YUV 4:2:0 image with a plane of 8 bit Y samples followed 59 - * by an interleaved V/U plane containing 8 bit 2x2 subsampled 60 - * colour difference samples. 61 - * 62 - * <-------- Y/UV_Stride --------> 63 - * <------- Width -------> 64 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . ^ ^ 65 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | 66 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height | 67 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines 68 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | 69 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | 70 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | 71 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V | 72 - * . . . . . . . . . . . . . . . . | 73 - * . . . . . . . . . . . . . . . . | 74 - * . . . . . . . . . . . . . . . . | 75 - * . . . . . . . . . . . . . . . . V 76 - * V U V U V U V U V U V U . . . . ^ 77 - * V U V U V U V U V U V U . . . . | 78 - * V U V U V U V U V U V U . . . . | 79 - * V U V U V U V U V U V U . . . . UV_Scanlines 80 - * . . . . . . . . . . . . . . . . | 81 - * . . . . . . . . . . . . . . . . V 82 - * . . . . . . . . . . . . . . . . --> Padding & Buffer size alignment 83 - * 84 - * Y_Stride : Width aligned to 128 85 - * UV_Stride : Width aligned to 128 86 - * Y_Scanlines: Height aligned to 32 87 - * UV_Scanlines: Height/2 aligned to 16 88 - * Extradata: Arbitrary (software-imposed) padding 89 - * Total size = align((Y_Stride * Y_Scanlines 90 - * + UV_Stride * UV_Scanlines 91 - * + max(Extradata, Y_Stride * 8), 4096) 92 - */ 93 - COLOR_FMT_NV21, 94 - /* Venus NV12_MVTB: 95 - * Two YUV 4:2:0 images/views one after the other 96 - * in a top-bottom layout, same as NV12 97 - * with a plane of 8 bit Y samples followed 98 - * by an interleaved U/V plane containing 8 bit 2x2 subsampled 99 - * colour difference samples. 100 - * 101 - * 102 - * <-------- Y/UV_Stride --------> 103 - * <------- Width -------> 104 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . ^ ^ ^ 105 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | 106 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height | | 107 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines | 108 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | 109 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | 110 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | 111 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V | | 112 - * . . . . . . . . . . . . . . . . | View_1 113 - * . . . . . . . . . . . . . . . . | | 114 - * . . . . . . . . . . . . . . . . | | 115 - * . . . . . . . . . . . . . . . . V | 116 - * U V U V U V U V U V U V . . . . ^ | 117 - * U V U V U V U V U V U V . . . . | | 118 - * U V U V U V U V U V U V . . . . | | 119 - * U V U V U V U V U V U V . . . . UV_Scanlines | 120 - * . . . . . . . . . . . . . . . . | | 121 - * . . . . . . . . . . . . . . . . V V 122 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . ^ ^ ^ 123 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | 124 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height | | 125 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines | 126 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | 127 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | 128 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | | 129 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V | | 130 - * . . . . . . . . . . . . . . . . | View_2 131 - * . . . . . . . . . . . . . . . . | | 132 - * . . . . . . . . . . . . . . . . | | 133 - * . . . . . . . . . . . . . . . . V | 134 - * U V U V U V U V U V U V . . . . ^ | 135 - * U V U V U V U V U V U V . . . . | | 136 - * U V U V U V U V U V U V . . . . | | 137 - * U V U V U V U V U V U V . . . . UV_Scanlines | 138 - * . . . . . . . . . . . . . . . . | | 139 - * . . . . . . . . . . . . . . . . V V 140 - * . . . . . . . . . . . . . . . . --> Buffer size alignment 141 - * 142 - * Y_Stride : Width aligned to 128 143 - * UV_Stride : Width aligned to 128 144 - * Y_Scanlines: Height aligned to 32 145 - * UV_Scanlines: Height/2 aligned to 16 146 - * View_1 begin at: 0 (zero) 147 - * View_2 begin at: Y_Stride * Y_Scanlines + UV_Stride * UV_Scanlines 148 - * Extradata: Arbitrary (software-imposed) padding 149 - * Total size = align((2*(Y_Stride * Y_Scanlines) 150 - * + 2*(UV_Stride * UV_Scanlines) + Extradata), 4096) 151 - */ 152 - COLOR_FMT_NV12_MVTB, 153 - /* 154 - * The buffer can be of 2 types: 155 - * (1) Venus NV12 UBWC Progressive 156 - * (2) Venus NV12 UBWC Interlaced 157 - * 158 - * (1) Venus NV12 UBWC Progressive Buffer Format: 159 - * Compressed Macro-tile format for NV12. 160 - * Contains 4 planes in the following order - 161 - * (A) Y_Meta_Plane 162 - * (B) Y_UBWC_Plane 163 - * (C) UV_Meta_Plane 164 - * (D) UV_UBWC_Plane 165 - * 166 - * Y_Meta_Plane consists of meta information to decode compressed 167 - * tile data in Y_UBWC_Plane. 168 - * Y_UBWC_Plane consists of Y data in compressed macro-tile format. 169 - * UBWC decoder block will use the Y_Meta_Plane data together with 170 - * Y_UBWC_Plane data to produce loss-less uncompressed 8 bit Y samples. 171 - * 172 - * UV_Meta_Plane consists of meta information to decode compressed 173 - * tile data in UV_UBWC_Plane. 174 - * UV_UBWC_Plane consists of UV data in compressed macro-tile format. 175 - * UBWC decoder block will use UV_Meta_Plane data together with 176 - * UV_UBWC_Plane data to produce loss-less uncompressed 8 bit 2x2 177 - * subsampled color difference samples. 178 - * 179 - * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable 180 - * and randomly accessible. There is no dependency between tiles. 181 - * 182 - * <----- Y_Meta_Stride ----> 183 - * <-------- Width ------> 184 - * M M M M M M M M M M M M . . ^ ^ 185 - * M M M M M M M M M M M M . . | | 186 - * M M M M M M M M M M M M . . Height | 187 - * M M M M M M M M M M M M . . | Meta_Y_Scanlines 188 - * M M M M M M M M M M M M . . | | 189 - * M M M M M M M M M M M M . . | | 190 - * M M M M M M M M M M M M . . | | 191 - * M M M M M M M M M M M M . . V | 192 - * . . . . . . . . . . . . . . | 193 - * . . . . . . . . . . . . . . | 194 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 195 - * . . . . . . . . . . . . . . V 196 - * <--Compressed tile Y Stride---> 197 - * <------- Width -------> 198 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^ 199 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 200 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Height | 201 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_Scanlines 202 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 203 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 204 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 205 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V | 206 - * . . . . . . . . . . . . . . . . | 207 - * . . . . . . . . . . . . . . . . | 208 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 209 - * . . . . . . . . . . . . . . . . V 210 - * <----- UV_Meta_Stride ----> 211 - * M M M M M M M M M M M M . . ^ 212 - * M M M M M M M M M M M M . . | 213 - * M M M M M M M M M M M M . . | 214 - * M M M M M M M M M M M M . . M_UV_Scanlines 215 - * . . . . . . . . . . . . . . | 216 - * . . . . . . . . . . . . . . V 217 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 218 - * <--Compressed tile UV Stride---> 219 - * U* V* U* V* U* V* U* V* . . . . ^ 220 - * U* V* U* V* U* V* U* V* . . . . | 221 - * U* V* U* V* U* V* U* V* . . . . | 222 - * U* V* U* V* U* V* U* V* . . . . UV_Scanlines 223 - * . . . . . . . . . . . . . . . . | 224 - * . . . . . . . . . . . . . . . . V 225 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 226 - * 227 - * Y_Stride = align(Width, 128) 228 - * UV_Stride = align(Width, 128) 229 - * Y_Scanlines = align(Height, 32) 230 - * UV_Scanlines = align(Height/2, 16) 231 - * Y_UBWC_Plane_size = align(Y_Stride * Y_Scanlines, 4096) 232 - * UV_UBWC_Plane_size = align(UV_Stride * UV_Scanlines, 4096) 233 - * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64) 234 - * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16) 235 - * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096) 236 - * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64) 237 - * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16) 238 - * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096) 239 - * Extradata = 8k 240 - * 241 - * Total size = align( Y_UBWC_Plane_size + UV_UBWC_Plane_size + 242 - * Y_Meta_Plane_size + UV_Meta_Plane_size 243 - * + max(Extradata, Y_Stride * 48), 4096) 244 - * 245 - * 246 - * (2) Venus NV12 UBWC Interlaced Buffer Format: 247 - * Compressed Macro-tile format for NV12 interlaced. 248 - * Contains 8 planes in the following order - 249 - * (A) Y_Meta_Top_Field_Plane 250 - * (B) Y_UBWC_Top_Field_Plane 251 - * (C) UV_Meta_Top_Field_Plane 252 - * (D) UV_UBWC_Top_Field_Plane 253 - * (E) Y_Meta_Bottom_Field_Plane 254 - * (F) Y_UBWC_Bottom_Field_Plane 255 - * (G) UV_Meta_Bottom_Field_Plane 256 - * (H) UV_UBWC_Bottom_Field_Plane 257 - * Y_Meta_Top_Field_Plane consists of meta information to decode 258 - * compressed tile data for Y_UBWC_Top_Field_Plane. 259 - * Y_UBWC_Top_Field_Plane consists of Y data in compressed macro-tile 260 - * format for top field of an interlaced frame. 261 - * UBWC decoder block will use the Y_Meta_Top_Field_Plane data together 262 - * with Y_UBWC_Top_Field_Plane data to produce loss-less uncompressed 263 - * 8 bit Y samples for top field of an interlaced frame. 264 - * 265 - * UV_Meta_Top_Field_Plane consists of meta information to decode 266 - * compressed tile data in UV_UBWC_Top_Field_Plane. 267 - * UV_UBWC_Top_Field_Plane consists of UV data in compressed macro-tile 268 - * format for top field of an interlaced frame. 269 - * UBWC decoder block will use UV_Meta_Top_Field_Plane data together 270 - * with UV_UBWC_Top_Field_Plane data to produce loss-less uncompressed 271 - * 8 bit subsampled color difference samples for top field of an 272 - * interlaced frame. 273 - * 274 - * Each tile in Y_UBWC_Top_Field_Plane/UV_UBWC_Top_Field_Plane is 275 - * independently decodable and randomly accessible. There is no 276 - * dependency between tiles. 277 - * 278 - * Y_Meta_Bottom_Field_Plane consists of meta information to decode 279 - * compressed tile data for Y_UBWC_Bottom_Field_Plane. 280 - * Y_UBWC_Bottom_Field_Plane consists of Y data in compressed macro-tile 281 - * format for bottom field of an interlaced frame. 282 - * UBWC decoder block will use the Y_Meta_Bottom_Field_Plane data 283 - * together with Y_UBWC_Bottom_Field_Plane data to produce loss-less 284 - * uncompressed 8 bit Y samples for bottom field of an interlaced frame. 285 - * 286 - * UV_Meta_Bottom_Field_Plane consists of meta information to decode 287 - * compressed tile data in UV_UBWC_Bottom_Field_Plane. 288 - * UV_UBWC_Bottom_Field_Plane consists of UV data in compressed 289 - * macro-tile format for bottom field of an interlaced frame. 290 - * UBWC decoder block will use UV_Meta_Bottom_Field_Plane data together 291 - * with UV_UBWC_Bottom_Field_Plane data to produce loss-less 292 - * uncompressed 8 bit subsampled color difference samples for bottom 293 - * field of an interlaced frame. 294 - * 295 - * Each tile in Y_UBWC_Bottom_Field_Plane/UV_UBWC_Bottom_Field_Plane is 296 - * independently decodable and randomly accessible. There is no 297 - * dependency between tiles. 298 - * 299 - * <-----Y_TF_Meta_Stride----> 300 - * <-------- Width ------> 301 - * M M M M M M M M M M M M . . ^ ^ 302 - * M M M M M M M M M M M M . . | | 303 - * M M M M M M M M M M M M . . Half_height | 304 - * M M M M M M M M M M M M . . | Meta_Y_TF_Scanlines 305 - * M M M M M M M M M M M M . . | | 306 - * M M M M M M M M M M M M . . | | 307 - * M M M M M M M M M M M M . . | | 308 - * M M M M M M M M M M M M . . V | 309 - * . . . . . . . . . . . . . . | 310 - * . . . . . . . . . . . . . . | 311 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 312 - * . . . . . . . . . . . . . . V 313 - * <-Compressed tile Y_TF Stride-> 314 - * <------- Width -------> 315 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^ 316 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 317 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Half_height | 318 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_TF_Scanlines 319 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 320 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 321 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 322 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V | 323 - * . . . . . . . . . . . . . . . . | 324 - * . . . . . . . . . . . . . . . . | 325 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 326 - * . . . . . . . . . . . . . . . . V 327 - * <----UV_TF_Meta_Stride----> 328 - * M M M M M M M M M M M M . . ^ 329 - * M M M M M M M M M M M M . . | 330 - * M M M M M M M M M M M M . . | 331 - * M M M M M M M M M M M M . . M_UV_TF_Scanlines 332 - * . . . . . . . . . . . . . . | 333 - * . . . . . . . . . . . . . . V 334 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 335 - * <-Compressed tile UV_TF Stride-> 336 - * U* V* U* V* U* V* U* V* . . . . ^ 337 - * U* V* U* V* U* V* U* V* . . . . | 338 - * U* V* U* V* U* V* U* V* . . . . | 339 - * U* V* U* V* U* V* U* V* . . . . UV_TF_Scanlines 340 - * . . . . . . . . . . . . . . . . | 341 - * . . . . . . . . . . . . . . . . V 342 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 343 - * <-----Y_BF_Meta_Stride----> 344 - * <-------- Width ------> 345 - * M M M M M M M M M M M M . . ^ ^ 346 - * M M M M M M M M M M M M . . | | 347 - * M M M M M M M M M M M M . . Half_height | 348 - * M M M M M M M M M M M M . . | Meta_Y_BF_Scanlines 349 - * M M M M M M M M M M M M . . | | 350 - * M M M M M M M M M M M M . . | | 351 - * M M M M M M M M M M M M . . | | 352 - * M M M M M M M M M M M M . . V | 353 - * . . . . . . . . . . . . . . | 354 - * . . . . . . . . . . . . . . | 355 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 356 - * . . . . . . . . . . . . . . V 357 - * <-Compressed tile Y_BF Stride-> 358 - * <------- Width -------> 359 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^ 360 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 361 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Half_height | 362 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_BF_Scanlines 363 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 364 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 365 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 366 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V | 367 - * . . . . . . . . . . . . . . . . | 368 - * . . . . . . . . . . . . . . . . | 369 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 370 - * . . . . . . . . . . . . . . . . V 371 - * <----UV_BF_Meta_Stride----> 372 - * M M M M M M M M M M M M . . ^ 373 - * M M M M M M M M M M M M . . | 374 - * M M M M M M M M M M M M . . | 375 - * M M M M M M M M M M M M . . M_UV_BF_Scanlines 376 - * . . . . . . . . . . . . . . | 377 - * . . . . . . . . . . . . . . V 378 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 379 - * <-Compressed tile UV_BF Stride-> 380 - * U* V* U* V* U* V* U* V* . . . . ^ 381 - * U* V* U* V* U* V* U* V* . . . . | 382 - * U* V* U* V* U* V* U* V* . . . . | 383 - * U* V* U* V* U* V* U* V* . . . . UV_BF_Scanlines 384 - * . . . . . . . . . . . . . . . . | 385 - * . . . . . . . . . . . . . . . . V 386 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 387 - * 388 - * Half_height = (Height+1)>>1 389 - * Y_TF_Stride = align(Width, 128) 390 - * UV_TF_Stride = align(Width, 128) 391 - * Y_TF_Scanlines = align(Half_height, 32) 392 - * UV_TF_Scanlines = align((Half_height+1)/2, 32) 393 - * Y_UBWC_TF_Plane_size = align(Y_TF_Stride * Y_TF_Scanlines, 4096) 394 - * UV_UBWC_TF_Plane_size = align(UV_TF_Stride * UV_TF_Scanlines, 4096) 395 - * Y_TF_Meta_Stride = align(roundup(Width, Y_TileWidth), 64) 396 - * Y_TF_Meta_Scanlines = align(roundup(Half_height, Y_TileHeight), 16) 397 - * Y_TF_Meta_Plane_size = 398 - * align(Y_TF_Meta_Stride * Y_TF_Meta_Scanlines, 4096) 399 - * UV_TF_Meta_Stride = align(roundup(Width, UV_TileWidth), 64) 400 - * UV_TF_Meta_Scanlines = align(roundup(Half_height, UV_TileHeight), 16) 401 - * UV_TF_Meta_Plane_size = 402 - * align(UV_TF_Meta_Stride * UV_TF_Meta_Scanlines, 4096) 403 - * Y_BF_Stride = align(Width, 128) 404 - * UV_BF_Stride = align(Width, 128) 405 - * Y_BF_Scanlines = align(Half_height, 32) 406 - * UV_BF_Scanlines = align((Half_height+1)/2, 32) 407 - * Y_UBWC_BF_Plane_size = align(Y_BF_Stride * Y_BF_Scanlines, 4096) 408 - * UV_UBWC_BF_Plane_size = align(UV_BF_Stride * UV_BF_Scanlines, 4096) 409 - * Y_BF_Meta_Stride = align(roundup(Width, Y_TileWidth), 64) 410 - * Y_BF_Meta_Scanlines = align(roundup(Half_height, Y_TileHeight), 16) 411 - * Y_BF_Meta_Plane_size = 412 - * align(Y_BF_Meta_Stride * Y_BF_Meta_Scanlines, 4096) 413 - * UV_BF_Meta_Stride = align(roundup(Width, UV_TileWidth), 64) 414 - * UV_BF_Meta_Scanlines = align(roundup(Half_height, UV_TileHeight), 16) 415 - * UV_BF_Meta_Plane_size = 416 - * align(UV_BF_Meta_Stride * UV_BF_Meta_Scanlines, 4096) 417 - * Extradata = 8k 418 - * 419 - * Total size = align( Y_UBWC_TF_Plane_size + UV_UBWC_TF_Plane_size + 420 - * Y_TF_Meta_Plane_size + UV_TF_Meta_Plane_size + 421 - * Y_UBWC_BF_Plane_size + UV_UBWC_BF_Plane_size + 422 - * Y_BF_Meta_Plane_size + UV_BF_Meta_Plane_size + 423 - * + max(Extradata, Y_TF_Stride * 48), 4096) 424 - */ 425 - COLOR_FMT_NV12_UBWC, 426 - /* Venus NV12 10-bit UBWC: 427 - * Compressed Macro-tile format for NV12. 428 - * Contains 4 planes in the following order - 429 - * (A) Y_Meta_Plane 430 - * (B) Y_UBWC_Plane 431 - * (C) UV_Meta_Plane 432 - * (D) UV_UBWC_Plane 433 - * 434 - * Y_Meta_Plane consists of meta information to decode compressed 435 - * tile data in Y_UBWC_Plane. 436 - * Y_UBWC_Plane consists of Y data in compressed macro-tile format. 437 - * UBWC decoder block will use the Y_Meta_Plane data together with 438 - * Y_UBWC_Plane data to produce loss-less uncompressed 10 bit Y samples. 439 - * 440 - * UV_Meta_Plane consists of meta information to decode compressed 441 - * tile data in UV_UBWC_Plane. 442 - * UV_UBWC_Plane consists of UV data in compressed macro-tile format. 443 - * UBWC decoder block will use UV_Meta_Plane data together with 444 - * UV_UBWC_Plane data to produce loss-less uncompressed 10 bit 2x2 445 - * subsampled color difference samples. 446 - * 447 - * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable 448 - * and randomly accessible. There is no dependency between tiles. 449 - * 450 - * <----- Y_Meta_Stride -----> 451 - * <-------- Width ------> 452 - * M M M M M M M M M M M M . . ^ ^ 453 - * M M M M M M M M M M M M . . | | 454 - * M M M M M M M M M M M M . . Height | 455 - * M M M M M M M M M M M M . . | Meta_Y_Scanlines 456 - * M M M M M M M M M M M M . . | | 457 - * M M M M M M M M M M M M . . | | 458 - * M M M M M M M M M M M M . . | | 459 - * M M M M M M M M M M M M . . V | 460 - * . . . . . . . . . . . . . . | 461 - * . . . . . . . . . . . . . . | 462 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 463 - * . . . . . . . . . . . . . . V 464 - * <--Compressed tile Y Stride---> 465 - * <------- Width -------> 466 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^ 467 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 468 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Height | 469 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_Scanlines 470 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 471 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 472 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 473 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V | 474 - * . . . . . . . . . . . . . . . . | 475 - * . . . . . . . . . . . . . . . . | 476 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 477 - * . . . . . . . . . . . . . . . . V 478 - * <----- UV_Meta_Stride ----> 479 - * M M M M M M M M M M M M . . ^ 480 - * M M M M M M M M M M M M . . | 481 - * M M M M M M M M M M M M . . | 482 - * M M M M M M M M M M M M . . M_UV_Scanlines 483 - * . . . . . . . . . . . . . . | 484 - * . . . . . . . . . . . . . . V 485 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 486 - * <--Compressed tile UV Stride---> 487 - * U* V* U* V* U* V* U* V* . . . . ^ 488 - * U* V* U* V* U* V* U* V* . . . . | 489 - * U* V* U* V* U* V* U* V* . . . . | 490 - * U* V* U* V* U* V* U* V* . . . . UV_Scanlines 491 - * . . . . . . . . . . . . . . . . | 492 - * . . . . . . . . . . . . . . . . V 493 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 494 - * 495 - * 496 - * Y_Stride = align(Width * 4/3, 128) 497 - * UV_Stride = align(Width * 4/3, 128) 498 - * Y_Scanlines = align(Height, 32) 499 - * UV_Scanlines = align(Height/2, 16) 500 - * Y_UBWC_Plane_Size = align(Y_Stride * Y_Scanlines, 4096) 501 - * UV_UBWC_Plane_Size = align(UV_Stride * UV_Scanlines, 4096) 502 - * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64) 503 - * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16) 504 - * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096) 505 - * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64) 506 - * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16) 507 - * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096) 508 - * Extradata = 8k 509 - * 510 - * Total size = align(Y_UBWC_Plane_size + UV_UBWC_Plane_size + 511 - * Y_Meta_Plane_size + UV_Meta_Plane_size 512 - * + max(Extradata, Y_Stride * 48), 4096) 513 - */ 514 - COLOR_FMT_NV12_BPP10_UBWC, 515 - /* Venus RGBA8888 format: 516 - * Contains 1 plane in the following order - 517 - * (A) RGBA plane 518 - * 519 - * <-------- RGB_Stride --------> 520 - * <------- Width -------> 521 - * R R R R R R R R R R R R . . . . ^ ^ 522 - * R R R R R R R R R R R R . . . . | | 523 - * R R R R R R R R R R R R . . . . Height | 524 - * R R R R R R R R R R R R . . . . | RGB_Scanlines 525 - * R R R R R R R R R R R R . . . . | | 526 - * R R R R R R R R R R R R . . . . | | 527 - * R R R R R R R R R R R R . . . . | | 528 - * R R R R R R R R R R R R . . . . V | 529 - * . . . . . . . . . . . . . . . . | 530 - * . . . . . . . . . . . . . . . . | 531 - * . . . . . . . . . . . . . . . . | 532 - * . . . . . . . . . . . . . . . . V 533 - * 534 - * RGB_Stride = align(Width * 4, 128) 535 - * RGB_Scanlines = align(Height, 32) 536 - * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096) 537 - * Extradata = 8k 538 - * 539 - * Total size = align(RGB_Plane_size + Extradata, 4096) 540 - */ 541 - COLOR_FMT_RGBA8888, 542 - /* Venus RGBA8888 UBWC format: 543 - * Contains 2 planes in the following order - 544 - * (A) Meta plane 545 - * (B) RGBA plane 546 - * 547 - * <--- RGB_Meta_Stride ----> 548 - * <-------- Width ------> 549 - * M M M M M M M M M M M M . . ^ ^ 550 - * M M M M M M M M M M M M . . | | 551 - * M M M M M M M M M M M M . . Height | 552 - * M M M M M M M M M M M M . . | Meta_RGB_Scanlines 553 - * M M M M M M M M M M M M . . | | 554 - * M M M M M M M M M M M M . . | | 555 - * M M M M M M M M M M M M . . | | 556 - * M M M M M M M M M M M M . . V | 557 - * . . . . . . . . . . . . . . | 558 - * . . . . . . . . . . . . . . | 559 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 560 - * . . . . . . . . . . . . . . V 561 - * <-------- RGB_Stride --------> 562 - * <------- Width -------> 563 - * R R R R R R R R R R R R . . . . ^ ^ 564 - * R R R R R R R R R R R R . . . . | | 565 - * R R R R R R R R R R R R . . . . Height | 566 - * R R R R R R R R R R R R . . . . | RGB_Scanlines 567 - * R R R R R R R R R R R R . . . . | | 568 - * R R R R R R R R R R R R . . . . | | 569 - * R R R R R R R R R R R R . . . . | | 570 - * R R R R R R R R R R R R . . . . V | 571 - * . . . . . . . . . . . . . . . . | 572 - * . . . . . . . . . . . . . . . . | 573 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 574 - * . . . . . . . . . . . . . . . . V 575 - * 576 - * RGB_Stride = align(Width * 4, 128) 577 - * RGB_Scanlines = align(Height, 32) 578 - * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096) 579 - * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64) 580 - * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16) 581 - * RGB_Meta_Plane_size = align(RGB_Meta_Stride * 582 - * RGB_Meta_Scanlines, 4096) 583 - * Extradata = 8k 584 - * 585 - * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size + 586 - * Extradata, 4096) 587 - */ 588 - COLOR_FMT_RGBA8888_UBWC, 589 - /* Venus RGBA1010102 UBWC format: 590 - * Contains 2 planes in the following order - 591 - * (A) Meta plane 592 - * (B) RGBA plane 593 - * 594 - * <--- RGB_Meta_Stride ----> 595 - * <-------- Width ------> 596 - * M M M M M M M M M M M M . . ^ ^ 597 - * M M M M M M M M M M M M . . | | 598 - * M M M M M M M M M M M M . . Height | 599 - * M M M M M M M M M M M M . . | Meta_RGB_Scanlines 600 - * M M M M M M M M M M M M . . | | 601 - * M M M M M M M M M M M M . . | | 602 - * M M M M M M M M M M M M . . | | 603 - * M M M M M M M M M M M M . . V | 604 - * . . . . . . . . . . . . . . | 605 - * . . . . . . . . . . . . . . | 606 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 607 - * . . . . . . . . . . . . . . V 608 - * <-------- RGB_Stride --------> 609 - * <------- Width -------> 610 - * R R R R R R R R R R R R . . . . ^ ^ 611 - * R R R R R R R R R R R R . . . . | | 612 - * R R R R R R R R R R R R . . . . Height | 613 - * R R R R R R R R R R R R . . . . | RGB_Scanlines 614 - * R R R R R R R R R R R R . . . . | | 615 - * R R R R R R R R R R R R . . . . | | 616 - * R R R R R R R R R R R R . . . . | | 617 - * R R R R R R R R R R R R . . . . V | 618 - * . . . . . . . . . . . . . . . . | 619 - * . . . . . . . . . . . . . . . . | 620 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 621 - * . . . . . . . . . . . . . . . . V 622 - * 623 - * RGB_Stride = align(Width * 4, 256) 624 - * RGB_Scanlines = align(Height, 16) 625 - * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096) 626 - * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64) 627 - * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16) 628 - * RGB_Meta_Plane_size = align(RGB_Meta_Stride * 629 - * RGB_Meta_Scanlines, 4096) 630 - * Extradata = 8k 631 - * 632 - * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size + 633 - * Extradata, 4096) 634 - */ 635 - COLOR_FMT_RGBA1010102_UBWC, 636 - /* Venus RGB565 UBWC format: 637 - * Contains 2 planes in the following order - 638 - * (A) Meta plane 639 - * (B) RGB plane 640 - * 641 - * <--- RGB_Meta_Stride ----> 642 - * <-------- Width ------> 643 - * M M M M M M M M M M M M . . ^ ^ 644 - * M M M M M M M M M M M M . . | | 645 - * M M M M M M M M M M M M . . Height | 646 - * M M M M M M M M M M M M . . | Meta_RGB_Scanlines 647 - * M M M M M M M M M M M M . . | | 648 - * M M M M M M M M M M M M . . | | 649 - * M M M M M M M M M M M M . . | | 650 - * M M M M M M M M M M M M . . V | 651 - * . . . . . . . . . . . . . . | 652 - * . . . . . . . . . . . . . . | 653 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 654 - * . . . . . . . . . . . . . . V 655 - * <-------- RGB_Stride --------> 656 - * <------- Width -------> 657 - * R R R R R R R R R R R R . . . . ^ ^ 658 - * R R R R R R R R R R R R . . . . | | 659 - * R R R R R R R R R R R R . . . . Height | 660 - * R R R R R R R R R R R R . . . . | RGB_Scanlines 661 - * R R R R R R R R R R R R . . . . | | 662 - * R R R R R R R R R R R R . . . . | | 663 - * R R R R R R R R R R R R . . . . | | 664 - * R R R R R R R R R R R R . . . . V | 665 - * . . . . . . . . . . . . . . . . | 666 - * . . . . . . . . . . . . . . . . | 667 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 668 - * . . . . . . . . . . . . . . . . V 669 - * 670 - * RGB_Stride = align(Width * 2, 128) 671 - * RGB_Scanlines = align(Height, 16) 672 - * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096) 673 - * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64) 674 - * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16) 675 - * RGB_Meta_Plane_size = align(RGB_Meta_Stride * 676 - * RGB_Meta_Scanlines, 4096) 677 - * Extradata = 8k 678 - * 679 - * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size + 680 - * Extradata, 4096) 681 - */ 682 - COLOR_FMT_RGB565_UBWC, 683 - /* P010 UBWC: 684 - * Compressed Macro-tile format for NV12. 685 - * Contains 4 planes in the following order - 686 - * (A) Y_Meta_Plane 687 - * (B) Y_UBWC_Plane 688 - * (C) UV_Meta_Plane 689 - * (D) UV_UBWC_Plane 690 - * 691 - * Y_Meta_Plane consists of meta information to decode compressed 692 - * tile data in Y_UBWC_Plane. 693 - * Y_UBWC_Plane consists of Y data in compressed macro-tile format. 694 - * UBWC decoder block will use the Y_Meta_Plane data together with 695 - * Y_UBWC_Plane data to produce loss-less uncompressed 10 bit Y samples. 696 - * 697 - * UV_Meta_Plane consists of meta information to decode compressed 698 - * tile data in UV_UBWC_Plane. 699 - * UV_UBWC_Plane consists of UV data in compressed macro-tile format. 700 - * UBWC decoder block will use UV_Meta_Plane data together with 701 - * UV_UBWC_Plane data to produce loss-less uncompressed 10 bit 2x2 702 - * subsampled color difference samples. 703 - * 704 - * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable 705 - * and randomly accessible. There is no dependency between tiles. 706 - * 707 - * <----- Y_Meta_Stride -----> 708 - * <-------- Width ------> 709 - * M M M M M M M M M M M M . . ^ ^ 710 - * M M M M M M M M M M M M . . | | 711 - * M M M M M M M M M M M M . . Height | 712 - * M M M M M M M M M M M M . . | Meta_Y_Scanlines 713 - * M M M M M M M M M M M M . . | | 714 - * M M M M M M M M M M M M . . | | 715 - * M M M M M M M M M M M M . . | | 716 - * M M M M M M M M M M M M . . V | 717 - * . . . . . . . . . . . . . . | 718 - * . . . . . . . . . . . . . . | 719 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 720 - * . . . . . . . . . . . . . . V 721 - * <--Compressed tile Y Stride---> 722 - * <------- Width -------> 723 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^ 724 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 725 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Height | 726 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_Scanlines 727 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 728 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 729 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | | 730 - * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V | 731 - * . . . . . . . . . . . . . . . . | 732 - * . . . . . . . . . . . . . . . . | 733 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 734 - * . . . . . . . . . . . . . . . . V 735 - * <----- UV_Meta_Stride ----> 736 - * M M M M M M M M M M M M . . ^ 737 - * M M M M M M M M M M M M . . | 738 - * M M M M M M M M M M M M . . | 739 - * M M M M M M M M M M M M . . M_UV_Scanlines 740 - * . . . . . . . . . . . . . . | 741 - * . . . . . . . . . . . . . . V 742 - * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 743 - * <--Compressed tile UV Stride---> 744 - * U* V* U* V* U* V* U* V* . . . . ^ 745 - * U* V* U* V* U* V* U* V* . . . . | 746 - * U* V* U* V* U* V* U* V* . . . . | 747 - * U* V* U* V* U* V* U* V* . . . . UV_Scanlines 748 - * . . . . . . . . . . . . . . . . | 749 - * . . . . . . . . . . . . . . . . V 750 - * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k 751 - * 752 - * 753 - * Y_Stride = align(Width * 2, 256) 754 - * UV_Stride = align(Width * 2, 256) 755 - * Y_Scanlines = align(Height, 16) 756 - * UV_Scanlines = align(Height/2, 16) 757 - * Y_UBWC_Plane_Size = align(Y_Stride * Y_Scanlines, 4096) 758 - * UV_UBWC_Plane_Size = align(UV_Stride * UV_Scanlines, 4096) 759 - * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64) 760 - * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16) 761 - * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096) 762 - * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64) 763 - * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16) 764 - * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096) 765 - * Extradata = 8k 766 - * 767 - * Total size = align(Y_UBWC_Plane_size + UV_UBWC_Plane_size + 768 - * Y_Meta_Plane_size + UV_Meta_Plane_size 769 - * + max(Extradata, Y_Stride * 48), 4096) 770 - */ 771 - COLOR_FMT_P010_UBWC, 772 - /* Venus P010: 773 - * YUV 4:2:0 image with a plane of 10 bit Y samples followed 774 - * by an interleaved U/V plane containing 10 bit 2x2 subsampled 775 - * colour difference samples. 776 - * 777 - * <-------- Y/UV_Stride --------> 778 - * <------- Width -------> 779 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . ^ ^ 780 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | 781 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height | 782 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines 783 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | 784 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | 785 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | 786 - * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V | 787 - * . . . . . . . . . . . . . . . . | 788 - * . . . . . . . . . . . . . . . . | 789 - * . . . . . . . . . . . . . . . . | 790 - * . . . . . . . . . . . . . . . . V 791 - * U V U V U V U V U V U V . . . . ^ 792 - * U V U V U V U V U V U V . . . . | 793 - * U V U V U V U V U V U V . . . . | 794 - * U V U V U V U V U V U V . . . . UV_Scanlines 795 - * . . . . . . . . . . . . . . . . | 796 - * . . . . . . . . . . . . . . . . V 797 - * . . . . . . . . . . . . . . . . --> Buffer size alignment 798 - * 799 - * Y_Stride : Width * 2 aligned to 128 800 - * UV_Stride : Width * 2 aligned to 128 801 - * Y_Scanlines: Height aligned to 32 802 - * UV_Scanlines: Height/2 aligned to 16 803 - * Extradata: Arbitrary (software-imposed) padding 804 - * Total size = align((Y_Stride * Y_Scanlines 805 - * + UV_Stride * UV_Scanlines 806 - * + max(Extradata, Y_Stride * 8), 4096) 807 - */ 808 - COLOR_FMT_P010, 809 - }; 810 - 811 - #define COLOR_FMT_RGBA1010102_UBWC COLOR_FMT_RGBA1010102_UBWC 812 - #define COLOR_FMT_RGB565_UBWC COLOR_FMT_RGB565_UBWC 813 - #define COLOR_FMT_P010_UBWC COLOR_FMT_P010_UBWC 814 - #define COLOR_FMT_P010 COLOR_FMT_P010 815 - 816 - /* 817 - * Function arguments: 818 - * @color_fmt 819 - * @width 820 - * Progressive: width 821 - * Interlaced: width 822 - */ 823 - static unsigned int VENUS_Y_STRIDE(int color_fmt, int width) 824 - { 825 - unsigned int stride = 0; 826 - 827 - if (!width) 828 - return 0; 829 - 830 - switch (color_fmt) { 831 - case COLOR_FMT_NV21: 832 - case COLOR_FMT_NV12: 833 - case COLOR_FMT_NV12_MVTB: 834 - case COLOR_FMT_NV12_UBWC: 835 - stride = MSM_MEDIA_ALIGN(width, 128); 836 - break; 837 - case COLOR_FMT_NV12_BPP10_UBWC: 838 - stride = MSM_MEDIA_ALIGN(width, 192); 839 - stride = MSM_MEDIA_ALIGN(stride * 4 / 3, 256); 840 - break; 841 - case COLOR_FMT_P010_UBWC: 842 - stride = MSM_MEDIA_ALIGN(width * 2, 256); 843 - break; 844 - case COLOR_FMT_P010: 845 - stride = MSM_MEDIA_ALIGN(width * 2, 128); 846 - break; 847 - } 848 - 849 - return stride; 850 - } 851 - 852 - /* 853 - * Function arguments: 854 - * @color_fmt 855 - * @width 856 - * Progressive: width 857 - * Interlaced: width 858 - */ 859 - static unsigned int VENUS_UV_STRIDE(int color_fmt, int width) 860 - { 861 - unsigned int stride = 0; 862 - 863 - if (!width) 864 - return 0; 865 - 866 - switch (color_fmt) { 867 - case COLOR_FMT_NV21: 868 - case COLOR_FMT_NV12: 869 - case COLOR_FMT_NV12_MVTB: 870 - case COLOR_FMT_NV12_UBWC: 871 - stride = MSM_MEDIA_ALIGN(width, 128); 872 - break; 873 - case COLOR_FMT_NV12_BPP10_UBWC: 874 - stride = MSM_MEDIA_ALIGN(width, 192); 875 - stride = MSM_MEDIA_ALIGN(stride * 4 / 3, 256); 876 - break; 877 - case COLOR_FMT_P010_UBWC: 878 - stride = MSM_MEDIA_ALIGN(width * 2, 256); 879 - break; 880 - case COLOR_FMT_P010: 881 - stride = MSM_MEDIA_ALIGN(width * 2, 128); 882 - break; 883 - } 884 - 885 - return stride; 886 - } 887 - 888 - /* 889 - * Function arguments: 890 - * @color_fmt 891 - * @height 892 - * Progressive: height 893 - * Interlaced: (height+1)>>1 894 - */ 895 - static unsigned int VENUS_Y_SCANLINES(int color_fmt, int height) 896 - { 897 - unsigned int sclines = 0; 898 - 899 - if (!height) 900 - return 0; 901 - 902 - switch (color_fmt) { 903 - case COLOR_FMT_NV21: 904 - case COLOR_FMT_NV12: 905 - case COLOR_FMT_NV12_MVTB: 906 - case COLOR_FMT_NV12_UBWC: 907 - case COLOR_FMT_P010: 908 - sclines = MSM_MEDIA_ALIGN(height, 32); 909 - break; 910 - case COLOR_FMT_NV12_BPP10_UBWC: 911 - case COLOR_FMT_P010_UBWC: 912 - sclines = MSM_MEDIA_ALIGN(height, 16); 913 - break; 914 - } 915 - 916 - return sclines; 917 - } 918 - 919 - /* 920 - * Function arguments: 921 - * @color_fmt 922 - * @height 923 - * Progressive: height 924 - * Interlaced: (height+1)>>1 925 - */ 926 - static unsigned int VENUS_UV_SCANLINES(int color_fmt, int height) 927 - { 928 - unsigned int sclines = 0; 929 - 930 - if (!height) 931 - return 0; 932 - 933 - switch (color_fmt) { 934 - case COLOR_FMT_NV21: 935 - case COLOR_FMT_NV12: 936 - case COLOR_FMT_NV12_MVTB: 937 - case COLOR_FMT_NV12_BPP10_UBWC: 938 - case COLOR_FMT_P010_UBWC: 939 - case COLOR_FMT_P010: 940 - sclines = MSM_MEDIA_ALIGN((height + 1) >> 1, 16); 941 - break; 942 - case COLOR_FMT_NV12_UBWC: 943 - sclines = MSM_MEDIA_ALIGN((height + 1) >> 1, 32); 944 - break; 945 - } 946 - 947 - return sclines; 948 - } 949 - 950 - /* 951 - * Function arguments: 952 - * @color_fmt 953 - * @width 954 - * Progressive: width 955 - * Interlaced: width 956 - */ 957 - static unsigned int VENUS_Y_META_STRIDE(int color_fmt, int width) 958 - { 959 - int y_tile_width = 0, y_meta_stride; 960 - 961 - if (!width) 962 - return 0; 963 - 964 - switch (color_fmt) { 965 - case COLOR_FMT_NV12_UBWC: 966 - case COLOR_FMT_P010_UBWC: 967 - y_tile_width = 32; 968 - break; 969 - case COLOR_FMT_NV12_BPP10_UBWC: 970 - y_tile_width = 48; 971 - break; 972 - default: 973 - return 0; 974 - } 975 - 976 - y_meta_stride = MSM_MEDIA_ROUNDUP(width, y_tile_width); 977 - return MSM_MEDIA_ALIGN(y_meta_stride, 64); 978 - } 979 - 980 - /* 981 - * Function arguments: 982 - * @color_fmt 983 - * @height 984 - * Progressive: height 985 - * Interlaced: (height+1)>>1 986 - */ 987 - static unsigned int VENUS_Y_META_SCANLINES(int color_fmt, int height) 988 - { 989 - int y_tile_height = 0, y_meta_scanlines; 990 - 991 - if (!height) 992 - return 0; 993 - 994 - switch (color_fmt) { 995 - case COLOR_FMT_NV12_UBWC: 996 - y_tile_height = 8; 997 - break; 998 - case COLOR_FMT_NV12_BPP10_UBWC: 999 - case COLOR_FMT_P010_UBWC: 1000 - y_tile_height = 4; 1001 - break; 1002 - default: 1003 - return 0; 1004 - } 1005 - 1006 - y_meta_scanlines = MSM_MEDIA_ROUNDUP(height, y_tile_height); 1007 - return MSM_MEDIA_ALIGN(y_meta_scanlines, 16); 1008 - } 1009 - 1010 - /* 1011 - * Function arguments: 1012 - * @color_fmt 1013 - * @width 1014 - * Progressive: width 1015 - * Interlaced: width 1016 - */ 1017 - static unsigned int VENUS_UV_META_STRIDE(int color_fmt, int width) 1018 - { 1019 - int uv_tile_width = 0, uv_meta_stride; 1020 - 1021 - if (!width) 1022 - return 0; 1023 - 1024 - switch (color_fmt) { 1025 - case COLOR_FMT_NV12_UBWC: 1026 - case COLOR_FMT_P010_UBWC: 1027 - uv_tile_width = 16; 1028 - break; 1029 - case COLOR_FMT_NV12_BPP10_UBWC: 1030 - uv_tile_width = 24; 1031 - break; 1032 - default: 1033 - return 0; 1034 - } 1035 - 1036 - uv_meta_stride = MSM_MEDIA_ROUNDUP((width+1)>>1, uv_tile_width); 1037 - return MSM_MEDIA_ALIGN(uv_meta_stride, 64); 1038 - } 1039 - 1040 - /* 1041 - * Function arguments: 1042 - * @color_fmt 1043 - * @height 1044 - * Progressive: height 1045 - * Interlaced: (height+1)>>1 1046 - */ 1047 - static unsigned int VENUS_UV_META_SCANLINES(int color_fmt, int height) 1048 - { 1049 - int uv_tile_height = 0, uv_meta_scanlines; 1050 - 1051 - if (!height) 1052 - return 0; 1053 - 1054 - switch (color_fmt) { 1055 - case COLOR_FMT_NV12_UBWC: 1056 - uv_tile_height = 8; 1057 - break; 1058 - case COLOR_FMT_NV12_BPP10_UBWC: 1059 - case COLOR_FMT_P010_UBWC: 1060 - uv_tile_height = 4; 1061 - break; 1062 - default: 1063 - return 0; 1064 - } 1065 - 1066 - uv_meta_scanlines = MSM_MEDIA_ROUNDUP((height+1)>>1, uv_tile_height); 1067 - return MSM_MEDIA_ALIGN(uv_meta_scanlines, 16); 1068 - } 1069 - 1070 - static unsigned int VENUS_RGB_STRIDE(int color_fmt, int width) 1071 - { 1072 - unsigned int alignment = 0, bpp = 4; 1073 - 1074 - if (!width) 1075 - return 0; 1076 - 1077 - switch (color_fmt) { 1078 - case COLOR_FMT_RGBA8888: 1079 - alignment = 128; 1080 - break; 1081 - case COLOR_FMT_RGB565_UBWC: 1082 - alignment = 256; 1083 - bpp = 2; 1084 - break; 1085 - case COLOR_FMT_RGBA8888_UBWC: 1086 - case COLOR_FMT_RGBA1010102_UBWC: 1087 - alignment = 256; 1088 - break; 1089 - default: 1090 - return 0; 1091 - } 1092 - 1093 - return MSM_MEDIA_ALIGN(width * bpp, alignment); 1094 - } 1095 - 1096 - static unsigned int VENUS_RGB_SCANLINES(int color_fmt, int height) 1097 - { 1098 - unsigned int alignment = 0; 1099 - 1100 - if (!height) 1101 - return 0; 1102 - 1103 - switch (color_fmt) { 1104 - case COLOR_FMT_RGBA8888: 1105 - alignment = 32; 1106 - break; 1107 - case COLOR_FMT_RGBA8888_UBWC: 1108 - case COLOR_FMT_RGBA1010102_UBWC: 1109 - case COLOR_FMT_RGB565_UBWC: 1110 - alignment = 16; 1111 - break; 1112 - default: 1113 - return 0; 1114 - } 1115 - 1116 - return MSM_MEDIA_ALIGN(height, alignment); 1117 - } 1118 - 1119 - static unsigned int VENUS_RGB_META_STRIDE(int color_fmt, int width) 1120 - { 1121 - int rgb_meta_stride; 1122 - 1123 - if (!width) 1124 - return 0; 1125 - 1126 - switch (color_fmt) { 1127 - case COLOR_FMT_RGBA8888_UBWC: 1128 - case COLOR_FMT_RGBA1010102_UBWC: 1129 - case COLOR_FMT_RGB565_UBWC: 1130 - rgb_meta_stride = MSM_MEDIA_ROUNDUP(width, 16); 1131 - return MSM_MEDIA_ALIGN(rgb_meta_stride, 64); 1132 - } 1133 - 1134 - return 0; 1135 - } 1136 - 1137 - static unsigned int VENUS_RGB_META_SCANLINES(int color_fmt, int height) 1138 - { 1139 - int rgb_meta_scanlines; 1140 - 1141 - if (!height) 1142 - return 0; 1143 - 1144 - switch (color_fmt) { 1145 - case COLOR_FMT_RGBA8888_UBWC: 1146 - case COLOR_FMT_RGBA1010102_UBWC: 1147 - case COLOR_FMT_RGB565_UBWC: 1148 - rgb_meta_scanlines = MSM_MEDIA_ROUNDUP(height, 4); 1149 - return MSM_MEDIA_ALIGN(rgb_meta_scanlines, 16); 1150 - } 1151 - 1152 - return 0; 1153 - } 1154 - 1155 - #endif