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 */
VENUS_Y_STRIDE(int color_fmt,int width)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 */
VENUS_UV_STRIDE(int color_fmt,int width)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 */
VENUS_Y_SCANLINES(int color_fmt,int height)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 */
VENUS_UV_SCANLINES(int color_fmt,int height)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 */
VENUS_Y_META_STRIDE(int color_fmt,int width)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 */
VENUS_Y_META_SCANLINES(int color_fmt,int height)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 */
VENUS_UV_META_STRIDE(int color_fmt,int width)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 */
VENUS_UV_META_SCANLINES(int color_fmt,int height)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
VENUS_RGB_STRIDE(int color_fmt,int width)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
VENUS_RGB_SCANLINES(int color_fmt,int height)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
VENUS_RGB_META_STRIDE(int color_fmt,int width)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
VENUS_RGB_META_SCANLINES(int color_fmt,int height)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