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 1156