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 /* Venus NV12 UBWC:
154 * Compressed Macro-tile format for NV12.
155 * Contains 4 planes in the following order -
156 * (A) Y_Meta_Plane
157 * (B) Y_UBWC_Plane
158 * (C) UV_Meta_Plane
159 * (D) UV_UBWC_Plane
160 *
161 * Y_Meta_Plane consists of meta information to decode compressed
162 * tile data in Y_UBWC_Plane.
163 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
164 * UBWC decoder block will use the Y_Meta_Plane data together with
165 * Y_UBWC_Plane data to produce loss-less uncompressed 8 bit Y samples.
166 *
167 * UV_Meta_Plane consists of meta information to decode compressed
168 * tile data in UV_UBWC_Plane.
169 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
170 * UBWC decoder block will use UV_Meta_Plane data together with
171 * UV_UBWC_Plane data to produce loss-less uncompressed 8 bit 2x2
172 * subsampled color difference samples.
173 *
174 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
175 * and randomly accessible. There is no dependency between tiles.
176 *
177 * <----- Y_Meta_Stride ---->
178 * <-------- Width ------>
179 * M M M M M M M M M M M M . . ^ ^
180 * M M M M M M M M M M M M . . | |
181 * M M M M M M M M M M M M . . Height |
182 * M M M M M M M M M M M M . . | Meta_Y_Scanlines
183 * M M M M M M M M M M M M . . | |
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 . . V |
187 * . . . . . . . . . . . . . . |
188 * . . . . . . . . . . . . . . |
189 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
190 * . . . . . . . . . . . . . . V
191 * <--Compressed tile Y Stride--->
192 * <------- Width ------->
193 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^
194 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
195 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Height |
196 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_Scanlines
197 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
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* . . . . V |
201 * . . . . . . . . . . . . . . . . |
202 * . . . . . . . . . . . . . . . . |
203 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
204 * . . . . . . . . . . . . . . . . V
205 * <----- UV_Meta_Stride ---->
206 * M M M M M M M M M M M M . . ^
207 * M M M M M M M M M M M M . . |
208 * M M M M M M M M M M M M . . |
209 * M M M M M M M M M M M M . . M_UV_Scanlines
210 * . . . . . . . . . . . . . . |
211 * . . . . . . . . . . . . . . V
212 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
213 * <--Compressed tile UV Stride--->
214 * U* V* U* V* U* V* U* V* . . . . ^
215 * U* V* U* V* U* V* U* V* . . . . |
216 * U* V* U* V* U* V* U* V* . . . . |
217 * U* V* U* V* U* V* U* V* . . . . UV_Scanlines
218 * . . . . . . . . . . . . . . . . |
219 * . . . . . . . . . . . . . . . . V
220 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
221 *
222 * Y_Stride = align(Width, 128)
223 * UV_Stride = align(Width, 128)
224 * Y_Scanlines = align(Height, 32)
225 * UV_Scanlines = align(Height/2, 16)
226 * Y_UBWC_Plane_size = align(Y_Stride * Y_Scanlines, 4096)
227 * UV_UBWC_Plane_size = align(UV_Stride * UV_Scanlines, 4096)
228 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
229 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
230 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
231 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
232 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
233 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
234 * Extradata = 16k
235 *
236 * Total size = align( Y_UBWC_Plane_size + UV_UBWC_Plane_size +
237 * Y_Meta_Plane_size + UV_Meta_Plane_size
238 * + max(Extradata, Y_Stride * 64), 4096)
239 */
240 COLOR_FMT_NV12_UBWC,
241 /* Venus NV12 10-bit UBWC:
242 * Compressed Macro-tile format for NV12.
243 * Contains 4 planes in the following order -
244 * (A) Y_Meta_Plane
245 * (B) Y_UBWC_Plane
246 * (C) UV_Meta_Plane
247 * (D) UV_UBWC_Plane
248 *
249 * Y_Meta_Plane consists of meta information to decode compressed
250 * tile data in Y_UBWC_Plane.
251 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
252 * UBWC decoder block will use the Y_Meta_Plane data together with
253 * Y_UBWC_Plane data to produce loss-less uncompressed 10 bit Y samples.
254 *
255 * UV_Meta_Plane consists of meta information to decode compressed
256 * tile data in UV_UBWC_Plane.
257 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
258 * UBWC decoder block will use UV_Meta_Plane data together with
259 * UV_UBWC_Plane data to produce loss-less uncompressed 10 bit 2x2
260 * subsampled color difference samples.
261 *
262 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
263 * and randomly accessible. There is no dependency between tiles.
264 *
265 * <----- Y_Meta_Stride ----->
266 * <-------- Width ------>
267 * M M M M M M M M M M M M . . ^ ^
268 * M M M M M M M M M M M M . . | |
269 * M M M M M M M M M M M M . . Height |
270 * M M M M M M M M M M M M . . | Meta_Y_Scanlines
271 * M M M M M M M M M M M M . . | |
272 * M M M M M M M M M M M M . . | |
273 * M M M M M M M M M M M M . . | |
274 * M M M M M M M M M M M M . . V |
275 * . . . . . . . . . . . . . . |
276 * . . . . . . . . . . . . . . |
277 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
278 * . . . . . . . . . . . . . . V
279 * <--Compressed tile Y Stride--->
280 * <------- Width ------->
281 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^
282 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
283 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Height |
284 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_Scanlines
285 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
286 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
287 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
288 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V |
289 * . . . . . . . . . . . . . . . . |
290 * . . . . . . . . . . . . . . . . |
291 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
292 * . . . . . . . . . . . . . . . . V
293 * <----- UV_Meta_Stride ---->
294 * M M M M M M M M M M M M . . ^
295 * M M M M M M M M M M M M . . |
296 * M M M M M M M M M M M M . . |
297 * M M M M M M M M M M M M . . M_UV_Scanlines
298 * . . . . . . . . . . . . . . |
299 * . . . . . . . . . . . . . . V
300 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
301 * <--Compressed tile UV Stride--->
302 * U* V* U* V* U* V* U* V* . . . . ^
303 * U* V* U* V* U* V* U* V* . . . . |
304 * U* V* U* V* U* V* U* V* . . . . |
305 * U* V* U* V* U* V* U* V* . . . . UV_Scanlines
306 * . . . . . . . . . . . . . . . . |
307 * . . . . . . . . . . . . . . . . V
308 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
309 *
310 *
311 * Y_Stride = align(Width * 4/3, 128)
312 * UV_Stride = align(Width * 4/3, 128)
313 * Y_Scanlines = align(Height, 32)
314 * UV_Scanlines = align(Height/2, 16)
315 * Y_UBWC_Plane_Size = align(Y_Stride * Y_Scanlines, 4096)
316 * UV_UBWC_Plane_Size = align(UV_Stride * UV_Scanlines, 4096)
317 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
318 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
319 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
320 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
321 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
322 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
323 * Extradata = 16k
324 *
325 * Total size = align(Y_UBWC_Plane_size + UV_UBWC_Plane_size +
326 * Y_Meta_Plane_size + UV_Meta_Plane_size
327 * + max(Extradata, Y_Stride * 64), 4096)
328 */
329 COLOR_FMT_NV12_BPP10_UBWC,
330 /* Venus RGBA8888 format:
331 * Contains 1 plane in the following order -
332 * (A) RGBA plane
333 *
334 * <-------- RGB_Stride -------->
335 * <------- Width ------->
336 * R R R R R R R R R R R R . . . . ^ ^
337 * R R R R R R R R R R R R . . . . | |
338 * R R R R R R R R R R R R . . . . Height |
339 * R R R R R R R R R R R R . . . . | RGB_Scanlines
340 * R R R R R R R R R R R R . . . . | |
341 * R R R R R R R R R R R R . . . . | |
342 * R R R R R R R R R R R R . . . . | |
343 * R R R R R R R R R R R R . . . . V |
344 * . . . . . . . . . . . . . . . . |
345 * . . . . . . . . . . . . . . . . |
346 * . . . . . . . . . . . . . . . . |
347 * . . . . . . . . . . . . . . . . V
348 *
349 * RGB_Stride = align(Width * 4, 128)
350 * RGB_Scanlines = align(Height, 32)
351 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
352 * Extradata = 8k
353 *
354 * Total size = align(RGB_Plane_size + Extradata, 4096)
355 */
356 COLOR_FMT_RGBA8888,
357 /* Venus RGBA8888 UBWC format:
358 * Contains 2 planes in the following order -
359 * (A) Meta plane
360 * (B) RGBA plane
361 *
362 * <--- RGB_Meta_Stride ---->
363 * <-------- Width ------>
364 * M M M M M M M M M M M M . . ^ ^
365 * M M M M M M M M M M M M . . | |
366 * M M M M M M M M M M M M . . Height |
367 * M M M M M M M M M M M M . . | Meta_RGB_Scanlines
368 * M M M M M M M M M M M M . . | |
369 * M M M M M M M M M M M M . . | |
370 * M M M M M M M M M M M M . . | |
371 * M M M M M M M M M M M M . . V |
372 * . . . . . . . . . . . . . . |
373 * . . . . . . . . . . . . . . |
374 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
375 * . . . . . . . . . . . . . . V
376 * <-------- RGB_Stride -------->
377 * <------- Width ------->
378 * R R R R R R R R R R R R . . . . ^ ^
379 * R R R R R R R R R R R R . . . . | |
380 * R R R R R R R R R R R R . . . . Height |
381 * R R R R R R R R R R R R . . . . | RGB_Scanlines
382 * R R R R R R R R R R R R . . . . | |
383 * R R R R R R R R R R R R . . . . | |
384 * R R R R R R R R R R R R . . . . | |
385 * R R R R R R R R R R R R . . . . V |
386 * . . . . . . . . . . . . . . . . |
387 * . . . . . . . . . . . . . . . . |
388 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
389 * . . . . . . . . . . . . . . . . V
390 *
391 * RGB_Stride = align(Width * 4, 128)
392 * RGB_Scanlines = align(Height, 32)
393 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
394 * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64)
395 * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16)
396 * RGB_Meta_Plane_size = align(RGB_Meta_Stride *
397 * RGB_Meta_Scanlines, 4096)
398 * Extradata = 8k
399 *
400 * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size +
401 * Extradata, 4096)
402 */
403 COLOR_FMT_RGBA8888_UBWC,
404 /* Venus RGBA1010102 UBWC format:
405 * Contains 2 planes in the following order -
406 * (A) Meta plane
407 * (B) RGBA plane
408 *
409 * <--- RGB_Meta_Stride ---->
410 * <-------- Width ------>
411 * M M M M M M M M M M M M . . ^ ^
412 * M M M M M M M M M M M M . . | |
413 * M M M M M M M M M M M M . . Height |
414 * M M M M M M M M M M M M . . | Meta_RGB_Scanlines
415 * M M M M M M M M M M M M . . | |
416 * M M M M M M M M M M M M . . | |
417 * M M M M M M M M M M M M . . | |
418 * M M M M M M M M M M M M . . V |
419 * . . . . . . . . . . . . . . |
420 * . . . . . . . . . . . . . . |
421 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
422 * . . . . . . . . . . . . . . V
423 * <-------- RGB_Stride -------->
424 * <------- Width ------->
425 * R R R R R R R R R R R R . . . . ^ ^
426 * R R R R R R R R R R R R . . . . | |
427 * R R R R R R R R R R R R . . . . Height |
428 * R R R R R R R R R R R R . . . . | RGB_Scanlines
429 * R R R R R R R R R R R R . . . . | |
430 * R R R R R R R R R R R R . . . . | |
431 * R R R R R R R R R R R R . . . . | |
432 * R R R R R R R R R R R R . . . . V |
433 * . . . . . . . . . . . . . . . . |
434 * . . . . . . . . . . . . . . . . |
435 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
436 * . . . . . . . . . . . . . . . . V
437 *
438 * RGB_Stride = align(Width * 4, 256)
439 * RGB_Scanlines = align(Height, 16)
440 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
441 * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64)
442 * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16)
443 * RGB_Meta_Plane_size = align(RGB_Meta_Stride *
444 * RGB_Meta_Scanlines, 4096)
445 * Extradata = 8k
446 *
447 * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size +
448 * Extradata, 4096)
449 */
450 COLOR_FMT_RGBA1010102_UBWC,
451 /* Venus RGB565 UBWC format:
452 * Contains 2 planes in the following order -
453 * (A) Meta plane
454 * (B) RGB plane
455 *
456 * <--- RGB_Meta_Stride ---->
457 * <-------- Width ------>
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 . . | |
460 * M M M M M M M M M M M M . . Height |
461 * M M M M M M M M M M M M . . | Meta_RGB_Scanlines
462 * M M M M M M M M M M M M . . | |
463 * M M M M M M M M M M M M . . | |
464 * M M M M M M M M M M M M . . | |
465 * M M M M M M M M M M M M . . V |
466 * . . . . . . . . . . . . . . |
467 * . . . . . . . . . . . . . . |
468 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
469 * . . . . . . . . . . . . . . V
470 * <-------- RGB_Stride -------->
471 * <------- Width ------->
472 * R R R R R R R R R R R R . . . . ^ ^
473 * R R R R R R R R R R R R . . . . | |
474 * R R R R R R R R R R R R . . . . Height |
475 * R R R R R R R R R R R R . . . . | RGB_Scanlines
476 * R R R R R R R R R R R R . . . . | |
477 * R R R R R R R R R R R R . . . . | |
478 * R R R R R R R R R R R R . . . . | |
479 * R R R R R R R R R R R R . . . . V |
480 * . . . . . . . . . . . . . . . . |
481 * . . . . . . . . . . . . . . . . |
482 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
483 * . . . . . . . . . . . . . . . . V
484 *
485 * RGB_Stride = align(Width * 2, 128)
486 * RGB_Scanlines = align(Height, 16)
487 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
488 * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64)
489 * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16)
490 * RGB_Meta_Plane_size = align(RGB_Meta_Stride *
491 * RGB_Meta_Scanlines, 4096)
492 * Extradata = 8k
493 *
494 * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size +
495 * Extradata, 4096)
496 */
497 COLOR_FMT_RGB565_UBWC,
498 /* P010 UBWC:
499 * Compressed Macro-tile format for NV12.
500 * Contains 4 planes in the following order -
501 * (A) Y_Meta_Plane
502 * (B) Y_UBWC_Plane
503 * (C) UV_Meta_Plane
504 * (D) UV_UBWC_Plane
505 *
506 * Y_Meta_Plane consists of meta information to decode compressed
507 * tile data in Y_UBWC_Plane.
508 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
509 * UBWC decoder block will use the Y_Meta_Plane data together with
510 * Y_UBWC_Plane data to produce loss-less uncompressed 10 bit Y samples.
511 *
512 * UV_Meta_Plane consists of meta information to decode compressed
513 * tile data in UV_UBWC_Plane.
514 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
515 * UBWC decoder block will use UV_Meta_Plane data together with
516 * UV_UBWC_Plane data to produce loss-less uncompressed 10 bit 2x2
517 * subsampled color difference samples.
518 *
519 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
520 * and randomly accessible. There is no dependency between tiles.
521 *
522 * <----- Y_Meta_Stride ----->
523 * <-------- Width ------>
524 * M M M M M M M M M M M M . . ^ ^
525 * M M M M M M M M M M M M . . | |
526 * M M M M M M M M M M M M . . Height |
527 * M M M M M M M M M M M M . . | Meta_Y_Scanlines
528 * M M M M M M M M M M M M . . | |
529 * M M M M M M M M M M M M . . | |
530 * M M M M M M M M M M M M . . | |
531 * M M M M M M M M M M M M . . V |
532 * . . . . . . . . . . . . . . |
533 * . . . . . . . . . . . . . . |
534 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
535 * . . . . . . . . . . . . . . V
536 * <--Compressed tile Y Stride--->
537 * <------- Width ------->
538 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^
539 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
540 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Height |
541 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_Scanlines
542 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
543 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
544 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
545 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V |
546 * . . . . . . . . . . . . . . . . |
547 * . . . . . . . . . . . . . . . . |
548 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
549 * . . . . . . . . . . . . . . . . V
550 * <----- UV_Meta_Stride ---->
551 * M M M M M M M M M M M M . . ^
552 * M M M M M M M M M M M M . . |
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 . . M_UV_Scanlines
555 * . . . . . . . . . . . . . . |
556 * . . . . . . . . . . . . . . V
557 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
558 * <--Compressed tile UV Stride--->
559 * U* V* U* V* U* V* U* V* . . . . ^
560 * U* V* U* V* U* V* U* V* . . . . |
561 * U* V* U* V* U* V* U* V* . . . . |
562 * U* V* U* V* U* V* U* V* . . . . UV_Scanlines
563 * . . . . . . . . . . . . . . . . |
564 * . . . . . . . . . . . . . . . . V
565 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
566 *
567 *
568 * Y_Stride = align(Width * 2, 256)
569 * UV_Stride = align(Width * 2, 256)
570 * Y_Scanlines = align(Height, 16)
571 * UV_Scanlines = align(Height/2, 16)
572 * Y_UBWC_Plane_Size = align(Y_Stride * Y_Scanlines, 4096)
573 * UV_UBWC_Plane_Size = align(UV_Stride * UV_Scanlines, 4096)
574 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
575 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
576 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
577 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
578 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
579 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
580 * Extradata = 8k
581 *
582 * Total size = align(Y_UBWC_Plane_size + UV_UBWC_Plane_size +
583 * Y_Meta_Plane_size + UV_Meta_Plane_size
584 * + max(Extradata, Y_Stride * 48), 4096)
585 */
586 COLOR_FMT_P010_UBWC,
587 };
588
589 #define COLOR_FMT_RGBA1010102_UBWC COLOR_FMT_RGBA1010102_UBWC
590 #define COLOR_FMT_RGB565_UBWC COLOR_FMT_RGB565_UBWC
591 #define COLOR_FMT_P010_UBWC COLOR_FMT_P010_UBWC
592
VENUS_EXTRADATA_SIZE(int width,int height)593 static __inline__ unsigned int VENUS_EXTRADATA_SIZE(int width, int height)
594 {
595 (void)height;
596 (void)width;
597
598 /*
599 * In the future, calculate the size based on the w/h but just
600 * hardcode it for now since 16K satisfies all current usecases.
601 */
602 return 16 * 1024;
603 }
604
VENUS_Y_STRIDE(int color_fmt,int width)605 static __inline__ unsigned int VENUS_Y_STRIDE(int color_fmt, int width)
606 {
607 unsigned int alignment, stride = 0;
608
609 if (!width)
610 goto invalid_input;
611
612 switch (color_fmt) {
613 case COLOR_FMT_NV21:
614 case COLOR_FMT_NV12:
615 case COLOR_FMT_NV12_MVTB:
616 case COLOR_FMT_NV12_UBWC:
617 alignment = 128;
618 stride = MSM_MEDIA_ALIGN(width, alignment);
619 break;
620 case COLOR_FMT_NV12_BPP10_UBWC:
621 alignment = 256;
622 stride = MSM_MEDIA_ALIGN(width, 192);
623 stride = MSM_MEDIA_ALIGN(stride * 4/3, alignment);
624 break;
625 case COLOR_FMT_P010_UBWC:
626 alignment = 256;
627 stride = MSM_MEDIA_ALIGN(width * 2, alignment);
628 break;
629 default:
630 break;
631 }
632 invalid_input:
633 return stride;
634 }
635
VENUS_UV_STRIDE(int color_fmt,int width)636 static __inline__ unsigned int VENUS_UV_STRIDE(int color_fmt, int width)
637 {
638 unsigned int alignment, stride = 0;
639
640 if (!width)
641 goto invalid_input;
642
643 switch (color_fmt) {
644 case COLOR_FMT_NV21:
645 case COLOR_FMT_NV12:
646 case COLOR_FMT_NV12_MVTB:
647 case COLOR_FMT_NV12_UBWC:
648 alignment = 128;
649 stride = MSM_MEDIA_ALIGN(width, alignment);
650 break;
651 case COLOR_FMT_NV12_BPP10_UBWC:
652 alignment = 256;
653 stride = MSM_MEDIA_ALIGN(width, 192);
654 stride = MSM_MEDIA_ALIGN(stride * 4/3, alignment);
655 break;
656 case COLOR_FMT_P010_UBWC:
657 alignment = 256;
658 stride = MSM_MEDIA_ALIGN(width * 2, alignment);
659 break;
660 default:
661 break;
662 }
663 invalid_input:
664 return stride;
665 }
666
VENUS_Y_SCANLINES(int color_fmt,int height)667 static __inline__ unsigned int VENUS_Y_SCANLINES(int color_fmt, int height)
668 {
669 unsigned int alignment, sclines = 0;
670
671 if (!height)
672 goto invalid_input;
673
674 switch (color_fmt) {
675 case COLOR_FMT_NV21:
676 case COLOR_FMT_NV12:
677 case COLOR_FMT_NV12_MVTB:
678 case COLOR_FMT_NV12_UBWC:
679 alignment = 32;
680 break;
681 case COLOR_FMT_NV12_BPP10_UBWC:
682 case COLOR_FMT_P010_UBWC:
683 alignment = 16;
684 break;
685 default:
686 return 0;
687 }
688 sclines = MSM_MEDIA_ALIGN(height, alignment);
689 invalid_input:
690 return sclines;
691 }
692
VENUS_UV_SCANLINES(int color_fmt,int height)693 static __inline__ unsigned int VENUS_UV_SCANLINES(int color_fmt, int height)
694 {
695 unsigned int alignment, sclines = 0;
696
697 if (!height)
698 goto invalid_input;
699
700 switch (color_fmt) {
701 case COLOR_FMT_NV21:
702 case COLOR_FMT_NV12:
703 case COLOR_FMT_NV12_MVTB:
704 case COLOR_FMT_NV12_BPP10_UBWC:
705 case COLOR_FMT_P010_UBWC:
706 alignment = 16;
707 break;
708 case COLOR_FMT_NV12_UBWC:
709 alignment = 32;
710 break;
711 default:
712 goto invalid_input;
713 }
714
715 sclines = MSM_MEDIA_ALIGN(height / 2, alignment);
716
717 invalid_input:
718 return sclines;
719 }
720
VENUS_Y_META_STRIDE(int color_fmt,int width)721 static __inline__ unsigned int VENUS_Y_META_STRIDE(int color_fmt, int width)
722 {
723 int y_tile_width = 0, y_meta_stride = 0;
724
725 if (!width)
726 goto invalid_input;
727
728 switch (color_fmt) {
729 case COLOR_FMT_NV12_UBWC:
730 case COLOR_FMT_P010_UBWC:
731 y_tile_width = 32;
732 break;
733 case COLOR_FMT_NV12_BPP10_UBWC:
734 y_tile_width = 48;
735 break;
736 default:
737 goto invalid_input;
738 }
739
740 y_meta_stride = MSM_MEDIA_ROUNDUP(width, y_tile_width);
741 y_meta_stride = MSM_MEDIA_ALIGN(y_meta_stride, 64);
742
743 invalid_input:
744 return y_meta_stride;
745 }
746
VENUS_Y_META_SCANLINES(int color_fmt,int height)747 static __inline__ unsigned int VENUS_Y_META_SCANLINES(int color_fmt, int height)
748 {
749 int y_tile_height = 0, y_meta_scanlines = 0;
750
751 if (!height)
752 goto invalid_input;
753
754 switch (color_fmt) {
755 case COLOR_FMT_NV12_UBWC:
756 y_tile_height = 8;
757 break;
758 case COLOR_FMT_NV12_BPP10_UBWC:
759 case COLOR_FMT_P010_UBWC:
760 y_tile_height = 4;
761 break;
762 default:
763 goto invalid_input;
764 }
765
766 y_meta_scanlines = MSM_MEDIA_ROUNDUP(height, y_tile_height);
767 y_meta_scanlines = MSM_MEDIA_ALIGN(y_meta_scanlines, 16);
768
769 invalid_input:
770 return y_meta_scanlines;
771 }
772
VENUS_UV_META_STRIDE(int color_fmt,int width)773 static __inline__ unsigned int VENUS_UV_META_STRIDE(int color_fmt, int width)
774 {
775 int uv_tile_width = 0, uv_meta_stride = 0;
776
777 if (!width)
778 goto invalid_input;
779
780 switch (color_fmt) {
781 case COLOR_FMT_NV12_UBWC:
782 case COLOR_FMT_P010_UBWC:
783 uv_tile_width = 16;
784 break;
785 case COLOR_FMT_NV12_BPP10_UBWC:
786 uv_tile_width = 24;
787 break;
788 default:
789 goto invalid_input;
790 }
791
792 uv_meta_stride = MSM_MEDIA_ROUNDUP(width / 2, uv_tile_width);
793 uv_meta_stride = MSM_MEDIA_ALIGN(uv_meta_stride, 64);
794
795 invalid_input:
796 return uv_meta_stride;
797 }
798
VENUS_UV_META_SCANLINES(int color_fmt,int height)799 static __inline__ unsigned int VENUS_UV_META_SCANLINES(int color_fmt, int height)
800 {
801 int uv_tile_height = 0, uv_meta_scanlines = 0;
802
803 if (!height)
804 goto invalid_input;
805
806 switch (color_fmt) {
807 case COLOR_FMT_NV12_UBWC:
808 uv_tile_height = 8;
809 break;
810 case COLOR_FMT_NV12_BPP10_UBWC:
811 case COLOR_FMT_P010_UBWC:
812 uv_tile_height = 4;
813 break;
814 default:
815 goto invalid_input;
816 }
817
818 uv_meta_scanlines = MSM_MEDIA_ROUNDUP(height / 2, uv_tile_height);
819 uv_meta_scanlines = MSM_MEDIA_ALIGN(uv_meta_scanlines, 16);
820
821 invalid_input:
822 return uv_meta_scanlines;
823 }
824
VENUS_RGB_STRIDE(int color_fmt,int width)825 static __inline__ unsigned int VENUS_RGB_STRIDE(int color_fmt, int width)
826 {
827 unsigned int alignment = 0, stride = 0, bpp = 4;
828
829 if (!width)
830 goto invalid_input;
831
832 switch (color_fmt) {
833 case COLOR_FMT_RGBA8888:
834 alignment = 128;
835 break;
836 case COLOR_FMT_RGB565_UBWC:
837 alignment = 128;
838 bpp = 2;
839 break;
840 case COLOR_FMT_RGBA8888_UBWC:
841 case COLOR_FMT_RGBA1010102_UBWC:
842 alignment = 256;
843 break;
844 default:
845 goto invalid_input;
846 }
847
848 stride = MSM_MEDIA_ALIGN(width * bpp, alignment);
849
850 invalid_input:
851 return stride;
852 }
853
VENUS_RGB_SCANLINES(int color_fmt,int height)854 static __inline__ unsigned int VENUS_RGB_SCANLINES(int color_fmt, int height)
855 {
856 unsigned int alignment = 0, scanlines = 0;
857
858 if (!height)
859 goto invalid_input;
860
861 switch (color_fmt) {
862 case COLOR_FMT_RGBA8888:
863 alignment = 32;
864 break;
865 case COLOR_FMT_RGBA8888_UBWC:
866 case COLOR_FMT_RGBA1010102_UBWC:
867 case COLOR_FMT_RGB565_UBWC:
868 alignment = 16;
869 break;
870 default:
871 goto invalid_input;
872 }
873
874 scanlines = MSM_MEDIA_ALIGN(height, alignment);
875
876 invalid_input:
877 return scanlines;
878 }
879
VENUS_RGB_META_STRIDE(int color_fmt,int width)880 static __inline__ unsigned int VENUS_RGB_META_STRIDE(int color_fmt, int width)
881 {
882 int rgb_tile_width = 0, rgb_meta_stride = 0;
883
884 if (!width)
885 goto invalid_input;
886
887 switch (color_fmt) {
888 case COLOR_FMT_RGBA8888_UBWC:
889 case COLOR_FMT_RGBA1010102_UBWC:
890 case COLOR_FMT_RGB565_UBWC:
891 rgb_tile_width = 16;
892 break;
893 default:
894 goto invalid_input;
895 }
896
897 rgb_meta_stride = MSM_MEDIA_ROUNDUP(width, rgb_tile_width);
898 rgb_meta_stride = MSM_MEDIA_ALIGN(rgb_meta_stride, 64);
899
900 invalid_input:
901 return rgb_meta_stride;
902 }
903
VENUS_RGB_META_SCANLINES(int color_fmt,int height)904 static __inline__ unsigned int VENUS_RGB_META_SCANLINES(int color_fmt, int height)
905 {
906 int rgb_tile_height = 0, rgb_meta_scanlines = 0;
907
908 if (!height)
909 goto invalid_input;
910
911 switch (color_fmt) {
912 case COLOR_FMT_RGBA8888_UBWC:
913 case COLOR_FMT_RGBA1010102_UBWC:
914 case COLOR_FMT_RGB565_UBWC:
915 rgb_tile_height = 4;
916 break;
917 default:
918 goto invalid_input;
919 }
920
921 rgb_meta_scanlines = MSM_MEDIA_ROUNDUP(height, rgb_tile_height);
922 rgb_meta_scanlines = MSM_MEDIA_ALIGN(rgb_meta_scanlines, 16);
923
924 invalid_input:
925 return rgb_meta_scanlines;
926 }
927
VENUS_BUFFER_SIZE(int color_fmt,int width,int height)928 static __inline__ unsigned int VENUS_BUFFER_SIZE(
929 int color_fmt, int width, int height)
930 {
931 const unsigned int extra_size = VENUS_EXTRADATA_SIZE(width, height);
932 unsigned int uv_alignment = 0, size = 0;
933 unsigned int y_plane, uv_plane, y_stride,
934 uv_stride, y_sclines, uv_sclines;
935 unsigned int y_ubwc_plane = 0, uv_ubwc_plane = 0;
936 unsigned int y_meta_stride = 0, y_meta_scanlines = 0;
937 unsigned int uv_meta_stride = 0, uv_meta_scanlines = 0;
938 unsigned int y_meta_plane = 0, uv_meta_plane = 0;
939 unsigned int rgb_stride = 0, rgb_scanlines = 0;
940 unsigned int rgb_plane = 0, rgb_ubwc_plane = 0, rgb_meta_plane = 0;
941 unsigned int rgb_meta_stride = 0, rgb_meta_scanlines = 0;
942
943 if (!width || !height)
944 goto invalid_input;
945
946 y_stride = VENUS_Y_STRIDE(color_fmt, width);
947 uv_stride = VENUS_UV_STRIDE(color_fmt, width);
948 y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
949 uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
950 rgb_stride = VENUS_RGB_STRIDE(color_fmt, width);
951 rgb_scanlines = VENUS_RGB_SCANLINES(color_fmt, height);
952
953 switch (color_fmt) {
954 case COLOR_FMT_NV21:
955 case COLOR_FMT_NV12:
956 uv_alignment = 4096;
957 y_plane = y_stride * y_sclines;
958 uv_plane = uv_stride * uv_sclines + uv_alignment;
959 size = y_plane + uv_plane +
960 MSM_MEDIA_MAX(extra_size, 8 * y_stride);
961 size = MSM_MEDIA_ALIGN(size, 4096);
962 break;
963 case COLOR_FMT_NV12_MVTB:
964 uv_alignment = 4096;
965 y_plane = y_stride * y_sclines;
966 uv_plane = uv_stride * uv_sclines + uv_alignment;
967 size = y_plane + uv_plane;
968 size = 2 * size + extra_size;
969 size = MSM_MEDIA_ALIGN(size, 4096);
970 break;
971 case COLOR_FMT_NV12_UBWC:
972 case COLOR_FMT_NV12_BPP10_UBWC:
973 y_ubwc_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
974 uv_ubwc_plane = MSM_MEDIA_ALIGN(uv_stride * uv_sclines, 4096);
975 y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
976 y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height);
977 y_meta_plane = MSM_MEDIA_ALIGN(
978 y_meta_stride * y_meta_scanlines, 4096);
979 uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
980 uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height);
981 uv_meta_plane = MSM_MEDIA_ALIGN(uv_meta_stride *
982 uv_meta_scanlines, 4096);
983
984 size = y_ubwc_plane + uv_ubwc_plane + y_meta_plane +
985 uv_meta_plane + MSM_MEDIA_MAX(extra_size,
986 64 * y_stride);
987 size = MSM_MEDIA_ALIGN(size, 4096);
988 break;
989 case COLOR_FMT_P010_UBWC:
990 y_ubwc_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
991 uv_ubwc_plane = MSM_MEDIA_ALIGN(uv_stride * uv_sclines, 4096);
992 y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
993 y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height);
994 y_meta_plane = MSM_MEDIA_ALIGN(
995 y_meta_stride * y_meta_scanlines, 4096);
996 uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
997 uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height);
998 uv_meta_plane = MSM_MEDIA_ALIGN(uv_meta_stride *
999 uv_meta_scanlines, 4096);
1000
1001 size = y_ubwc_plane + uv_ubwc_plane + y_meta_plane +
1002 uv_meta_plane;
1003 size = MSM_MEDIA_ALIGN(size, 4096);
1004 break;
1005 case COLOR_FMT_RGBA8888:
1006 rgb_plane = MSM_MEDIA_ALIGN(rgb_stride * rgb_scanlines, 4096);
1007 size = rgb_plane;
1008 size = MSM_MEDIA_ALIGN(size, 4096);
1009 break;
1010 case COLOR_FMT_RGBA8888_UBWC:
1011 rgb_ubwc_plane = MSM_MEDIA_ALIGN(rgb_stride * rgb_scanlines,
1012 4096);
1013 rgb_meta_stride = VENUS_RGB_META_STRIDE(color_fmt, width);
1014 rgb_meta_scanlines = VENUS_RGB_META_SCANLINES(color_fmt,
1015 height);
1016 rgb_meta_plane = MSM_MEDIA_ALIGN(rgb_meta_stride *
1017 rgb_meta_scanlines, 4096);
1018 size = rgb_ubwc_plane + rgb_meta_plane;
1019 size = MSM_MEDIA_ALIGN(size, 4096);
1020 break;
1021 default:
1022 break;
1023 }
1024 invalid_input:
1025 return size;
1026 }
1027
VENUS_VIEW2_OFFSET(int color_fmt,int width,int height)1028 static __inline__ unsigned int VENUS_VIEW2_OFFSET(
1029 int color_fmt, int width, int height)
1030 {
1031 unsigned int offset = 0;
1032 unsigned int y_plane, uv_plane, y_stride,
1033 uv_stride, y_sclines, uv_sclines;
1034 if (!width || !height)
1035 goto invalid_input;
1036
1037 y_stride = VENUS_Y_STRIDE(color_fmt, width);
1038 uv_stride = VENUS_UV_STRIDE(color_fmt, width);
1039 y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
1040 uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
1041 switch (color_fmt) {
1042 case COLOR_FMT_NV12_MVTB:
1043 y_plane = y_stride * y_sclines;
1044 uv_plane = uv_stride * uv_sclines;
1045 offset = y_plane + uv_plane;
1046 break;
1047 default:
1048 break;
1049 }
1050 invalid_input:
1051 return offset;
1052 }
1053
1054 #endif
1055