Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5361 serge 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 
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_PA_LOAD_SAVE_PA,
55
    PP_RGBX_LOAD_SAVE_NV12,
56
    PP_NV12_LOAD_SAVE_RGBX,
57
    NUM_PP_MODULES,
58
};
59
 
60
struct i965_post_processing_context;
61
 
62
struct pp_load_save_context
63
{
64
    int dest_x;
65
    int dest_y;
66
    int dest_w;
67
    int dest_h;
68
};
69
 
70
struct pp_scaling_context
71
{
72
    int dest_x; /* in pixel */
73
    int dest_y; /* in pixel */
74
    int dest_w;
75
    int dest_h;
76
    float src_normalized_x;
77
    float src_normalized_y;
78
};
79
 
80
struct pp_avs_context
81
{
82
    int dest_x; /* in pixel */
83
    int dest_y; /* in pixel */
84
    int dest_w;
85
    int dest_h;
86
    float src_normalized_x;
87
    float src_normalized_y;
88
    int src_w;
89
    int src_h;
90
    float horiz_range;
91
};
92
 
93
struct pp_dndi_context
94
{
95
    int dest_w;
96
    int dest_h;
97
    dri_bo *stmm_bo;
98
    int frame_order; /* -1 for the first frame */
99
    VASurfaceID current_out_surface;
100
    struct object_surface *current_out_obj_surface;
101
};
102
 
103
struct pp_dn_context
104
{
105
    int dest_w;
106
    int dest_h;
107
    dri_bo *stmm_bo;
108
};
109
 
110
struct i965_post_processing_context;
111
 
112
struct pp_module
113
{
114
    struct i965_kernel kernel;
115
 
116
    /* others */
117
    VAStatus (*initialize)(VADriverContextP ctx, struct i965_post_processing_context *pp_context,
118
                           const struct i965_surface *src_surface,
119
                           const VARectangle *src_rect,
120
                           struct i965_surface *dst_surface,
121
                           const VARectangle *dst_rect,
122
                           void *filter_param);
123
};
124
 
125
struct pp_static_parameter
126
{
127
    struct {
128
        /* Procamp r1.0 */
129
        float procamp_constant_c0;
130
 
131
        /* Load and Same r1.1 */
132
        unsigned int source_packed_y_offset:8;
133
        unsigned int source_packed_u_offset:8;
134
        unsigned int source_packed_v_offset:8;
135
        unsigned int source_rgb_layout:8;       // 1 for |R|G|B|X| layout, 0 for |B|G|R|X| layout
136
 
137
        union {
138
            /* Load and Save r1.2 */
139
            struct {
140
                unsigned int destination_packed_y_offset:8;
141
                unsigned int destination_packed_u_offset:8;
142
                unsigned int destination_packed_v_offset:8;
143
                unsigned int pad0:8;
144
            } load_and_save;
145
 
146
            /* CSC r1.2 */
147
            struct {
148
                unsigned int pad0:24;
149
                unsigned int destination_rgb_layout:8;  // 1 for |R|G|B|X| layout, 0 for |B|G|R|X| layout
150
            } csc;
151
        } r1_2;
152
 
153
        /* Procamp r1.3 */
154
        float procamp_constant_c1;
155
 
156
        /* Procamp r1.4 */
157
        float procamp_constant_c2;
158
 
159
        /* DI r1.5 */
160
        unsigned int statistics_surface_picth:16;  /* Devided by 2 */
161
        unsigned int pad1:16;
162
 
163
        union {
164
            /* DI r1.6 */
165
            struct {
166
                unsigned int pad0:24;
167
                unsigned int top_field_first:8;
168
            } di;
169
 
170
            /* AVS/Scaling r1.6 */
171
            float normalized_video_y_scaling_step;
172
        } r1_6;
173
 
174
        /* Procamp r1.7 */
175
        float procamp_constant_c5;
176
    } grf1;
177
 
178
    struct {
179
        /* Procamp r2.0 */
180
        float procamp_constant_c3;
181
 
182
        /* MBZ r2.1*/
183
        unsigned int pad0;
184
 
185
        /* WG+CSC r2.2 */
186
        float wg_csc_constant_c4;
187
 
188
        /* WG+CSC r2.3 */
189
        float wg_csc_constant_c8;
190
 
191
        /* Procamp r2.4 */
192
        float procamp_constant_c4;
193
 
194
        /* MBZ r2.5 */
195
        unsigned int pad1;
196
 
197
        /* MBZ r2.6 */
198
        unsigned int pad2;
199
 
200
        /* WG+CSC r2.7 */
201
        float wg_csc_constant_c9;
202
    } grf2;
203
 
204
    struct {
205
        /* WG+CSC r3.0 */
206
        float wg_csc_constant_c0;
207
 
208
        /* Blending r3.1 */
209
        float scaling_step_ratio;
210
 
211
        /* Blending r3.2 */
212
        float normalized_alpha_y_scaling;
213
 
214
        /* WG+CSC r3.3 */
215
        float wg_csc_constant_c4;
216
 
217
        /* WG+CSC r3.4 */
218
        float wg_csc_constant_c1;
219
 
220
        /* ALL r3.5 */
221
        int horizontal_origin_offset:16;
222
        int vertical_origin_offset:16;
223
 
224
        /* Shared r3.6*/
225
        union {
226
            /* Color filll */
227
            unsigned int color_pixel;
228
 
229
            /* WG+CSC */
230
            float wg_csc_constant_c2;
231
        } r3_6;
232
 
233
        /* WG+CSC r3.7 */
234
        float wg_csc_constant_c3;
235
    } grf3;
236
 
237
    struct {
238
        /* WG+CSC r4.0 */
239
        float wg_csc_constant_c6;
240
 
241
        /* ALL r4.1 MBZ ???*/
242
        unsigned int pad0;
243
 
244
        /* Shared r4.2 */
245
        union {
246
            /* AVS */
247
            struct {
248
                unsigned int pad1:15;
249
                unsigned int nlas:1;
250
                unsigned int pad2:16;
251
            } avs;
252
 
253
            /* DI */
254
            struct {
255
                unsigned int motion_history_coefficient_m2:8;
256
                unsigned int motion_history_coefficient_m1:8;
257
                unsigned int pad0:16;
258
            } di;
259
        } r4_2;
260
 
261
        /* WG+CSC r4.3 */
262
        float wg_csc_constant_c7;
263
 
264
        /* WG+CSC r4.4 */
265
        float wg_csc_constant_c10;
266
 
267
        /* AVS r4.5 */
268
        float source_video_frame_normalized_horizontal_origin;
269
 
270
        /* MBZ r4.6 */
271
        unsigned int pad1;
272
 
273
        /* WG+CSC r4.7 */
274
        float wg_csc_constant_c11;
275
    } grf4;
276
};
277
 
278
struct pp_inline_parameter
279
{
280
    struct {
281
        /* ALL r5.0 */
282
        int destination_block_horizontal_origin:16;
283
        int destination_block_vertical_origin:16;
284
 
285
        /* Shared r5.1 */
286
        union {
287
            /* AVS/Scaling */
288
            float source_surface_block_normalized_horizontal_origin;
289
 
290
            /* FMD */
291
            struct {
292
                unsigned int variance_surface_vertical_origin:16;
293
                unsigned int pad0:16;
294
            } fmd;
295
        } r5_1;
296
 
297
        /* AVS/Scaling r5.2 */
298
        float source_surface_block_normalized_vertical_origin;
299
 
300
        /* Alpha r5.3 */
301
        float alpha_surface_block_normalized_horizontal_origin;
302
 
303
        /* Alpha r5.4 */
304
        float alpha_surface_block_normalized_vertical_origin;
305
 
306
        /* Alpha r5.5 */
307
        unsigned int alpha_mask_x:16;
308
        unsigned int alpha_mask_y:8;
309
        unsigned int block_count_x:8;
310
 
311
        /* r5.6 */
312
        /* we only support M*1 or 1*N block partitation now.
313
         *   -- it means asm code only need update this mask from grf6 for the last block
314
         */
315
        unsigned int block_horizontal_mask:16;
316
        unsigned int block_vertical_mask:8;
317
        unsigned int number_blocks:8;
318
 
319
        /* AVS/Scaling r5.7 */
320
        float normalized_video_x_scaling_step;
321
    } grf5;
322
 
323
    struct {
324
        /* AVS r6.0 */
325
        float video_step_delta;
326
 
327
        /* r6.1 */    // sizeof(int) == 4?
328
        unsigned int block_horizontal_mask_right:16;
329
        unsigned int block_vertical_mask_bottom:8;
330
        unsigned int pad1:8;
331
 
332
        /* r6.2 */
333
        unsigned int block_horizontal_mask_middle:16;
334
        unsigned int pad2:16;
335
 
336
        /* r6.3-r6.7 */
337
        unsigned int padx[5];
338
    } grf6;
339
};
340
 
341
struct gen7_pp_static_parameter
342
{
343
    struct {
344
        /* r1.0-r1.5 */
345
        unsigned int padx[6];
346
        /* r1.6 */
347
        unsigned int di_statistics_surface_pitch_div2:16;
348
        unsigned int di_statistics_surface_height_div4:16;
349
        /* r1.7 */
350
        unsigned int di_top_field_first:8;
351
        unsigned int pad0:16;
352
        unsigned int pointer_to_inline_parameter:8; /* value: 7 */
353
    } grf1;
354
 
355
    struct {
356
        /* r2.0 */
357
	/* Indicates whether the rgb is swapped for the src surface
358
	 * 0: RGBX(MSB. X-B-G-R). 1: BGRX(MSB: X-R-G-B)
359
	 */
360
        unsigned int src_avs_rgb_swap:1;
361
        unsigned int pad3:31;
362
 
363
        /* r2.1 */
364
        unsigned int pad2:16;
365
        unsigned int save_avs_rgb_swap:1; /* 0: RGB, 1: BGR */
366
        unsigned int avs_wa_enable:1; /* must enabled for GEN7 */
367
        unsigned int ief_enable:1;
368
        unsigned int avs_wa_width:13;
369
 
370
        /* 2.2 */
371
        float avs_wa_one_div_256_width;
372
 
373
        /* 2.3 */
374
        float avs_wa_five_div_256_width;
375
 
376
        /* 2.4 - 2.6 */
377
        unsigned int padx[3];
378
 
379
        /* r2.7 */
380
        unsigned int di_destination_packed_y_component_offset:8;
381
        unsigned int di_destination_packed_u_component_offset:8;
382
        unsigned int di_destination_packed_v_component_offset:8;
383
        unsigned int alpha:8;
384
    } grf2;
385
 
386
    struct {
387
        float sampler_load_horizontal_scaling_step_ratio;
388
        unsigned int padx[7];
389
    } grf3;
390
 
391
    struct {
392
        float sampler_load_vertical_scaling_step;
393
        unsigned int pad0;
394
        unsigned int di_hoffset_svf_from_dvf:16;
395
        unsigned int di_voffset_svf_from_dvf:16;
396
        unsigned int padx[5];
397
    } grf4;
398
 
399
    struct {
400
        float sampler_load_vertical_frame_origin;
401
        unsigned int padx[7];
402
    } grf5;
403
 
404
    struct {
405
        float sampler_load_horizontal_frame_origin;
406
        unsigned int padx[7];
407
    } grf6;
408
};
409
 
410
struct gen7_pp_inline_parameter
411
{
412
    struct {
413
        /* r7.0 */
414
        unsigned int destination_block_horizontal_origin:16;
415
        unsigned int destination_block_vertical_origin:16;
416
        /* r7.1: 0xffffffff */
417
        unsigned int constant_0;
418
        /* r7.2 */
419
        unsigned int pad0;
420
        /* r7.3 */
421
        unsigned int pad1;
422
        /* r7.4 */
423
        float sampler_load_main_video_x_scaling_step;
424
        /* r7.5 */
425
        unsigned int pad2;
426
        /* r7.6: must be zero */
427
        unsigned int avs_vertical_block_number;
428
        /* r7.7: 0 */
429
        unsigned int group_id_number;
430
    } grf7;
431
 
432
    struct {
433
        unsigned int padx[8];
434
    } grf8;
435
};
436
 
437
struct i965_post_processing_context
438
{
439
    int current_pp;
440
    struct pp_module pp_modules[NUM_PP_MODULES];
441
    void *pp_static_parameter;
442
    void *pp_inline_parameter;
443
 
444
    struct {
445
        dri_bo *bo;
446
    } surface_state_binding_table;
447
 
448
    struct {
449
        dri_bo *bo;
450
    } curbe;
451
 
452
    struct {
453
        dri_bo *bo;
454
        int num_interface_descriptors;
455
    } idrt;
456
 
457
    struct {
458
        dri_bo *bo;
459
    } vfe_state;
460
 
461
    struct {
462
        dri_bo *bo;
463
        dri_bo *bo_8x8;
464
        dri_bo *bo_8x8_uv;
465
    } sampler_state_table;
466
 
467
    struct {
468
        unsigned int size;
469
 
470
        unsigned int vfe_start;
471
        unsigned int cs_start;
472
 
473
        unsigned int num_vfe_entries;
474
        unsigned int num_cs_entries;
475
 
476
        unsigned int size_vfe_entry;
477
        unsigned int size_cs_entry;
478
    } urb;
479
 
480
    struct {
481
        unsigned int gpgpu_mode : 1;
482
        unsigned int pad0 : 7;
483
        unsigned int max_num_threads : 16;
484
        unsigned int num_urb_entries : 8;
485
        unsigned int urb_entry_size : 16;
486
        unsigned int curbe_allocation_size : 16;
487
    } vfe_gpu_state;
488
 
489
    struct pp_load_save_context pp_load_save_context;
490
    struct pp_scaling_context pp_scaling_context;
491
    struct pp_avs_context pp_avs_context;
492
    struct pp_dndi_context pp_dndi_context;
493
    struct pp_dn_context pp_dn_context;
494
    void *private_context; /* pointer to the current private context */
495
    void *pipeline_param;  /* pointer to the pipeline parameter */
496
 
497
    int (*pp_x_steps)(void *private_context);
498
    int (*pp_y_steps)(void *private_context);
499
    int (*pp_set_block_parameter)(struct i965_post_processing_context *pp_context, int x, int y);
500
 
501
    struct intel_batchbuffer *batch;
502
 
503
    unsigned int block_horizontal_mask_left:16;
504
    unsigned int block_horizontal_mask_right:16;
505
    unsigned int block_vertical_mask_bottom:8;
506
 
507
    struct {
508
        dri_bo *bo;
509
        int bo_size;
510
        unsigned int end_offset;
511
    } instruction_state;
512
 
513
    struct {
514
        dri_bo *bo;
515
    } indirect_state;
516
 
517
    struct {
518
        dri_bo *bo;
519
        int bo_size;
520
        unsigned int end_offset;
521
    } dynamic_state;
522
 
523
    unsigned int sampler_offset;
524
    int sampler_size;
525
    unsigned int idrt_offset;
526
    int idrt_size;
527
    unsigned int curbe_offset;
528
    int curbe_size;
529
 
530
    VAStatus (*intel_post_processing)(VADriverContextP   ctx,
531
				struct i965_post_processing_context *pp_context,
532
				const struct i965_surface *src_surface,
533
				const VARectangle *src_rect,
534
				struct i965_surface *dst_surface,
535
				const VARectangle *dst_rect,
536
				int   pp_index,
537
				void * filter_param);
538
    void (*finalize)(struct i965_post_processing_context *pp_context);
539
};
540
 
541
struct i965_proc_context
542
{
543
    struct hw_context base;
544
    struct i965_post_processing_context pp_context;
545
};
546
 
547
VASurfaceID
548
i965_post_processing(
549
    VADriverContextP   ctx,
550
    struct object_surface *obj_surface,
551
    const VARectangle *src_rect,
552
    const VARectangle *dst_rect,
553
    unsigned int       flags,
554
    int                *has_done_scaling
555
);
556
 
557
VAStatus
558
i965_scaling_processing(
559
    VADriverContextP   ctx,
560
    struct object_surface *src_surface_obj,
561
    const VARectangle *src_rect,
562
    struct object_surface *dst_surface_obj,
563
    const VARectangle *dst_rect,
564
    unsigned int       flags
565
);
566
 
567
VAStatus
568
i965_image_processing(VADriverContextP ctx,
569
                      const struct i965_surface *src_surface,
570
                      const VARectangle *src_rect,
571
                      struct i965_surface *dst_surface,
572
                      const VARectangle *dst_rect);
573
 
574
void
575
i965_post_processing_terminate(VADriverContextP ctx);
576
bool
577
i965_post_processing_init(VADriverContextP ctx);
578
 
579
 
580
extern VAStatus
581
i965_proc_picture(VADriverContextP ctx,
582
                  VAProfile profile,
583
                  union codec_state *codec_state,
584
                  struct hw_context *hw_context);
585
 
586
#endif /* __I965_POST_PROCESSING_H__ */