1afffc5c552f1fbe209bf0563c651bb75ffd1670
[platform/upstream/libva-intel-driver.git] / src / i965_post_processing.h
1 /*
2  * Copyright © 2010 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sub license, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the
13  * next paragraph) shall be included in all copies or substantial portions
14  * of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  *
24  * Authors:
25  *    Xiang Haihao <haihao.xiang@intel.com>
26  *
27  */
28
29 #ifndef __I965_POST_PROCESSING_H__
30 #define __I965_POST_PROCESSING_H__
31
32 #define MAX_PP_SURFACES 48
33
34 #define I965_PP_FLAG_TOP_FIELD          1
35 #define I965_PP_FLAG_BOTTOM_FIELD       2
36 #define I965_PP_FLAG_MCDI               4
37 #define I965_PP_FLAG_AVS                8
38
39 enum
40 {
41     PP_NULL = 0,
42     PP_NV12_LOAD_SAVE_N12,
43     PP_NV12_LOAD_SAVE_PL3,
44     PP_PL3_LOAD_SAVE_N12,
45     PP_PL3_LOAD_SAVE_PL3,
46     PP_NV12_SCALING,
47     PP_NV12_AVS,
48     PP_NV12_DNDI,
49     PP_NV12_DN,
50     PP_NV12_LOAD_SAVE_PA,
51     PP_PL3_LOAD_SAVE_PA,
52     PP_PA_LOAD_SAVE_NV12,
53     PP_PA_LOAD_SAVE_PL3,
54     PP_RGBX_LOAD_SAVE_NV12,
55     PP_NV12_LOAD_SAVE_RGBX,
56     NUM_PP_MODULES,
57 };
58
59 struct i965_post_processing_context;
60
61 struct pp_load_save_context
62 {
63     int dest_w;
64     int dest_h;
65 };
66
67 struct pp_scaling_context
68 {
69     int dest_x; /* in pixel */
70     int dest_y; /* in pixel */
71     int dest_w;
72     int dest_h;
73     float src_normalized_x;
74     float src_normalized_y;
75 };
76
77 struct pp_avs_context
78 {
79     int dest_x; /* in pixel */
80     int dest_y; /* in pixel */
81     int dest_w;
82     int dest_h;
83     float src_normalized_x;
84     float src_normalized_y;
85     int src_w;
86     int src_h;
87 };
88
89 struct pp_dndi_context
90 {
91     int dest_w;
92     int dest_h;
93 };
94
95 struct pp_dn_context
96 {
97     int dest_w;
98     int dest_h;
99 };
100
101 struct pp_module
102 {
103     struct i965_kernel kernel;
104     
105     /* others */
106     VAStatus (*initialize)(VADriverContextP ctx, struct i965_post_processing_context *pp_context,
107                            const struct i965_surface *src_surface,
108                            const VARectangle *src_rect,
109                            struct i965_surface *dst_surface,
110                            const VARectangle *dst_rect,
111                            void *filter_param);
112 };
113
114 struct pp_static_parameter
115 {
116     struct {
117         /* Procamp r1.0 */
118         float procamp_constant_c0;
119         
120         /* Load and Same r1.1 */
121         unsigned int source_packed_y_offset:8;
122         unsigned int source_packed_u_offset:8;
123         unsigned int source_packed_v_offset:8;
124         unsigned int source_rgb_layout:8;       // 1 for |R|G|B|X| layout, 0 for |B|G|R|X| layout
125
126         union {
127             /* Load and Save r1.2 */
128             struct {
129                 unsigned int destination_packed_y_offset:8;
130                 unsigned int destination_packed_u_offset:8;
131                 unsigned int destination_packed_v_offset:8;
132                 unsigned int pad0:8;
133             } load_and_save;
134
135             /* CSC r1.2 */
136             struct {
137                 unsigned int pad0:24;
138                 unsigned int destination_rgb_layout:8;  // 1 for |R|G|B|X| layout, 0 for |B|G|R|X| layout
139             } csc;
140         } r1_2;
141         
142         /* Procamp r1.3 */
143         float procamp_constant_c1;
144
145         /* Procamp r1.4 */
146         float procamp_constant_c2;
147
148         /* DI r1.5 */
149         unsigned int statistics_surface_picth:16;  /* Devided by 2 */
150         unsigned int pad1:16;
151
152         union {
153             /* DI r1.6 */
154             struct {
155                 unsigned int pad0:24;
156                 unsigned int top_field_first:8;
157             } di;
158
159             /* AVS/Scaling r1.6 */
160             float normalized_video_y_scaling_step;
161         } r1_6;
162
163         /* Procamp r1.7 */
164         float procamp_constant_c5;
165     } grf1;
166     
167     struct {
168         /* Procamp r2.0 */
169         float procamp_constant_c3;
170
171         /* MBZ r2.1*/
172         unsigned int pad0;
173
174         /* WG+CSC r2.2 */
175         float wg_csc_constant_c4;
176
177         /* WG+CSC r2.3 */
178         float wg_csc_constant_c8;
179
180         /* Procamp r2.4 */
181         float procamp_constant_c4;
182
183         /* MBZ r2.5 */
184         unsigned int pad1;
185
186         /* MBZ r2.6 */
187         unsigned int pad2;
188
189         /* WG+CSC r2.7 */
190         float wg_csc_constant_c9;
191     } grf2;
192
193     struct {
194         /* WG+CSC r3.0 */
195         float wg_csc_constant_c0;
196
197         /* Blending r3.1 */
198         float scaling_step_ratio;
199
200         /* Blending r3.2 */
201         float normalized_alpha_y_scaling;
202         
203         /* WG+CSC r3.3 */
204         float wg_csc_constant_c4;
205
206         /* WG+CSC r3.4 */
207         float wg_csc_constant_c1;
208
209         /* ALL r3.5 */
210         int horizontal_origin_offset:16;
211         int vertical_origin_offset:16;
212
213         /* Shared r3.6*/
214         union {
215             /* Color filll */
216             unsigned int color_pixel;
217
218             /* WG+CSC */
219             float wg_csc_constant_c2;
220         } r3_6;
221
222         /* WG+CSC r3.7 */
223         float wg_csc_constant_c3;
224     } grf3;
225
226     struct {
227         /* WG+CSC r4.0 */
228         float wg_csc_constant_c6;
229
230         /* ALL r4.1 MBZ ???*/
231         unsigned int pad0;
232
233         /* Shared r4.2 */
234         union {
235             /* AVS */
236             struct {
237                 unsigned int pad1:15;
238                 unsigned int nlas:1;
239                 unsigned int pad2:16;
240             } avs;
241
242             /* DI */
243             struct {
244                 unsigned int motion_history_coefficient_m2:8;
245                 unsigned int motion_history_coefficient_m1:8;
246                 unsigned int pad0:16;
247             } di;
248         } r4_2;
249
250         /* WG+CSC r4.3 */
251         float wg_csc_constant_c7;
252
253         /* WG+CSC r4.4 */
254         float wg_csc_constant_c10;
255
256         /* AVS r4.5 */
257         float source_video_frame_normalized_horizontal_origin;
258
259         /* MBZ r4.6 */
260         unsigned int pad1;
261
262         /* WG+CSC r4.7 */
263         float wg_csc_constant_c11;
264     } grf4;
265 };
266
267 struct pp_inline_parameter
268 {
269     struct {
270         /* ALL r5.0 */
271         int destination_block_horizontal_origin:16;
272         int destination_block_vertical_origin:16;
273
274         /* Shared r5.1 */
275         union {
276             /* AVS/Scaling */
277             float source_surface_block_normalized_horizontal_origin;
278
279             /* FMD */
280             struct {
281                 unsigned int variance_surface_vertical_origin:16;
282                 unsigned int pad0:16;
283             } fmd;
284         } r5_1; 
285
286         /* AVS/Scaling r5.2 */
287         float source_surface_block_normalized_vertical_origin;
288
289         /* Alpha r5.3 */
290         float alpha_surface_block_normalized_horizontal_origin;
291
292         /* Alpha r5.4 */
293         float alpha_surface_block_normalized_vertical_origin;
294
295         /* Alpha r5.5 */
296         unsigned int alpha_mask_x:16;
297         unsigned int alpha_mask_y:8;
298         unsigned int block_count_x:8;
299
300         /* r5.6 */
301         /* we only support M*1 or 1*N block partitation now.
302          *   -- it means asm code only need update this mask from grf6 for the last block 
303          */
304         unsigned int block_horizontal_mask:16;
305         unsigned int block_vertical_mask:8;
306         unsigned int number_blocks:8;
307
308         /* AVS/Scaling r5.7 */
309         float normalized_video_x_scaling_step;
310     } grf5;
311
312     struct {
313         /* AVS r6.0 */
314         float video_step_delta;
315
316         /* r6.1 */
317         unsigned int block_horizontal_mask:16;
318         unsigned int block_vertical_mask:8;
319         unsigned int pad:8;
320
321         /* r6.2-r6.7 */
322         unsigned int padx[6];
323     } grf6;
324 };
325
326 struct gen7_pp_static_parameter
327 {
328     struct {
329         /* r1.0-r1.5 */
330         unsigned int padx[6];
331         /* r1.6 */
332         unsigned int di_statistics_surface_pitch_div2:16;
333         unsigned int di_statistics_surface_height_div4:16;
334         /* r1.7 */
335         unsigned int di_top_field_first:8;
336         unsigned int pad0:16;
337         unsigned int pointer_to_inline_parameter:8; /* value: 7 */
338     } grf1;
339
340     struct {
341         /* r2.0 */
342         unsigned int pad3;
343
344         /* r2.1 */
345         unsigned int pad2:16;
346         unsigned int save_avs_rgb_swap:1; /* 0: RGB, 1: BGR */
347         unsigned int avs_wa_enable:1; /* must enabled for GEN7 */
348         unsigned int pad1:1;
349         unsigned int avs_wa_width:13;
350
351         /* 2.2 */
352         float avs_wa_one_div_256_width;
353
354         /* 2.3 */
355         float avs_wa_five_div_256_width;
356         
357         /* 2.4 - 2.6 */
358         unsigned int padx[3];
359
360         /* r2.7 */
361         unsigned int di_destination_packed_y_component_offset:8;
362         unsigned int di_destination_packed_u_component_offset:8;
363         unsigned int di_destination_packed_v_component_offset:8;
364         unsigned int pad0:8;
365     } grf2;
366
367     struct {
368         float sampler_load_horizontal_scaling_step_ratio;
369         unsigned int padx[7];
370     } grf3;
371
372     struct {
373         float sampler_load_vertical_scaling_step;
374         unsigned int pad0;
375         unsigned int di_hoffset_svf_from_dvf:16;
376         unsigned int di_voffset_svf_from_dvf:16;
377         unsigned int padx[5];
378     } grf4;
379
380     struct {
381         float sampler_load_vertical_frame_origin;
382         unsigned int padx[7];
383     } grf5;
384
385     struct {
386         float sampler_load_horizontal_frame_origin;
387         unsigned int padx[7];
388     } grf6;
389 };
390
391 struct gen7_pp_inline_parameter
392 {
393     struct {
394         /* r7.0 */
395         unsigned int destination_block_horizontal_origin:16;
396         unsigned int destination_block_vertical_origin:16;
397         /* r7.1: 0xffffffff */
398         unsigned int constant_0;
399         /* r7.2 */
400         unsigned int pad0;
401         /* r7.3 */
402         unsigned int pad1;
403         /* r7.4 */
404         float sampler_load_main_video_x_scaling_step;
405         /* r7.5 */
406         unsigned int pad2;
407         /* r7.6: must be zero */
408         unsigned int avs_vertical_block_number;
409         /* r7.7: 0 */
410         unsigned int group_id_number;
411     } grf7;
412
413     struct {
414         unsigned int padx[8];
415     } grf8;
416 };
417
418 struct i965_post_processing_context
419 {
420     int current_pp;
421     struct pp_module pp_modules[NUM_PP_MODULES];
422     void *pp_static_parameter;
423     void *pp_inline_parameter;
424
425     struct {
426         dri_bo *bo;
427     } surface_state_binding_table;
428
429     struct {
430         dri_bo *bo;
431     } curbe;
432
433     struct {
434         dri_bo *bo;
435         int num_interface_descriptors;
436     } idrt;
437
438     struct {
439         dri_bo *bo;
440     } vfe_state;
441
442     struct {
443         dri_bo *bo;
444         dri_bo *bo_8x8;
445         dri_bo *bo_8x8_uv;
446     } sampler_state_table;
447
448     struct {
449         unsigned int size;
450
451         unsigned int vfe_start;
452         unsigned int cs_start;
453
454         unsigned int num_vfe_entries;
455         unsigned int num_cs_entries;
456
457         unsigned int size_vfe_entry;
458         unsigned int size_cs_entry;
459     } urb;
460
461     struct {
462         dri_bo *bo;
463     } stmm;
464
465     union {
466         struct pp_load_save_context pp_load_save_context;
467         struct pp_scaling_context pp_scaling_context;
468         struct pp_avs_context pp_avs_context;
469         struct pp_dndi_context pp_dndi_context;
470         struct pp_dn_context pp_dn_context;
471     } private_context;
472
473     int (*pp_x_steps)(void *private_context);
474     int (*pp_y_steps)(void *private_context);
475     int (*pp_set_block_parameter)(struct i965_post_processing_context *pp_context, int x, int y);
476
477     struct intel_batchbuffer *batch;
478
479     unsigned int block_horizontal_mask:16;
480     unsigned int block_vertical_mask:8;
481 };
482
483 struct i965_proc_context
484 {
485     struct hw_context base;
486     struct i965_post_processing_context pp_context;
487 };
488
489 VASurfaceID
490 i965_post_processing(
491     VADriverContextP   ctx,
492     VASurfaceID        surface,
493     const VARectangle *src_rect,
494     const VARectangle *dst_rect,
495     unsigned int       flags,
496     int                *has_done_scaling 
497 );
498
499 VAStatus
500 i965_image_processing(VADriverContextP ctx,
501                       const struct i965_surface *src_surface,
502                       const VARectangle *src_rect,
503                       struct i965_surface *dst_surface,
504                       const VARectangle *dst_rect);
505
506 Bool
507 i965_post_processing_terminate(VADriverContextP ctx);
508 Bool
509 i965_post_processing_init(VADriverContextP ctx);
510
511 #endif /* __I965_POST_PROCESSING_H__ */