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 static inline unsigned int VENUS_EXTRADATA_SIZE(int width, int height) 817 { 818 (void)height; 819 (void)width; 820 821 /* 822 * In the future, calculate the size based on the w/h but just 823 * hardcode it for now since 16K satisfies all current usecases. 824 */ 825 return 16 * 1024; 826 } 827 828 /* 829 * Function arguments: 830 * @color_fmt 831 * @width 832 * Progressive: width 833 * Interlaced: width 834 */ 835 static inline unsigned int VENUS_Y_STRIDE(int color_fmt, int width) 836 { 837 unsigned int alignment, stride = 0; 838 839 if (!width) 840 goto invalid_input; 841 842 switch (color_fmt) { 843 case COLOR_FMT_NV21: 844 case COLOR_FMT_NV12: 845 case COLOR_FMT_NV12_MVTB: 846 case COLOR_FMT_NV12_UBWC: 847 alignment = 128; 848 stride = MSM_MEDIA_ALIGN(width, alignment); 849 break; 850 case COLOR_FMT_NV12_BPP10_UBWC: 851 alignment = 256; 852 stride = MSM_MEDIA_ALIGN(width, 192); 853 stride = MSM_MEDIA_ALIGN(stride * 4/3, alignment); 854 break; 855 case COLOR_FMT_P010_UBWC: 856 alignment = 256; 857 stride = MSM_MEDIA_ALIGN(width * 2, alignment); 858 break; 859 case COLOR_FMT_P010: 860 alignment = 128; 861 stride = MSM_MEDIA_ALIGN(width*2, alignment); 862 break; 863 default: 864 break; 865 } 866 invalid_input: 867 return stride; 868 } 869 870 /* 871 * Function arguments: 872 * @color_fmt 873 * @width 874 * Progressive: width 875 * Interlaced: width 876 */ 877 static inline unsigned int VENUS_UV_STRIDE(int color_fmt, int width) 878 { 879 unsigned int alignment, stride = 0; 880 881 if (!width) 882 goto invalid_input; 883 884 switch (color_fmt) { 885 case COLOR_FMT_NV21: 886 case COLOR_FMT_NV12: 887 case COLOR_FMT_NV12_MVTB: 888 case COLOR_FMT_NV12_UBWC: 889 alignment = 128; 890 stride = MSM_MEDIA_ALIGN(width, alignment); 891 break; 892 case COLOR_FMT_NV12_BPP10_UBWC: 893 alignment = 256; 894 stride = MSM_MEDIA_ALIGN(width, 192); 895 stride = MSM_MEDIA_ALIGN(stride * 4/3, alignment); 896 break; 897 case COLOR_FMT_P010_UBWC: 898 alignment = 256; 899 stride = MSM_MEDIA_ALIGN(width * 2, alignment); 900 break; 901 case COLOR_FMT_P010: 902 alignment = 128; 903 stride = MSM_MEDIA_ALIGN(width*2, alignment); 904 break; 905 default: 906 break; 907 } 908 invalid_input: 909 return stride; 910 } 911 912 /* 913 * Function arguments: 914 * @color_fmt 915 * @height 916 * Progressive: height 917 * Interlaced: (height+1)>>1 918 */ 919 static inline unsigned int VENUS_Y_SCANLINES(int color_fmt, int height) 920 { 921 unsigned int alignment, sclines = 0; 922 923 if (!height) 924 goto invalid_input; 925 926 switch (color_fmt) { 927 case COLOR_FMT_NV21: 928 case COLOR_FMT_NV12: 929 case COLOR_FMT_NV12_MVTB: 930 case COLOR_FMT_NV12_UBWC: 931 case COLOR_FMT_P010: 932 alignment = 32; 933 break; 934 case COLOR_FMT_NV12_BPP10_UBWC: 935 case COLOR_FMT_P010_UBWC: 936 alignment = 16; 937 break; 938 default: 939 return 0; 940 } 941 sclines = MSM_MEDIA_ALIGN(height, alignment); 942 invalid_input: 943 return sclines; 944 } 945 946 /* 947 * Function arguments: 948 * @color_fmt 949 * @height 950 * Progressive: height 951 * Interlaced: (height+1)>>1 952 */ 953 static inline unsigned int VENUS_UV_SCANLINES(int color_fmt, int height) 954 { 955 unsigned int alignment, sclines = 0; 956 957 if (!height) 958 goto invalid_input; 959 960 switch (color_fmt) { 961 case COLOR_FMT_NV21: 962 case COLOR_FMT_NV12: 963 case COLOR_FMT_NV12_MVTB: 964 case COLOR_FMT_NV12_BPP10_UBWC: 965 case COLOR_FMT_P010_UBWC: 966 case COLOR_FMT_P010: 967 alignment = 16; 968 break; 969 case COLOR_FMT_NV12_UBWC: 970 alignment = 32; 971 break; 972 default: 973 goto invalid_input; 974 } 975 976 sclines = MSM_MEDIA_ALIGN((height+1)>>1, alignment); 977 978 invalid_input: 979 return sclines; 980 } 981 982 /* 983 * Function arguments: 984 * @color_fmt 985 * @width 986 * Progressive: width 987 * Interlaced: width 988 */ 989 static inline unsigned int VENUS_Y_META_STRIDE(int color_fmt, int width) 990 { 991 int y_tile_width = 0, y_meta_stride = 0; 992 993 if (!width) 994 goto invalid_input; 995 996 switch (color_fmt) { 997 case COLOR_FMT_NV12_UBWC: 998 case COLOR_FMT_P010_UBWC: 999 y_tile_width = 32; 1000 break; 1001 case COLOR_FMT_NV12_BPP10_UBWC: 1002 y_tile_width = 48; 1003 break; 1004 default: 1005 goto invalid_input; 1006 } 1007 1008 y_meta_stride = MSM_MEDIA_ROUNDUP(width, y_tile_width); 1009 y_meta_stride = MSM_MEDIA_ALIGN(y_meta_stride, 64); 1010 1011 invalid_input: 1012 return y_meta_stride; 1013 } 1014 1015 /* 1016 * Function arguments: 1017 * @color_fmt 1018 * @height 1019 * Progressive: height 1020 * Interlaced: (height+1)>>1 1021 */ 1022 static inline unsigned int VENUS_Y_META_SCANLINES(int color_fmt, int height) 1023 { 1024 int y_tile_height = 0, y_meta_scanlines = 0; 1025 1026 if (!height) 1027 goto invalid_input; 1028 1029 switch (color_fmt) { 1030 case COLOR_FMT_NV12_UBWC: 1031 y_tile_height = 8; 1032 break; 1033 case COLOR_FMT_NV12_BPP10_UBWC: 1034 case COLOR_FMT_P010_UBWC: 1035 y_tile_height = 4; 1036 break; 1037 default: 1038 goto invalid_input; 1039 } 1040 1041 y_meta_scanlines = MSM_MEDIA_ROUNDUP(height, y_tile_height); 1042 y_meta_scanlines = MSM_MEDIA_ALIGN(y_meta_scanlines, 16); 1043 1044 invalid_input: 1045 return y_meta_scanlines; 1046 } 1047 1048 /* 1049 * Function arguments: 1050 * @color_fmt 1051 * @width 1052 * Progressive: width 1053 * Interlaced: width 1054 */ 1055 static inline unsigned int VENUS_UV_META_STRIDE(int color_fmt, int width) 1056 { 1057 int uv_tile_width = 0, uv_meta_stride = 0; 1058 1059 if (!width) 1060 goto invalid_input; 1061 1062 switch (color_fmt) { 1063 case COLOR_FMT_NV12_UBWC: 1064 case COLOR_FMT_P010_UBWC: 1065 uv_tile_width = 16; 1066 break; 1067 case COLOR_FMT_NV12_BPP10_UBWC: 1068 uv_tile_width = 24; 1069 break; 1070 default: 1071 goto invalid_input; 1072 } 1073 1074 uv_meta_stride = MSM_MEDIA_ROUNDUP((width+1)>>1, uv_tile_width); 1075 uv_meta_stride = MSM_MEDIA_ALIGN(uv_meta_stride, 64); 1076 1077 invalid_input: 1078 return uv_meta_stride; 1079 } 1080 1081 /* 1082 * Function arguments: 1083 * @color_fmt 1084 * @height 1085 * Progressive: height 1086 * Interlaced: (height+1)>>1 1087 */ 1088 static inline unsigned int VENUS_UV_META_SCANLINES(int color_fmt, int height) 1089 { 1090 int uv_tile_height = 0, uv_meta_scanlines = 0; 1091 1092 if (!height) 1093 goto invalid_input; 1094 1095 switch (color_fmt) { 1096 case COLOR_FMT_NV12_UBWC: 1097 uv_tile_height = 8; 1098 break; 1099 case COLOR_FMT_NV12_BPP10_UBWC: 1100 case COLOR_FMT_P010_UBWC: 1101 uv_tile_height = 4; 1102 break; 1103 default: 1104 goto invalid_input; 1105 } 1106 1107 uv_meta_scanlines = MSM_MEDIA_ROUNDUP((height+1)>>1, uv_tile_height); 1108 uv_meta_scanlines = MSM_MEDIA_ALIGN(uv_meta_scanlines, 16); 1109 1110 invalid_input: 1111 return uv_meta_scanlines; 1112 } 1113 1114 static inline unsigned int VENUS_RGB_STRIDE(int color_fmt, int width) 1115 { 1116 unsigned int alignment = 0, stride = 0, bpp = 4; 1117 1118 if (!width) 1119 goto invalid_input; 1120 1121 switch (color_fmt) { 1122 case COLOR_FMT_RGBA8888: 1123 alignment = 128; 1124 break; 1125 case COLOR_FMT_RGB565_UBWC: 1126 alignment = 256; 1127 bpp = 2; 1128 break; 1129 case COLOR_FMT_RGBA8888_UBWC: 1130 case COLOR_FMT_RGBA1010102_UBWC: 1131 alignment = 256; 1132 break; 1133 default: 1134 goto invalid_input; 1135 } 1136 1137 stride = MSM_MEDIA_ALIGN(width * bpp, alignment); 1138 1139 invalid_input: 1140 return stride; 1141 } 1142 1143 static inline unsigned int VENUS_RGB_SCANLINES(int color_fmt, int height) 1144 { 1145 unsigned int alignment = 0, scanlines = 0; 1146 1147 if (!height) 1148 goto invalid_input; 1149 1150 switch (color_fmt) { 1151 case COLOR_FMT_RGBA8888: 1152 alignment = 32; 1153 break; 1154 case COLOR_FMT_RGBA8888_UBWC: 1155 case COLOR_FMT_RGBA1010102_UBWC: 1156 case COLOR_FMT_RGB565_UBWC: 1157 alignment = 16; 1158 break; 1159 default: 1160 goto invalid_input; 1161 } 1162 1163 scanlines = MSM_MEDIA_ALIGN(height, alignment); 1164 1165 invalid_input: 1166 return scanlines; 1167 } 1168 1169 static inline unsigned int VENUS_RGB_META_STRIDE(int color_fmt, int width) 1170 { 1171 int rgb_tile_width = 0, rgb_meta_stride = 0; 1172 1173 if (!width) 1174 goto invalid_input; 1175 1176 switch (color_fmt) { 1177 case COLOR_FMT_RGBA8888_UBWC: 1178 case COLOR_FMT_RGBA1010102_UBWC: 1179 case COLOR_FMT_RGB565_UBWC: 1180 rgb_tile_width = 16; 1181 break; 1182 default: 1183 goto invalid_input; 1184 } 1185 1186 rgb_meta_stride = MSM_MEDIA_ROUNDUP(width, rgb_tile_width); 1187 rgb_meta_stride = MSM_MEDIA_ALIGN(rgb_meta_stride, 64); 1188 1189 invalid_input: 1190 return rgb_meta_stride; 1191 } 1192 1193 static inline unsigned int VENUS_RGB_META_SCANLINES(int color_fmt, int height) 1194 { 1195 int rgb_tile_height = 0, rgb_meta_scanlines = 0; 1196 1197 if (!height) 1198 goto invalid_input; 1199 1200 switch (color_fmt) { 1201 case COLOR_FMT_RGBA8888_UBWC: 1202 case COLOR_FMT_RGBA1010102_UBWC: 1203 case COLOR_FMT_RGB565_UBWC: 1204 rgb_tile_height = 4; 1205 break; 1206 default: 1207 goto invalid_input; 1208 } 1209 1210 rgb_meta_scanlines = MSM_MEDIA_ROUNDUP(height, rgb_tile_height); 1211 rgb_meta_scanlines = MSM_MEDIA_ALIGN(rgb_meta_scanlines, 16); 1212 1213 invalid_input: 1214 return rgb_meta_scanlines; 1215 } 1216 1217 /* 1218 * Function arguments: 1219 * @color_fmt 1220 * @width 1221 * Progressive: width 1222 * Interlaced: width 1223 * @height 1224 * Progressive: height 1225 * Interlaced: height 1226 */ 1227 static inline unsigned int VENUS_BUFFER_SIZE( 1228 int color_fmt, int width, int height) 1229 { 1230 const unsigned int extra_size = VENUS_EXTRADATA_SIZE(width, height); 1231 unsigned int uv_alignment = 0, size = 0; 1232 unsigned int y_plane, uv_plane, y_stride, 1233 uv_stride, y_sclines, uv_sclines; 1234 unsigned int y_ubwc_plane = 0, uv_ubwc_plane = 0; 1235 unsigned int y_meta_stride = 0, y_meta_scanlines = 0; 1236 unsigned int uv_meta_stride = 0, uv_meta_scanlines = 0; 1237 unsigned int y_meta_plane = 0, uv_meta_plane = 0; 1238 unsigned int rgb_stride = 0, rgb_scanlines = 0; 1239 unsigned int rgb_plane = 0, rgb_ubwc_plane = 0, rgb_meta_plane = 0; 1240 unsigned int rgb_meta_stride = 0, rgb_meta_scanlines = 0; 1241 1242 if (!width || !height) 1243 goto invalid_input; 1244 1245 y_stride = VENUS_Y_STRIDE(color_fmt, width); 1246 uv_stride = VENUS_UV_STRIDE(color_fmt, width); 1247 y_sclines = VENUS_Y_SCANLINES(color_fmt, height); 1248 uv_sclines = VENUS_UV_SCANLINES(color_fmt, height); 1249 rgb_stride = VENUS_RGB_STRIDE(color_fmt, width); 1250 rgb_scanlines = VENUS_RGB_SCANLINES(color_fmt, height); 1251 1252 switch (color_fmt) { 1253 case COLOR_FMT_NV21: 1254 case COLOR_FMT_NV12: 1255 case COLOR_FMT_P010: 1256 uv_alignment = 4096; 1257 y_plane = y_stride * y_sclines; 1258 uv_plane = uv_stride * uv_sclines + uv_alignment; 1259 size = y_plane + uv_plane + 1260 MSM_MEDIA_MAX(extra_size, 8 * y_stride); 1261 size = MSM_MEDIA_ALIGN(size, 4096); 1262 break; 1263 case COLOR_FMT_NV12_MVTB: 1264 uv_alignment = 4096; 1265 y_plane = y_stride * y_sclines; 1266 uv_plane = uv_stride * uv_sclines + uv_alignment; 1267 size = y_plane + uv_plane; 1268 size = 2 * size + extra_size; 1269 size = MSM_MEDIA_ALIGN(size, 4096); 1270 break; 1271 case COLOR_FMT_NV12_UBWC: 1272 y_sclines = VENUS_Y_SCANLINES(color_fmt, (height+1)>>1); 1273 y_ubwc_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096); 1274 uv_sclines = VENUS_UV_SCANLINES(color_fmt, (height+1)>>1); 1275 uv_ubwc_plane = MSM_MEDIA_ALIGN(uv_stride * uv_sclines, 4096); 1276 y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width); 1277 y_meta_scanlines = 1278 VENUS_Y_META_SCANLINES(color_fmt, (height+1)>>1); 1279 y_meta_plane = MSM_MEDIA_ALIGN( 1280 y_meta_stride * y_meta_scanlines, 4096); 1281 uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width); 1282 uv_meta_scanlines = 1283 VENUS_UV_META_SCANLINES(color_fmt, (height+1)>>1); 1284 uv_meta_plane = MSM_MEDIA_ALIGN(uv_meta_stride * 1285 uv_meta_scanlines, 4096); 1286 1287 size = (y_ubwc_plane + uv_ubwc_plane + y_meta_plane + 1288 uv_meta_plane)*2 + 1289 MSM_MEDIA_MAX(extra_size + 8192, 48 * y_stride); 1290 size = MSM_MEDIA_ALIGN(size, 4096); 1291 break; 1292 case COLOR_FMT_NV12_BPP10_UBWC: 1293 y_ubwc_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096); 1294 uv_ubwc_plane = MSM_MEDIA_ALIGN(uv_stride * uv_sclines, 4096); 1295 y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width); 1296 y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height); 1297 y_meta_plane = MSM_MEDIA_ALIGN( 1298 y_meta_stride * y_meta_scanlines, 4096); 1299 uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width); 1300 uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height); 1301 uv_meta_plane = MSM_MEDIA_ALIGN(uv_meta_stride * 1302 uv_meta_scanlines, 4096); 1303 1304 size = y_ubwc_plane + uv_ubwc_plane + y_meta_plane + 1305 uv_meta_plane + 1306 MSM_MEDIA_MAX(extra_size + 8192, 48 * y_stride); 1307 size = MSM_MEDIA_ALIGN(size, 4096); 1308 break; 1309 case COLOR_FMT_P010_UBWC: 1310 y_ubwc_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096); 1311 uv_ubwc_plane = MSM_MEDIA_ALIGN(uv_stride * uv_sclines, 4096); 1312 y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width); 1313 y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height); 1314 y_meta_plane = MSM_MEDIA_ALIGN( 1315 y_meta_stride * y_meta_scanlines, 4096); 1316 uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width); 1317 uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height); 1318 uv_meta_plane = MSM_MEDIA_ALIGN(uv_meta_stride * 1319 uv_meta_scanlines, 4096); 1320 1321 size = y_ubwc_plane + uv_ubwc_plane + y_meta_plane + 1322 uv_meta_plane; 1323 size = MSM_MEDIA_ALIGN(size, 4096); 1324 break; 1325 case COLOR_FMT_RGBA8888: 1326 rgb_plane = MSM_MEDIA_ALIGN(rgb_stride * rgb_scanlines, 4096); 1327 size = rgb_plane; 1328 size = MSM_MEDIA_ALIGN(size, 4096); 1329 break; 1330 case COLOR_FMT_RGBA8888_UBWC: 1331 case COLOR_FMT_RGBA1010102_UBWC: 1332 case COLOR_FMT_RGB565_UBWC: 1333 rgb_ubwc_plane = MSM_MEDIA_ALIGN(rgb_stride * rgb_scanlines, 1334 4096); 1335 rgb_meta_stride = VENUS_RGB_META_STRIDE(color_fmt, width); 1336 rgb_meta_scanlines = VENUS_RGB_META_SCANLINES(color_fmt, 1337 height); 1338 rgb_meta_plane = MSM_MEDIA_ALIGN(rgb_meta_stride * 1339 rgb_meta_scanlines, 4096); 1340 size = rgb_ubwc_plane + rgb_meta_plane; 1341 size = MSM_MEDIA_ALIGN(size, 4096); 1342 break; 1343 default: 1344 break; 1345 } 1346 invalid_input: 1347 return size; 1348 } 1349 1350 static inline unsigned int VENUS_VIEW2_OFFSET( 1351 int color_fmt, int width, int height) 1352 { 1353 unsigned int offset = 0; 1354 unsigned int y_plane, uv_plane, y_stride, 1355 uv_stride, y_sclines, uv_sclines; 1356 if (!width || !height) 1357 goto invalid_input; 1358 1359 y_stride = VENUS_Y_STRIDE(color_fmt, width); 1360 uv_stride = VENUS_UV_STRIDE(color_fmt, width); 1361 y_sclines = VENUS_Y_SCANLINES(color_fmt, height); 1362 uv_sclines = VENUS_UV_SCANLINES(color_fmt, height); 1363 switch (color_fmt) { 1364 case COLOR_FMT_NV12_MVTB: 1365 y_plane = y_stride * y_sclines; 1366 uv_plane = uv_stride * uv_sclines; 1367 offset = y_plane + uv_plane; 1368 break; 1369 default: 1370 break; 1371 } 1372 invalid_input: 1373 return offset; 1374 } 1375 1376 #endif 1377