2 * Copyright © 2011 Intel Corporation
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:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
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.
25 * Xiang Haihao <haihao.xiang@intel.com>
26 * Zhao Yakui <yakui.zhao@intel.com>
34 #include <va/va_dec_jpeg.h>
36 #include "intel_batchbuffer.h"
37 #include "intel_driver.h"
39 #include "i965_defines.h"
40 #include "i965_drv_video.h"
41 #include "i965_decoder_utils.h"
46 #define IS_STEPPING_BPLUS(i965) ((i965->intel.revision) >= B0_STEP_REV)
48 static const uint32_t zigzag_direct[64] = {
49 0, 1, 8, 16, 9, 2, 3, 10,
50 17, 24, 32, 25, 18, 11, 4, 5,
51 12, 19, 26, 33, 40, 48, 41, 34,
52 27, 20, 13, 6, 7, 14, 21, 28,
53 35, 42, 49, 56, 57, 50, 43, 36,
54 29, 22, 15, 23, 30, 37, 44, 51,
55 58, 59, 52, 45, 38, 31, 39, 46,
56 53, 60, 61, 54, 47, 55, 62, 63
60 gen75_mfd_avc_frame_store_index(VADriverContextP ctx,
61 VAPictureParameterBufferH264 *pic_param,
62 struct gen7_mfd_context *gen7_mfd_context)
64 struct i965_driver_data *i965 = i965_driver_data(ctx);
67 assert(ARRAY_ELEMS(gen7_mfd_context->reference_surface) == ARRAY_ELEMS(pic_param->ReferenceFrames));
69 for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) {
72 if (gen7_mfd_context->reference_surface[i].surface_id == VA_INVALID_ID)
75 for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) {
76 VAPictureH264 *ref_pic = &pic_param->ReferenceFrames[j];
77 if (ref_pic->flags & VA_PICTURE_H264_INVALID)
80 if (gen7_mfd_context->reference_surface[i].surface_id == ref_pic->picture_id) {
87 struct object_surface *obj_surface = SURFACE(gen7_mfd_context->reference_surface[i].surface_id);
88 obj_surface->flags &= ~SURFACE_REFERENCED;
90 if ((obj_surface->flags & SURFACE_ALL_MASK) == SURFACE_DISPLAYED) {
91 dri_bo_unreference(obj_surface->bo);
92 obj_surface->bo = NULL;
93 obj_surface->flags &= ~SURFACE_REF_DIS_MASK;
96 if (obj_surface->free_private_data)
97 obj_surface->free_private_data(&obj_surface->private_data);
99 gen7_mfd_context->reference_surface[i].surface_id = VA_INVALID_ID;
100 gen7_mfd_context->reference_surface[i].frame_store_id = -1;
104 for (i = 0; i < ARRAY_ELEMS(pic_param->ReferenceFrames); i++) {
105 VAPictureH264 *ref_pic = &pic_param->ReferenceFrames[i];
108 if (ref_pic->flags & VA_PICTURE_H264_INVALID)
111 for (j = 0; j < ARRAY_ELEMS(gen7_mfd_context->reference_surface); j++) {
112 if (gen7_mfd_context->reference_surface[j].surface_id == VA_INVALID_ID)
115 if (gen7_mfd_context->reference_surface[j].surface_id == ref_pic->picture_id) {
123 struct object_surface *obj_surface = SURFACE(ref_pic->picture_id);
126 i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC('N','V','1','2'), SUBSAMPLE_YUV420);
128 for (frame_idx = 0; frame_idx < ARRAY_ELEMS(gen7_mfd_context->reference_surface); frame_idx++) {
129 for (j = 0; j < ARRAY_ELEMS(gen7_mfd_context->reference_surface); j++) {
130 if (gen7_mfd_context->reference_surface[j].surface_id == VA_INVALID_ID)
133 if (gen7_mfd_context->reference_surface[j].frame_store_id == frame_idx)
137 if (j == ARRAY_ELEMS(gen7_mfd_context->reference_surface))
141 assert(frame_idx < ARRAY_ELEMS(gen7_mfd_context->reference_surface));
143 for (j = 0; j < ARRAY_ELEMS(gen7_mfd_context->reference_surface); j++) {
144 if (gen7_mfd_context->reference_surface[j].surface_id == VA_INVALID_ID) {
145 gen7_mfd_context->reference_surface[j].surface_id = ref_pic->picture_id;
146 gen7_mfd_context->reference_surface[j].frame_store_id = frame_idx;
154 for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface) - 1; i++) {
155 if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID &&
156 gen7_mfd_context->reference_surface[i].frame_store_id == i)
159 for (j = i + 1; j < ARRAY_ELEMS(gen7_mfd_context->reference_surface); j++) {
160 if (gen7_mfd_context->reference_surface[j].surface_id != VA_INVALID_ID &&
161 gen7_mfd_context->reference_surface[j].frame_store_id == i) {
162 VASurfaceID id = gen7_mfd_context->reference_surface[i].surface_id;
163 int frame_idx = gen7_mfd_context->reference_surface[i].frame_store_id;
165 gen7_mfd_context->reference_surface[i].surface_id = gen7_mfd_context->reference_surface[j].surface_id;
166 gen7_mfd_context->reference_surface[i].frame_store_id = gen7_mfd_context->reference_surface[j].frame_store_id;
167 gen7_mfd_context->reference_surface[j].surface_id = id;
168 gen7_mfd_context->reference_surface[j].frame_store_id = frame_idx;
176 gen75_mfd_free_avc_surface(void **data)
178 struct gen7_avc_surface *gen7_avc_surface = *data;
180 if (!gen7_avc_surface)
183 dri_bo_unreference(gen7_avc_surface->dmv_top);
184 gen7_avc_surface->dmv_top = NULL;
185 dri_bo_unreference(gen7_avc_surface->dmv_bottom);
186 gen7_avc_surface->dmv_bottom = NULL;
188 free(gen7_avc_surface);
193 gen75_mfd_init_avc_surface(VADriverContextP ctx,
194 VAPictureParameterBufferH264 *pic_param,
195 struct object_surface *obj_surface)
197 struct i965_driver_data *i965 = i965_driver_data(ctx);
198 struct gen7_avc_surface *gen7_avc_surface = obj_surface->private_data;
199 int width_in_mbs, height_in_mbs;
201 obj_surface->free_private_data = gen75_mfd_free_avc_surface;
202 width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1;
203 height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1; /* frame height */
205 if (!gen7_avc_surface) {
206 gen7_avc_surface = calloc(sizeof(struct gen7_avc_surface), 1);
207 assert((obj_surface->size & 0x3f) == 0);
208 obj_surface->private_data = gen7_avc_surface;
211 gen7_avc_surface->dmv_bottom_flag = (pic_param->pic_fields.bits.field_pic_flag &&
212 !pic_param->seq_fields.bits.direct_8x8_inference_flag);
214 if (gen7_avc_surface->dmv_top == NULL) {
215 gen7_avc_surface->dmv_top = dri_bo_alloc(i965->intel.bufmgr,
216 "direct mv w/r buffer",
217 width_in_mbs * height_in_mbs * 128,
219 assert(gen7_avc_surface->dmv_top);
222 if (gen7_avc_surface->dmv_bottom_flag &&
223 gen7_avc_surface->dmv_bottom == NULL) {
224 gen7_avc_surface->dmv_bottom = dri_bo_alloc(i965->intel.bufmgr,
225 "direct mv w/r buffer",
226 width_in_mbs * height_in_mbs * 128,
228 assert(gen7_avc_surface->dmv_bottom);
233 gen75_mfd_pipe_mode_select(VADriverContextP ctx,
234 struct decode_state *decode_state,
236 struct gen7_mfd_context *gen7_mfd_context)
238 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
240 assert(standard_select == MFX_FORMAT_MPEG2 ||
241 standard_select == MFX_FORMAT_AVC ||
242 standard_select == MFX_FORMAT_VC1 ||
243 standard_select == MFX_FORMAT_JPEG);
245 BEGIN_BCS_BATCH(batch, 5);
246 OUT_BCS_BATCH(batch, MFX_PIPE_MODE_SELECT | (5 - 2));
248 (MFX_LONG_MODE << 17) | /* Currently only support long format */
249 (MFD_MODE_VLD << 15) | /* VLD mode */
250 (0 << 10) | /* disable Stream-Out */
251 (gen7_mfd_context->post_deblocking_output.valid << 9) | /* Post Deblocking Output */
252 (gen7_mfd_context->pre_deblocking_output.valid << 8) | /* Pre Deblocking Output */
253 (0 << 5) | /* not in stitch mode */
254 (MFX_CODEC_DECODE << 4) | /* decoding mode */
255 (standard_select << 0));
257 (0 << 4) | /* terminate if AVC motion and POC table error occurs */
258 (0 << 3) | /* terminate if AVC mbdata error occurs */
259 (0 << 2) | /* terminate if AVC CABAC/CAVLC decode error occurs */
262 OUT_BCS_BATCH(batch, 0); /* pic status/error report id */
263 OUT_BCS_BATCH(batch, 0); /* reserved */
264 ADVANCE_BCS_BATCH(batch);
268 gen75_mfd_surface_state(VADriverContextP ctx,
269 struct decode_state *decode_state,
271 struct gen7_mfd_context *gen7_mfd_context)
273 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
274 struct i965_driver_data *i965 = i965_driver_data(ctx);
275 struct object_surface *obj_surface = SURFACE(decode_state->current_render_target);
276 unsigned int y_cb_offset;
277 unsigned int y_cr_offset;
281 y_cb_offset = obj_surface->y_cb_offset;
282 y_cr_offset = obj_surface->y_cr_offset;
284 BEGIN_BCS_BATCH(batch, 6);
285 OUT_BCS_BATCH(batch, MFX_SURFACE_STATE | (6 - 2));
286 OUT_BCS_BATCH(batch, 0);
288 ((obj_surface->orig_height - 1) << 18) |
289 ((obj_surface->orig_width - 1) << 4));
291 (MFX_SURFACE_PLANAR_420_8 << 28) | /* 420 planar YUV surface */
292 ((standard_select != MFX_FORMAT_JPEG) << 27) | /* interleave chroma, set to 0 for JPEG */
293 (0 << 22) | /* surface object control state, ignored */
294 ((obj_surface->width - 1) << 3) | /* pitch */
295 (0 << 2) | /* must be 0 */
296 (1 << 1) | /* must be tiled */
297 (I965_TILEWALK_YMAJOR << 0)); /* tile walk, must be 1 */
299 (0 << 16) | /* X offset for U(Cb), must be 0 */
300 (y_cb_offset << 0)); /* Y offset for U(Cb) */
302 (0 << 16) | /* X offset for V(Cr), must be 0 */
303 (y_cr_offset << 0)); /* Y offset for V(Cr), must be 0 for video codec, non-zoro for JPEG */
304 ADVANCE_BCS_BATCH(batch);
308 gen75_mfd_pipe_buf_addr_state_bplus(VADriverContextP ctx,
309 struct decode_state *decode_state,
311 struct gen7_mfd_context *gen7_mfd_context)
313 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
314 struct i965_driver_data *i965 = i965_driver_data(ctx);
317 BEGIN_BCS_BATCH(batch, 61);
318 OUT_BCS_BATCH(batch, MFX_PIPE_BUF_ADDR_STATE | (61 - 2));
319 /* Pre-deblock 1-3 */
320 if (gen7_mfd_context->pre_deblocking_output.valid)
321 OUT_BCS_RELOC(batch, gen7_mfd_context->pre_deblocking_output.bo,
322 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
325 OUT_BCS_BATCH(batch, 0);
327 OUT_BCS_BATCH(batch, 0);
328 OUT_BCS_BATCH(batch, 0);
329 /* Post-debloing 4-6 */
330 if (gen7_mfd_context->post_deblocking_output.valid)
331 OUT_BCS_RELOC(batch, gen7_mfd_context->post_deblocking_output.bo,
332 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
335 OUT_BCS_BATCH(batch, 0);
337 OUT_BCS_BATCH(batch, 0);
338 OUT_BCS_BATCH(batch, 0);
340 /* uncompressed-video & stream out 7-12 */
341 OUT_BCS_BATCH(batch, 0); /* ignore for decoding */
342 OUT_BCS_BATCH(batch, 0); /* ignore for decoding */
343 OUT_BCS_BATCH(batch, 0);
344 OUT_BCS_BATCH(batch, 0);
345 OUT_BCS_BATCH(batch, 0);
346 OUT_BCS_BATCH(batch, 0);
348 /* intra row-store scratch 13-15 */
349 if (gen7_mfd_context->intra_row_store_scratch_buffer.valid)
350 OUT_BCS_RELOC(batch, gen7_mfd_context->intra_row_store_scratch_buffer.bo,
351 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
354 OUT_BCS_BATCH(batch, 0);
356 OUT_BCS_BATCH(batch, 0);
357 OUT_BCS_BATCH(batch, 0);
358 /* deblocking-filter-row-store 16-18 */
359 if (gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.valid)
360 OUT_BCS_RELOC(batch, gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.bo,
361 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
364 OUT_BCS_BATCH(batch, 0);
365 OUT_BCS_BATCH(batch, 0);
366 OUT_BCS_BATCH(batch, 0);
369 for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) {
370 struct object_surface *obj_surface;
372 if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) {
373 obj_surface = SURFACE(gen7_mfd_context->reference_surface[i].surface_id);
374 assert(obj_surface && obj_surface->bo);
376 OUT_BCS_RELOC(batch, obj_surface->bo,
377 I915_GEM_DOMAIN_INSTRUCTION, 0,
380 OUT_BCS_BATCH(batch, 0);
382 OUT_BCS_BATCH(batch, 0);
384 /* reference property 51 */
385 OUT_BCS_BATCH(batch, 0);
387 /* Macroblock status & ILDB 52-57 */
388 OUT_BCS_BATCH(batch, 0);
389 OUT_BCS_BATCH(batch, 0);
390 OUT_BCS_BATCH(batch, 0);
391 OUT_BCS_BATCH(batch, 0);
392 OUT_BCS_BATCH(batch, 0);
393 OUT_BCS_BATCH(batch, 0);
395 /* the second Macroblock status 58-60 */
396 OUT_BCS_BATCH(batch, 0);
397 OUT_BCS_BATCH(batch, 0);
398 OUT_BCS_BATCH(batch, 0);
399 ADVANCE_BCS_BATCH(batch);
403 gen75_mfd_pipe_buf_addr_state(VADriverContextP ctx,
404 struct decode_state *decode_state,
406 struct gen7_mfd_context *gen7_mfd_context)
408 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
409 struct i965_driver_data *i965 = i965_driver_data(ctx);
412 if (IS_STEPPING_BPLUS(i965)) {
413 gen75_mfd_pipe_buf_addr_state_bplus(ctx, decode_state,
414 standard_select, gen7_mfd_context);
417 BEGIN_BCS_BATCH(batch, 25);
418 OUT_BCS_BATCH(batch, MFX_PIPE_BUF_ADDR_STATE | (25 - 2));
419 if (gen7_mfd_context->pre_deblocking_output.valid)
420 OUT_BCS_RELOC(batch, gen7_mfd_context->pre_deblocking_output.bo,
421 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
424 OUT_BCS_BATCH(batch, 0);
426 if (gen7_mfd_context->post_deblocking_output.valid)
427 OUT_BCS_RELOC(batch, gen7_mfd_context->post_deblocking_output.bo,
428 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
431 OUT_BCS_BATCH(batch, 0);
433 OUT_BCS_BATCH(batch, 0); /* ignore for decoding */
434 OUT_BCS_BATCH(batch, 0); /* ignore for decoding */
436 if (gen7_mfd_context->intra_row_store_scratch_buffer.valid)
437 OUT_BCS_RELOC(batch, gen7_mfd_context->intra_row_store_scratch_buffer.bo,
438 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
441 OUT_BCS_BATCH(batch, 0);
443 if (gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.valid)
444 OUT_BCS_RELOC(batch, gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.bo,
445 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
448 OUT_BCS_BATCH(batch, 0);
451 for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) {
452 struct object_surface *obj_surface;
454 if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) {
455 obj_surface = SURFACE(gen7_mfd_context->reference_surface[i].surface_id);
456 assert(obj_surface && obj_surface->bo);
458 OUT_BCS_RELOC(batch, obj_surface->bo,
459 I915_GEM_DOMAIN_INSTRUCTION, 0,
462 OUT_BCS_BATCH(batch, 0);
466 OUT_BCS_BATCH(batch, 0); /* ignore DW23 for decoding */
467 OUT_BCS_BATCH(batch, 0); /* ignore DW24 for decoding */
468 ADVANCE_BCS_BATCH(batch);
472 gen75_mfd_ind_obj_base_addr_state_bplus(VADriverContextP ctx,
473 dri_bo *slice_data_bo,
475 struct gen7_mfd_context *gen7_mfd_context)
477 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
479 BEGIN_BCS_BATCH(batch, 26);
480 OUT_BCS_BATCH(batch, MFX_IND_OBJ_BASE_ADDR_STATE | (26 - 2));
482 OUT_BCS_RELOC(batch, slice_data_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); /* MFX Indirect Bitstream Object Base Address */
483 OUT_BCS_BATCH(batch, 0);
484 OUT_BCS_BATCH(batch, 0);
485 /* Upper bound 4-5 */
486 OUT_BCS_BATCH(batch, 0x80000000); /* must set, up to 2G */
487 OUT_BCS_BATCH(batch, 0);
489 /* MFX indirect MV 6-10 */
490 OUT_BCS_BATCH(batch, 0);
491 OUT_BCS_BATCH(batch, 0);
492 OUT_BCS_BATCH(batch, 0);
493 OUT_BCS_BATCH(batch, 0);
494 OUT_BCS_BATCH(batch, 0);
496 /* MFX IT_COFF 11-15 */
497 OUT_BCS_BATCH(batch, 0);
498 OUT_BCS_BATCH(batch, 0);
499 OUT_BCS_BATCH(batch, 0);
500 OUT_BCS_BATCH(batch, 0);
501 OUT_BCS_BATCH(batch, 0);
503 /* MFX IT_DBLK 16-20 */
504 OUT_BCS_BATCH(batch, 0);
505 OUT_BCS_BATCH(batch, 0);
506 OUT_BCS_BATCH(batch, 0);
507 OUT_BCS_BATCH(batch, 0);
508 OUT_BCS_BATCH(batch, 0);
510 /* MFX PAK_BSE object for encoder 21-25 */
511 OUT_BCS_BATCH(batch, 0);
512 OUT_BCS_BATCH(batch, 0);
513 OUT_BCS_BATCH(batch, 0);
514 OUT_BCS_BATCH(batch, 0);
515 OUT_BCS_BATCH(batch, 0);
517 ADVANCE_BCS_BATCH(batch);
521 gen75_mfd_ind_obj_base_addr_state(VADriverContextP ctx,
522 dri_bo *slice_data_bo,
524 struct gen7_mfd_context *gen7_mfd_context)
526 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
528 struct i965_driver_data *i965 = i965_driver_data(ctx);
530 if (IS_STEPPING_BPLUS(i965)) {
531 gen75_mfd_ind_obj_base_addr_state_bplus(ctx, slice_data_bo,
532 standard_select, gen7_mfd_context);
535 BEGIN_BCS_BATCH(batch, 11);
536 OUT_BCS_BATCH(batch, MFX_IND_OBJ_BASE_ADDR_STATE | (11 - 2));
537 OUT_BCS_RELOC(batch, slice_data_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); /* MFX Indirect Bitstream Object Base Address */
538 OUT_BCS_BATCH(batch, 0x80000000); /* must set, up to 2G */
539 OUT_BCS_BATCH(batch, 0); /* ignore for VLD mode */
540 OUT_BCS_BATCH(batch, 0);
541 OUT_BCS_BATCH(batch, 0); /* ignore for VLD mode */
542 OUT_BCS_BATCH(batch, 0);
543 OUT_BCS_BATCH(batch, 0); /* ignore for VLD mode */
544 OUT_BCS_BATCH(batch, 0);
545 OUT_BCS_BATCH(batch, 0); /* ignore for VLD mode */
546 OUT_BCS_BATCH(batch, 0);
547 ADVANCE_BCS_BATCH(batch);
551 gen75_mfd_bsp_buf_base_addr_state_bplus(VADriverContextP ctx,
552 struct decode_state *decode_state,
554 struct gen7_mfd_context *gen7_mfd_context)
556 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
558 BEGIN_BCS_BATCH(batch, 10);
559 OUT_BCS_BATCH(batch, MFX_BSP_BUF_BASE_ADDR_STATE | (10 - 2));
561 if (gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.valid)
562 OUT_BCS_RELOC(batch, gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.bo,
563 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
566 OUT_BCS_BATCH(batch, 0);
568 OUT_BCS_BATCH(batch, 0);
569 OUT_BCS_BATCH(batch, 0);
570 /* MPR Row Store Scratch buffer 4-6 */
571 if (gen7_mfd_context->mpr_row_store_scratch_buffer.valid)
572 OUT_BCS_RELOC(batch, gen7_mfd_context->mpr_row_store_scratch_buffer.bo,
573 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
576 OUT_BCS_BATCH(batch, 0);
577 OUT_BCS_BATCH(batch, 0);
578 OUT_BCS_BATCH(batch, 0);
581 if (gen7_mfd_context->bitplane_read_buffer.valid)
582 OUT_BCS_RELOC(batch, gen7_mfd_context->bitplane_read_buffer.bo,
583 I915_GEM_DOMAIN_INSTRUCTION, 0,
586 OUT_BCS_BATCH(batch, 0);
587 OUT_BCS_BATCH(batch, 0);
588 OUT_BCS_BATCH(batch, 0);
589 ADVANCE_BCS_BATCH(batch);
593 gen75_mfd_bsp_buf_base_addr_state(VADriverContextP ctx,
594 struct decode_state *decode_state,
596 struct gen7_mfd_context *gen7_mfd_context)
598 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
599 struct i965_driver_data *i965 = i965_driver_data(ctx);
601 if (IS_STEPPING_BPLUS(i965)) {
602 gen75_mfd_bsp_buf_base_addr_state_bplus(ctx, decode_state,
603 standard_select, gen7_mfd_context);
607 BEGIN_BCS_BATCH(batch, 4);
608 OUT_BCS_BATCH(batch, MFX_BSP_BUF_BASE_ADDR_STATE | (4 - 2));
610 if (gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.valid)
611 OUT_BCS_RELOC(batch, gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.bo,
612 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
615 OUT_BCS_BATCH(batch, 0);
617 if (gen7_mfd_context->mpr_row_store_scratch_buffer.valid)
618 OUT_BCS_RELOC(batch, gen7_mfd_context->mpr_row_store_scratch_buffer.bo,
619 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
622 OUT_BCS_BATCH(batch, 0);
624 if (gen7_mfd_context->bitplane_read_buffer.valid)
625 OUT_BCS_RELOC(batch, gen7_mfd_context->bitplane_read_buffer.bo,
626 I915_GEM_DOMAIN_INSTRUCTION, 0,
629 OUT_BCS_BATCH(batch, 0);
631 ADVANCE_BCS_BATCH(batch);
636 gen7_mfd_aes_state(VADriverContextP ctx,
637 struct decode_state *decode_state,
645 gen75_mfd_qm_state(VADriverContextP ctx,
649 struct gen7_mfd_context *gen7_mfd_context)
651 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
652 unsigned int qm_buffer[16];
654 assert(qm_length <= 16 * 4);
655 memcpy(qm_buffer, qm, qm_length);
657 BEGIN_BCS_BATCH(batch, 18);
658 OUT_BCS_BATCH(batch, MFX_QM_STATE | (18 - 2));
659 OUT_BCS_BATCH(batch, qm_type << 0);
660 intel_batchbuffer_data(batch, qm_buffer, 16 * 4);
661 ADVANCE_BCS_BATCH(batch);
666 gen7_mfd_wait(VADriverContextP ctx,
667 struct decode_state *decode_state,
669 struct gen7_mfd_context *gen7_mfd_context)
671 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
673 BEGIN_BCS_BATCH(batch, 1);
674 OUT_BCS_BATCH(batch, MFX_WAIT | (1 << 8));
675 ADVANCE_BCS_BATCH(batch);
680 gen75_mfd_avc_img_state(VADriverContextP ctx,
681 struct decode_state *decode_state,
682 struct gen7_mfd_context *gen7_mfd_context)
684 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
686 int mbaff_frame_flag;
687 unsigned int width_in_mbs, height_in_mbs;
688 VAPictureParameterBufferH264 *pic_param;
690 assert(decode_state->pic_param && decode_state->pic_param->buffer);
691 pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer;
692 assert(!(pic_param->CurrPic.flags & VA_PICTURE_H264_INVALID));
694 if (pic_param->CurrPic.flags & VA_PICTURE_H264_TOP_FIELD)
696 else if (pic_param->CurrPic.flags & VA_PICTURE_H264_BOTTOM_FIELD)
701 if ((img_struct & 0x1) == 0x1) {
702 assert(pic_param->pic_fields.bits.field_pic_flag == 0x1);
704 assert(pic_param->pic_fields.bits.field_pic_flag == 0x0);
707 if (pic_param->seq_fields.bits.frame_mbs_only_flag) { /* a frame containing only frame macroblocks */
708 assert(pic_param->seq_fields.bits.mb_adaptive_frame_field_flag == 0);
709 assert(pic_param->pic_fields.bits.field_pic_flag == 0);
711 assert(pic_param->seq_fields.bits.direct_8x8_inference_flag == 1); /* see H.264 spec */
714 mbaff_frame_flag = (pic_param->seq_fields.bits.mb_adaptive_frame_field_flag &&
715 !pic_param->pic_fields.bits.field_pic_flag);
717 width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1;
718 height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1; /* frame height */
720 /* MFX unit doesn't support 4:2:2 and 4:4:4 picture */
721 assert(pic_param->seq_fields.bits.chroma_format_idc == 0 || /* monochrome picture */
722 pic_param->seq_fields.bits.chroma_format_idc == 1); /* 4:2:0 */
723 assert(pic_param->seq_fields.bits.residual_colour_transform_flag == 0); /* only available for 4:4:4 */
725 BEGIN_BCS_BATCH(batch, 17);
726 OUT_BCS_BATCH(batch, MFX_AVC_IMG_STATE | (17 - 2));
728 width_in_mbs * height_in_mbs);
730 ((height_in_mbs - 1) << 16) |
731 ((width_in_mbs - 1) << 0));
733 ((pic_param->second_chroma_qp_index_offset & 0x1f) << 24) |
734 ((pic_param->chroma_qp_index_offset & 0x1f) << 16) |
735 (0 << 14) | /* Max-bit conformance Intra flag ??? FIXME */
736 (0 << 13) | /* Max Macroblock size conformance Inter flag ??? FIXME */
737 (pic_param->pic_fields.bits.weighted_pred_flag << 12) | /* differ from GEN6 */
738 (pic_param->pic_fields.bits.weighted_bipred_idc << 10) |
741 (pic_param->seq_fields.bits.chroma_format_idc << 10) |
742 (pic_param->pic_fields.bits.entropy_coding_mode_flag << 7) |
743 ((!pic_param->pic_fields.bits.reference_pic_flag) << 6) |
744 (pic_param->pic_fields.bits.constrained_intra_pred_flag << 5) |
745 (pic_param->seq_fields.bits.direct_8x8_inference_flag << 4) |
746 (pic_param->pic_fields.bits.transform_8x8_mode_flag << 3) |
747 (pic_param->seq_fields.bits.frame_mbs_only_flag << 2) |
748 (mbaff_frame_flag << 1) |
749 (pic_param->pic_fields.bits.field_pic_flag << 0));
750 OUT_BCS_BATCH(batch, 0);
751 OUT_BCS_BATCH(batch, 0);
752 OUT_BCS_BATCH(batch, 0);
753 OUT_BCS_BATCH(batch, 0);
754 OUT_BCS_BATCH(batch, 0);
755 OUT_BCS_BATCH(batch, 0);
756 OUT_BCS_BATCH(batch, 0);
757 OUT_BCS_BATCH(batch, 0);
758 OUT_BCS_BATCH(batch, 0);
759 OUT_BCS_BATCH(batch, 0);
760 OUT_BCS_BATCH(batch, 0);
761 OUT_BCS_BATCH(batch, 0);
762 ADVANCE_BCS_BATCH(batch);
766 gen75_mfd_avc_qm_state(VADriverContextP ctx,
767 struct decode_state *decode_state,
768 struct gen7_mfd_context *gen7_mfd_context)
770 VAIQMatrixBufferH264 *iq_matrix;
771 VAPictureParameterBufferH264 *pic_param;
773 if (decode_state->iq_matrix && decode_state->iq_matrix->buffer)
774 iq_matrix = (VAIQMatrixBufferH264 *)decode_state->iq_matrix->buffer;
776 iq_matrix = &gen7_mfd_context->iq_matrix.h264;
778 assert(decode_state->pic_param && decode_state->pic_param->buffer);
779 pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer;
781 gen75_mfd_qm_state(ctx, MFX_QM_AVC_4X4_INTRA_MATRIX, &iq_matrix->ScalingList4x4[0][0], 3 * 16, gen7_mfd_context);
782 gen75_mfd_qm_state(ctx, MFX_QM_AVC_4X4_INTER_MATRIX, &iq_matrix->ScalingList4x4[3][0], 3 * 16, gen7_mfd_context);
784 if (pic_param->pic_fields.bits.transform_8x8_mode_flag) {
785 gen75_mfd_qm_state(ctx, MFX_QM_AVC_8x8_INTRA_MATRIX, &iq_matrix->ScalingList8x8[0][0], 64, gen7_mfd_context);
786 gen75_mfd_qm_state(ctx, MFX_QM_AVC_8x8_INTER_MATRIX, &iq_matrix->ScalingList8x8[1][0], 64, gen7_mfd_context);
791 gen75_mfd_avc_picid_state(VADriverContextP ctx,
792 struct decode_state *decode_state,
793 struct gen7_mfd_context *gen7_mfd_context)
795 struct i965_driver_data *i965 = i965_driver_data(ctx);
796 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
798 BEGIN_BCS_BATCH(batch, 10);
799 OUT_BCS_BATCH(batch, MFD_AVC_PICID_STATE | (10 - 2));
800 OUT_BCS_BATCH(batch, 1); // disable Picture ID Remapping
801 OUT_BCS_BATCH(batch, 0);
802 OUT_BCS_BATCH(batch, 0);
803 OUT_BCS_BATCH(batch, 0);
804 OUT_BCS_BATCH(batch, 0);
805 OUT_BCS_BATCH(batch, 0);
806 OUT_BCS_BATCH(batch, 0);
807 OUT_BCS_BATCH(batch, 0);
808 OUT_BCS_BATCH(batch, 0);
809 ADVANCE_BCS_BATCH(batch);
813 gen75_mfd_avc_directmode_state_bplus(VADriverContextP ctx,
814 VAPictureParameterBufferH264 *pic_param,
815 VASliceParameterBufferH264 *slice_param,
816 struct gen7_mfd_context *gen7_mfd_context)
818 struct i965_driver_data *i965 = i965_driver_data(ctx);
819 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
820 struct object_surface *obj_surface;
821 struct gen7_avc_surface *gen7_avc_surface;
822 VAPictureH264 *va_pic;
825 BEGIN_BCS_BATCH(batch, 71);
826 OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (71 - 2));
828 /* reference surfaces 0..15 */
829 for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) {
830 if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) {
831 obj_surface = SURFACE(gen7_mfd_context->reference_surface[i].surface_id);
833 gen7_avc_surface = obj_surface->private_data;
835 if (gen7_avc_surface == NULL) {
836 OUT_BCS_BATCH(batch, 0);
837 OUT_BCS_BATCH(batch, 0);
839 OUT_BCS_RELOC(batch, gen7_avc_surface->dmv_top,
840 I915_GEM_DOMAIN_INSTRUCTION, 0,
842 OUT_BCS_BATCH(batch, 0);
845 OUT_BCS_BATCH(batch, 0);
846 OUT_BCS_BATCH(batch, 0);
849 OUT_BCS_BATCH(batch, 0);
851 /* the current decoding frame/field */
852 va_pic = &pic_param->CurrPic;
853 assert(!(va_pic->flags & VA_PICTURE_H264_INVALID));
854 obj_surface = SURFACE(va_pic->picture_id);
855 assert(obj_surface && obj_surface->bo && obj_surface->private_data);
856 gen7_avc_surface = obj_surface->private_data;
858 OUT_BCS_RELOC(batch, gen7_avc_surface->dmv_top,
859 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
862 OUT_BCS_BATCH(batch, 0);
863 OUT_BCS_BATCH(batch, 0);
866 for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) {
867 if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) {
869 for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) {
870 va_pic = &pic_param->ReferenceFrames[j];
872 if (va_pic->flags & VA_PICTURE_H264_INVALID)
875 if (va_pic->picture_id == gen7_mfd_context->reference_surface[i].surface_id) {
882 assert(!(va_pic->flags & VA_PICTURE_H264_INVALID));
884 OUT_BCS_BATCH(batch, va_pic->TopFieldOrderCnt);
885 OUT_BCS_BATCH(batch, va_pic->BottomFieldOrderCnt);
887 OUT_BCS_BATCH(batch, 0);
888 OUT_BCS_BATCH(batch, 0);
892 va_pic = &pic_param->CurrPic;
893 OUT_BCS_BATCH(batch, va_pic->TopFieldOrderCnt);
894 OUT_BCS_BATCH(batch, va_pic->BottomFieldOrderCnt);
896 ADVANCE_BCS_BATCH(batch);
900 gen75_mfd_avc_directmode_state(VADriverContextP ctx,
901 VAPictureParameterBufferH264 *pic_param,
902 VASliceParameterBufferH264 *slice_param,
903 struct gen7_mfd_context *gen7_mfd_context)
905 struct i965_driver_data *i965 = i965_driver_data(ctx);
906 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
907 struct object_surface *obj_surface;
908 struct gen7_avc_surface *gen7_avc_surface;
909 VAPictureH264 *va_pic;
912 if (IS_STEPPING_BPLUS(i965)) {
913 gen75_mfd_avc_directmode_state_bplus(ctx, pic_param, slice_param,
919 BEGIN_BCS_BATCH(batch, 69);
920 OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (69 - 2));
922 /* reference surfaces 0..15 */
923 for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) {
924 if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) {
925 obj_surface = SURFACE(gen7_mfd_context->reference_surface[i].surface_id);
927 gen7_avc_surface = obj_surface->private_data;
929 if (gen7_avc_surface == NULL) {
930 OUT_BCS_BATCH(batch, 0);
931 OUT_BCS_BATCH(batch, 0);
933 OUT_BCS_RELOC(batch, gen7_avc_surface->dmv_top,
934 I915_GEM_DOMAIN_INSTRUCTION, 0,
937 if (gen7_avc_surface->dmv_bottom_flag == 1)
938 OUT_BCS_RELOC(batch, gen7_avc_surface->dmv_bottom,
939 I915_GEM_DOMAIN_INSTRUCTION, 0,
942 OUT_BCS_RELOC(batch, gen7_avc_surface->dmv_top,
943 I915_GEM_DOMAIN_INSTRUCTION, 0,
947 OUT_BCS_BATCH(batch, 0);
948 OUT_BCS_BATCH(batch, 0);
952 /* the current decoding frame/field */
953 va_pic = &pic_param->CurrPic;
954 assert(!(va_pic->flags & VA_PICTURE_H264_INVALID));
955 obj_surface = SURFACE(va_pic->picture_id);
956 assert(obj_surface && obj_surface->bo && obj_surface->private_data);
957 gen7_avc_surface = obj_surface->private_data;
959 OUT_BCS_RELOC(batch, gen7_avc_surface->dmv_top,
960 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
963 if (gen7_avc_surface->dmv_bottom_flag == 1)
964 OUT_BCS_RELOC(batch, gen7_avc_surface->dmv_bottom,
965 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
968 OUT_BCS_RELOC(batch, gen7_avc_surface->dmv_top,
969 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
973 for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) {
974 if (gen7_mfd_context->reference_surface[i].surface_id != VA_INVALID_ID) {
976 for (j = 0; j < ARRAY_ELEMS(pic_param->ReferenceFrames); j++) {
977 va_pic = &pic_param->ReferenceFrames[j];
979 if (va_pic->flags & VA_PICTURE_H264_INVALID)
982 if (va_pic->picture_id == gen7_mfd_context->reference_surface[i].surface_id) {
989 assert(!(va_pic->flags & VA_PICTURE_H264_INVALID));
991 OUT_BCS_BATCH(batch, va_pic->TopFieldOrderCnt);
992 OUT_BCS_BATCH(batch, va_pic->BottomFieldOrderCnt);
994 OUT_BCS_BATCH(batch, 0);
995 OUT_BCS_BATCH(batch, 0);
999 va_pic = &pic_param->CurrPic;
1000 OUT_BCS_BATCH(batch, va_pic->TopFieldOrderCnt);
1001 OUT_BCS_BATCH(batch, va_pic->BottomFieldOrderCnt);
1003 ADVANCE_BCS_BATCH(batch);
1007 gen75_mfd_avc_slice_state(VADriverContextP ctx,
1008 VAPictureParameterBufferH264 *pic_param,
1009 VASliceParameterBufferH264 *slice_param,
1010 VASliceParameterBufferH264 *next_slice_param,
1011 struct gen7_mfd_context *gen7_mfd_context)
1013 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
1014 int width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1;
1015 int height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1;
1016 int slice_hor_pos, slice_ver_pos, next_slice_hor_pos, next_slice_ver_pos;
1017 int num_ref_idx_l0, num_ref_idx_l1;
1018 int mbaff_picture = (!pic_param->pic_fields.bits.field_pic_flag &&
1019 pic_param->seq_fields.bits.mb_adaptive_frame_field_flag);
1020 int first_mb_in_slice = 0, first_mb_in_next_slice = 0;
1023 if (slice_param->slice_type == SLICE_TYPE_I ||
1024 slice_param->slice_type == SLICE_TYPE_SI) {
1025 slice_type = SLICE_TYPE_I;
1026 } else if (slice_param->slice_type == SLICE_TYPE_P ||
1027 slice_param->slice_type == SLICE_TYPE_SP) {
1028 slice_type = SLICE_TYPE_P;
1030 assert(slice_param->slice_type == SLICE_TYPE_B);
1031 slice_type = SLICE_TYPE_B;
1034 if (slice_type == SLICE_TYPE_I) {
1035 assert(slice_param->num_ref_idx_l0_active_minus1 == 0);
1036 assert(slice_param->num_ref_idx_l1_active_minus1 == 0);
1039 } else if (slice_type == SLICE_TYPE_P) {
1040 assert(slice_param->num_ref_idx_l1_active_minus1 == 0);
1041 num_ref_idx_l0 = slice_param->num_ref_idx_l0_active_minus1 + 1;
1044 num_ref_idx_l0 = slice_param->num_ref_idx_l0_active_minus1 + 1;
1045 num_ref_idx_l1 = slice_param->num_ref_idx_l1_active_minus1 + 1;
1048 first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture;
1049 slice_hor_pos = first_mb_in_slice % width_in_mbs;
1050 slice_ver_pos = first_mb_in_slice / width_in_mbs;
1052 if (next_slice_param) {
1053 first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture;
1054 next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs;
1055 next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs;
1057 next_slice_hor_pos = 0;
1058 next_slice_ver_pos = height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag);
1061 BEGIN_BCS_BATCH(batch, 11); /* FIXME: is it 10??? */
1062 OUT_BCS_BATCH(batch, MFX_AVC_SLICE_STATE | (11 - 2));
1063 OUT_BCS_BATCH(batch, slice_type);
1064 OUT_BCS_BATCH(batch,
1065 (num_ref_idx_l1 << 24) |
1066 (num_ref_idx_l0 << 16) |
1067 (slice_param->chroma_log2_weight_denom << 8) |
1068 (slice_param->luma_log2_weight_denom << 0));
1069 OUT_BCS_BATCH(batch,
1070 (slice_param->direct_spatial_mv_pred_flag << 29) |
1071 (slice_param->disable_deblocking_filter_idc << 27) |
1072 (slice_param->cabac_init_idc << 24) |
1073 ((pic_param->pic_init_qp_minus26 + 26 + slice_param->slice_qp_delta) << 16) |
1074 ((slice_param->slice_beta_offset_div2 & 0xf) << 8) |
1075 ((slice_param->slice_alpha_c0_offset_div2 & 0xf) << 0));
1076 OUT_BCS_BATCH(batch,
1077 (slice_ver_pos << 24) |
1078 (slice_hor_pos << 16) |
1079 (first_mb_in_slice << 0));
1080 OUT_BCS_BATCH(batch,
1081 (next_slice_ver_pos << 16) |
1082 (next_slice_hor_pos << 0));
1083 OUT_BCS_BATCH(batch,
1084 (next_slice_param == NULL) << 19); /* last slice flag */
1085 OUT_BCS_BATCH(batch, 0);
1086 OUT_BCS_BATCH(batch, 0);
1087 OUT_BCS_BATCH(batch, 0);
1088 OUT_BCS_BATCH(batch, 0);
1089 ADVANCE_BCS_BATCH(batch);
1093 gen75_mfd_avc_ref_idx_state(VADriverContextP ctx,
1094 VAPictureParameterBufferH264 *pic_param,
1095 VASliceParameterBufferH264 *slice_param,
1096 struct gen7_mfd_context *gen7_mfd_context)
1098 gen6_send_avc_ref_idx_state(
1099 gen7_mfd_context->base.batch,
1101 gen7_mfd_context->reference_surface
1106 gen75_mfd_avc_weightoffset_state(VADriverContextP ctx,
1107 VAPictureParameterBufferH264 *pic_param,
1108 VASliceParameterBufferH264 *slice_param,
1109 struct gen7_mfd_context *gen7_mfd_context)
1111 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
1112 int i, j, num_weight_offset_table = 0;
1113 short weightoffsets[32 * 6];
1115 if ((slice_param->slice_type == SLICE_TYPE_P ||
1116 slice_param->slice_type == SLICE_TYPE_SP) &&
1117 (pic_param->pic_fields.bits.weighted_pred_flag == 1)) {
1118 num_weight_offset_table = 1;
1121 if ((slice_param->slice_type == SLICE_TYPE_B) &&
1122 (pic_param->pic_fields.bits.weighted_bipred_idc == 1)) {
1123 num_weight_offset_table = 2;
1126 for (i = 0; i < num_weight_offset_table; i++) {
1127 BEGIN_BCS_BATCH(batch, 98);
1128 OUT_BCS_BATCH(batch, MFX_AVC_WEIGHTOFFSET_STATE | (98 - 2));
1129 OUT_BCS_BATCH(batch, i);
1132 for (j = 0; j < 32; j++) {
1133 weightoffsets[j * 6 + 0] = slice_param->luma_weight_l0[j];
1134 weightoffsets[j * 6 + 1] = slice_param->luma_offset_l0[j];
1135 weightoffsets[j * 6 + 2] = slice_param->chroma_weight_l0[j][0];
1136 weightoffsets[j * 6 + 3] = slice_param->chroma_offset_l0[j][0];
1137 weightoffsets[j * 6 + 4] = slice_param->chroma_weight_l0[j][1];
1138 weightoffsets[j * 6 + 5] = slice_param->chroma_offset_l0[j][1];
1141 for (j = 0; j < 32; j++) {
1142 weightoffsets[j * 6 + 0] = slice_param->luma_weight_l1[j];
1143 weightoffsets[j * 6 + 1] = slice_param->luma_offset_l1[j];
1144 weightoffsets[j * 6 + 2] = slice_param->chroma_weight_l1[j][0];
1145 weightoffsets[j * 6 + 3] = slice_param->chroma_offset_l1[j][0];
1146 weightoffsets[j * 6 + 4] = slice_param->chroma_weight_l1[j][1];
1147 weightoffsets[j * 6 + 5] = slice_param->chroma_offset_l1[j][1];
1151 intel_batchbuffer_data(batch, weightoffsets, sizeof(weightoffsets));
1152 ADVANCE_BCS_BATCH(batch);
1157 gen75_mfd_avc_get_slice_bit_offset(uint8_t *buf, int mode_flag, int in_slice_data_bit_offset)
1159 int out_slice_data_bit_offset;
1160 int slice_header_size = in_slice_data_bit_offset / 8;
1163 for (i = 0, j = 0; i < slice_header_size; i++, j++) {
1164 if (!buf[j] && !buf[j + 1] && buf[j + 2] == 3) {
1169 out_slice_data_bit_offset = 8 * j + in_slice_data_bit_offset % 8;
1171 if (mode_flag == ENTROPY_CABAC)
1172 out_slice_data_bit_offset = ALIGN(out_slice_data_bit_offset, 0x8);
1174 return out_slice_data_bit_offset;
1178 gen75_mfd_avc_bsd_object(VADriverContextP ctx,
1179 VAPictureParameterBufferH264 *pic_param,
1180 VASliceParameterBufferH264 *slice_param,
1181 dri_bo *slice_data_bo,
1182 VASliceParameterBufferH264 *next_slice_param,
1183 struct gen7_mfd_context *gen7_mfd_context)
1185 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
1186 int slice_data_bit_offset;
1187 uint8_t *slice_data = NULL;
1189 dri_bo_map(slice_data_bo, 0);
1190 slice_data = (uint8_t *)(slice_data_bo->virtual + slice_param->slice_data_offset);
1191 slice_data_bit_offset = gen75_mfd_avc_get_slice_bit_offset(slice_data,
1192 pic_param->pic_fields.bits.entropy_coding_mode_flag,
1193 slice_param->slice_data_bit_offset);
1194 dri_bo_unmap(slice_data_bo);
1196 /* the input bitsteam format on GEN7 differs from GEN6 */
1197 BEGIN_BCS_BATCH(batch, 6);
1198 OUT_BCS_BATCH(batch, MFD_AVC_BSD_OBJECT | (6 - 2));
1199 OUT_BCS_BATCH(batch,
1200 (slice_param->slice_data_size));
1201 OUT_BCS_BATCH(batch, slice_param->slice_data_offset);
1202 OUT_BCS_BATCH(batch,
1208 OUT_BCS_BATCH(batch,
1209 ((slice_data_bit_offset >> 3) << 16) |
1212 ((next_slice_param == NULL) << 3) | /* LastSlice Flag */
1213 (slice_data_bit_offset & 0x7));
1214 OUT_BCS_BATCH(batch, 0);
1215 ADVANCE_BCS_BATCH(batch);
1219 gen75_mfd_avc_context_init(
1220 VADriverContextP ctx,
1221 struct gen7_mfd_context *gen7_mfd_context
1224 /* Initialize flat scaling lists */
1225 avc_gen_default_iq_matrix(&gen7_mfd_context->iq_matrix.h264);
1229 gen75_mfd_avc_decode_init(VADriverContextP ctx,
1230 struct decode_state *decode_state,
1231 struct gen7_mfd_context *gen7_mfd_context)
1233 VAPictureParameterBufferH264 *pic_param;
1234 VASliceParameterBufferH264 *slice_param;
1235 VAPictureH264 *va_pic;
1236 struct i965_driver_data *i965 = i965_driver_data(ctx);
1237 struct object_surface *obj_surface;
1239 int i, j, enable_avc_ildb = 0;
1240 unsigned int width_in_mbs, height_in_mbs;
1242 for (j = 0; j < decode_state->num_slice_params && enable_avc_ildb == 0; j++) {
1243 assert(decode_state->slice_params && decode_state->slice_params[j]->buffer);
1244 slice_param = (VASliceParameterBufferH264 *)decode_state->slice_params[j]->buffer;
1246 for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) {
1247 assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL);
1248 assert((slice_param->slice_type == SLICE_TYPE_I) ||
1249 (slice_param->slice_type == SLICE_TYPE_SI) ||
1250 (slice_param->slice_type == SLICE_TYPE_P) ||
1251 (slice_param->slice_type == SLICE_TYPE_SP) ||
1252 (slice_param->slice_type == SLICE_TYPE_B));
1254 if (slice_param->disable_deblocking_filter_idc != 1) {
1255 enable_avc_ildb = 1;
1263 assert(decode_state->pic_param && decode_state->pic_param->buffer);
1264 pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer;
1265 gen75_mfd_avc_frame_store_index(ctx, pic_param, gen7_mfd_context);
1266 width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1;
1267 height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1;
1268 assert(width_in_mbs > 0 && width_in_mbs <= 256); /* 4K */
1269 assert(height_in_mbs > 0 && height_in_mbs <= 256);
1271 /* Current decoded picture */
1272 va_pic = &pic_param->CurrPic;
1273 assert(!(va_pic->flags & VA_PICTURE_H264_INVALID));
1274 obj_surface = SURFACE(va_pic->picture_id);
1275 assert(obj_surface);
1276 obj_surface->flags &= ~SURFACE_REF_DIS_MASK;
1277 obj_surface->flags |= (pic_param->pic_fields.bits.reference_pic_flag ? SURFACE_REFERENCED : 0);
1278 i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC('N','V','1','2'), SUBSAMPLE_YUV420);
1279 gen75_mfd_init_avc_surface(ctx, pic_param, obj_surface);
1281 dri_bo_unreference(gen7_mfd_context->post_deblocking_output.bo);
1282 gen7_mfd_context->post_deblocking_output.bo = obj_surface->bo;
1283 dri_bo_reference(gen7_mfd_context->post_deblocking_output.bo);
1284 gen7_mfd_context->post_deblocking_output.valid = enable_avc_ildb;
1286 dri_bo_unreference(gen7_mfd_context->pre_deblocking_output.bo);
1287 gen7_mfd_context->pre_deblocking_output.bo = obj_surface->bo;
1288 dri_bo_reference(gen7_mfd_context->pre_deblocking_output.bo);
1289 gen7_mfd_context->pre_deblocking_output.valid = !enable_avc_ildb;
1291 dri_bo_unreference(gen7_mfd_context->intra_row_store_scratch_buffer.bo);
1292 bo = dri_bo_alloc(i965->intel.bufmgr,
1297 gen7_mfd_context->intra_row_store_scratch_buffer.bo = bo;
1298 gen7_mfd_context->intra_row_store_scratch_buffer.valid = 1;
1300 dri_bo_unreference(gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.bo);
1301 bo = dri_bo_alloc(i965->intel.bufmgr,
1302 "deblocking filter row store",
1303 width_in_mbs * 64 * 4,
1306 gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.bo = bo;
1307 gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.valid = 1;
1309 dri_bo_unreference(gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.bo);
1310 bo = dri_bo_alloc(i965->intel.bufmgr,
1311 "bsd mpc row store",
1312 width_in_mbs * 64 * 2,
1315 gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.bo = bo;
1316 gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.valid = 1;
1318 dri_bo_unreference(gen7_mfd_context->mpr_row_store_scratch_buffer.bo);
1319 bo = dri_bo_alloc(i965->intel.bufmgr,
1321 width_in_mbs * 64 * 2,
1324 gen7_mfd_context->mpr_row_store_scratch_buffer.bo = bo;
1325 gen7_mfd_context->mpr_row_store_scratch_buffer.valid = 1;
1327 gen7_mfd_context->bitplane_read_buffer.valid = 0;
1331 gen75_mfd_avc_decode_picture(VADriverContextP ctx,
1332 struct decode_state *decode_state,
1333 struct gen7_mfd_context *gen7_mfd_context)
1335 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
1336 VAPictureParameterBufferH264 *pic_param;
1337 VASliceParameterBufferH264 *slice_param, *next_slice_param, *next_slice_group_param;
1338 dri_bo *slice_data_bo;
1341 assert(decode_state->pic_param && decode_state->pic_param->buffer);
1342 pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer;
1343 gen75_mfd_avc_decode_init(ctx, decode_state, gen7_mfd_context);
1345 intel_batchbuffer_start_atomic_bcs(batch, 0x1000);
1346 intel_batchbuffer_emit_mi_flush(batch);
1347 gen75_mfd_pipe_mode_select(ctx, decode_state, MFX_FORMAT_AVC, gen7_mfd_context);
1348 gen75_mfd_surface_state(ctx, decode_state, MFX_FORMAT_AVC, gen7_mfd_context);
1349 gen75_mfd_pipe_buf_addr_state(ctx, decode_state, MFX_FORMAT_AVC, gen7_mfd_context);
1350 gen75_mfd_bsp_buf_base_addr_state(ctx, decode_state, MFX_FORMAT_AVC, gen7_mfd_context);
1351 gen75_mfd_avc_qm_state(ctx, decode_state, gen7_mfd_context);
1352 gen75_mfd_avc_img_state(ctx, decode_state, gen7_mfd_context);
1353 gen75_mfd_avc_picid_state(ctx, decode_state, gen7_mfd_context);
1355 for (j = 0; j < decode_state->num_slice_params; j++) {
1356 assert(decode_state->slice_params && decode_state->slice_params[j]->buffer);
1357 slice_param = (VASliceParameterBufferH264 *)decode_state->slice_params[j]->buffer;
1358 slice_data_bo = decode_state->slice_datas[j]->bo;
1359 gen75_mfd_ind_obj_base_addr_state(ctx, slice_data_bo, MFX_FORMAT_AVC, gen7_mfd_context);
1361 if (j == decode_state->num_slice_params - 1)
1362 next_slice_group_param = NULL;
1364 next_slice_group_param = (VASliceParameterBufferH264 *)decode_state->slice_params[j + 1]->buffer;
1366 for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) {
1367 assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL);
1368 assert((slice_param->slice_type == SLICE_TYPE_I) ||
1369 (slice_param->slice_type == SLICE_TYPE_SI) ||
1370 (slice_param->slice_type == SLICE_TYPE_P) ||
1371 (slice_param->slice_type == SLICE_TYPE_SP) ||
1372 (slice_param->slice_type == SLICE_TYPE_B));
1374 if (i < decode_state->slice_params[j]->num_elements - 1)
1375 next_slice_param = slice_param + 1;
1377 next_slice_param = next_slice_group_param;
1379 gen75_mfd_avc_directmode_state(ctx, pic_param, slice_param, gen7_mfd_context);
1380 gen75_mfd_avc_ref_idx_state(ctx, pic_param, slice_param, gen7_mfd_context);
1381 gen75_mfd_avc_weightoffset_state(ctx, pic_param, slice_param, gen7_mfd_context);
1382 gen75_mfd_avc_slice_state(ctx, pic_param, slice_param, next_slice_param, gen7_mfd_context);
1383 gen75_mfd_avc_bsd_object(ctx, pic_param, slice_param, slice_data_bo, next_slice_param, gen7_mfd_context);
1388 intel_batchbuffer_end_atomic(batch);
1389 intel_batchbuffer_flush(batch);
1393 gen75_mfd_mpeg2_decode_init(VADriverContextP ctx,
1394 struct decode_state *decode_state,
1395 struct gen7_mfd_context *gen7_mfd_context)
1397 VAPictureParameterBufferMPEG2 *pic_param;
1398 struct i965_driver_data *i965 = i965_driver_data(ctx);
1399 struct object_surface *obj_surface;
1401 unsigned int width_in_mbs;
1403 assert(decode_state->pic_param && decode_state->pic_param->buffer);
1404 pic_param = (VAPictureParameterBufferMPEG2 *)decode_state->pic_param->buffer;
1405 width_in_mbs = ALIGN(pic_param->horizontal_size, 16) / 16;
1407 mpeg2_set_reference_surfaces(
1409 gen7_mfd_context->reference_surface,
1414 /* Current decoded picture */
1415 obj_surface = SURFACE(decode_state->current_render_target);
1416 assert(obj_surface);
1417 i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC('N','V','1','2'), SUBSAMPLE_YUV420);
1419 dri_bo_unreference(gen7_mfd_context->pre_deblocking_output.bo);
1420 gen7_mfd_context->pre_deblocking_output.bo = obj_surface->bo;
1421 dri_bo_reference(gen7_mfd_context->pre_deblocking_output.bo);
1422 gen7_mfd_context->pre_deblocking_output.valid = 1;
1424 dri_bo_unreference(gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.bo);
1425 bo = dri_bo_alloc(i965->intel.bufmgr,
1426 "bsd mpc row store",
1430 gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.bo = bo;
1431 gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.valid = 1;
1433 gen7_mfd_context->post_deblocking_output.valid = 0;
1434 gen7_mfd_context->intra_row_store_scratch_buffer.valid = 0;
1435 gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.valid = 0;
1436 gen7_mfd_context->mpr_row_store_scratch_buffer.valid = 0;
1437 gen7_mfd_context->bitplane_read_buffer.valid = 0;
1441 gen75_mfd_mpeg2_pic_state(VADriverContextP ctx,
1442 struct decode_state *decode_state,
1443 struct gen7_mfd_context *gen7_mfd_context)
1445 struct i965_driver_data * const i965 = i965_driver_data(ctx);
1446 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
1447 VAPictureParameterBufferMPEG2 *pic_param;
1448 unsigned int slice_concealment_disable_bit = 0;
1450 assert(decode_state->pic_param && decode_state->pic_param->buffer);
1451 pic_param = (VAPictureParameterBufferMPEG2 *)decode_state->pic_param->buffer;
1453 slice_concealment_disable_bit = 1;
1455 BEGIN_BCS_BATCH(batch, 13);
1456 OUT_BCS_BATCH(batch, MFX_MPEG2_PIC_STATE | (13 - 2));
1457 OUT_BCS_BATCH(batch,
1458 (pic_param->f_code & 0xf) << 28 | /* f_code[1][1] */
1459 ((pic_param->f_code >> 4) & 0xf) << 24 | /* f_code[1][0] */
1460 ((pic_param->f_code >> 8) & 0xf) << 20 | /* f_code[0][1] */
1461 ((pic_param->f_code >> 12) & 0xf) << 16 | /* f_code[0][0] */
1462 pic_param->picture_coding_extension.bits.intra_dc_precision << 14 |
1463 pic_param->picture_coding_extension.bits.picture_structure << 12 |
1464 pic_param->picture_coding_extension.bits.top_field_first << 11 |
1465 pic_param->picture_coding_extension.bits.frame_pred_frame_dct << 10 |
1466 pic_param->picture_coding_extension.bits.concealment_motion_vectors << 9 |
1467 pic_param->picture_coding_extension.bits.q_scale_type << 8 |
1468 pic_param->picture_coding_extension.bits.intra_vlc_format << 7 |
1469 pic_param->picture_coding_extension.bits.alternate_scan << 6);
1470 OUT_BCS_BATCH(batch,
1471 pic_param->picture_coding_type << 9);
1472 OUT_BCS_BATCH(batch,
1473 (slice_concealment_disable_bit << 31) |
1474 ((ALIGN(pic_param->vertical_size, 16) / 16) - 1) << 16 |
1475 ((ALIGN(pic_param->horizontal_size, 16) / 16) - 1));
1476 OUT_BCS_BATCH(batch, 0);
1477 OUT_BCS_BATCH(batch, 0);
1478 OUT_BCS_BATCH(batch, 0);
1479 OUT_BCS_BATCH(batch, 0);
1480 OUT_BCS_BATCH(batch, 0);
1481 OUT_BCS_BATCH(batch, 0);
1482 OUT_BCS_BATCH(batch, 0);
1483 OUT_BCS_BATCH(batch, 0);
1484 OUT_BCS_BATCH(batch, 0);
1485 ADVANCE_BCS_BATCH(batch);
1489 gen75_mfd_mpeg2_qm_state(VADriverContextP ctx,
1490 struct decode_state *decode_state,
1491 struct gen7_mfd_context *gen7_mfd_context)
1493 VAIQMatrixBufferMPEG2 * const gen_iq_matrix = &gen7_mfd_context->iq_matrix.mpeg2;
1496 /* Update internal QM state */
1497 if (decode_state->iq_matrix && decode_state->iq_matrix->buffer) {
1498 VAIQMatrixBufferMPEG2 * const iq_matrix =
1499 (VAIQMatrixBufferMPEG2 *)decode_state->iq_matrix->buffer;
1501 if (gen_iq_matrix->load_intra_quantiser_matrix == -1 ||
1502 iq_matrix->load_intra_quantiser_matrix) {
1503 gen_iq_matrix->load_intra_quantiser_matrix =
1504 iq_matrix->load_intra_quantiser_matrix;
1505 if (iq_matrix->load_intra_quantiser_matrix) {
1506 for (j = 0; j < 64; j++)
1507 gen_iq_matrix->intra_quantiser_matrix[zigzag_direct[j]] =
1508 iq_matrix->intra_quantiser_matrix[j];
1512 if (gen_iq_matrix->load_non_intra_quantiser_matrix == -1 ||
1513 iq_matrix->load_non_intra_quantiser_matrix) {
1514 gen_iq_matrix->load_non_intra_quantiser_matrix =
1515 iq_matrix->load_non_intra_quantiser_matrix;
1516 if (iq_matrix->load_non_intra_quantiser_matrix) {
1517 for (j = 0; j < 64; j++)
1518 gen_iq_matrix->non_intra_quantiser_matrix[zigzag_direct[j]] =
1519 iq_matrix->non_intra_quantiser_matrix[j];
1524 /* Commit QM state to HW */
1525 for (i = 0; i < 2; i++) {
1526 unsigned char *qm = NULL;
1530 if (gen_iq_matrix->load_intra_quantiser_matrix) {
1531 qm = gen_iq_matrix->intra_quantiser_matrix;
1532 qm_type = MFX_QM_MPEG_INTRA_QUANTIZER_MATRIX;
1535 if (gen_iq_matrix->load_non_intra_quantiser_matrix) {
1536 qm = gen_iq_matrix->non_intra_quantiser_matrix;
1537 qm_type = MFX_QM_MPEG_NON_INTRA_QUANTIZER_MATRIX;
1544 gen75_mfd_qm_state(ctx, qm_type, qm, 64, gen7_mfd_context);
1549 gen75_mfd_mpeg2_bsd_object(VADriverContextP ctx,
1550 VAPictureParameterBufferMPEG2 *pic_param,
1551 VASliceParameterBufferMPEG2 *slice_param,
1552 VASliceParameterBufferMPEG2 *next_slice_param,
1553 struct gen7_mfd_context *gen7_mfd_context)
1555 struct i965_driver_data * const i965 = i965_driver_data(ctx);
1556 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
1557 unsigned int width_in_mbs = ALIGN(pic_param->horizontal_size, 16) / 16;
1558 int mb_count, vpos0, hpos0, vpos1, hpos1, is_field_pic_wa, is_field_pic = 0;
1560 if (pic_param->picture_coding_extension.bits.picture_structure == MPEG_TOP_FIELD ||
1561 pic_param->picture_coding_extension.bits.picture_structure == MPEG_BOTTOM_FIELD)
1563 is_field_pic_wa = is_field_pic &&
1564 gen7_mfd_context->wa_mpeg2_slice_vertical_position > 0;
1566 vpos0 = slice_param->slice_vertical_position / (1 + is_field_pic_wa);
1567 hpos0 = slice_param->slice_horizontal_position;
1569 if (next_slice_param == NULL) {
1570 vpos1 = ALIGN(pic_param->vertical_size, 16) / 16 / (1 + is_field_pic);
1573 vpos1 = next_slice_param->slice_vertical_position / (1 + is_field_pic_wa);
1574 hpos1 = next_slice_param->slice_horizontal_position;
1577 mb_count = (vpos1 * width_in_mbs + hpos1) - (vpos0 * width_in_mbs + hpos0);
1579 BEGIN_BCS_BATCH(batch, 5);
1580 OUT_BCS_BATCH(batch, MFD_MPEG2_BSD_OBJECT | (5 - 2));
1581 OUT_BCS_BATCH(batch,
1582 slice_param->slice_data_size - (slice_param->macroblock_offset >> 3));
1583 OUT_BCS_BATCH(batch,
1584 slice_param->slice_data_offset + (slice_param->macroblock_offset >> 3));
1585 OUT_BCS_BATCH(batch,
1589 (next_slice_param == NULL) << 5 |
1590 (next_slice_param == NULL) << 3 |
1591 (slice_param->macroblock_offset & 0x7));
1592 OUT_BCS_BATCH(batch,
1593 (slice_param->quantiser_scale_code << 24) |
1594 (vpos1 << 8 | hpos1));
1595 ADVANCE_BCS_BATCH(batch);
1599 gen75_mfd_mpeg2_decode_picture(VADriverContextP ctx,
1600 struct decode_state *decode_state,
1601 struct gen7_mfd_context *gen7_mfd_context)
1603 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
1604 VAPictureParameterBufferMPEG2 *pic_param;
1605 VASliceParameterBufferMPEG2 *slice_param, *next_slice_param, *next_slice_group_param;
1606 dri_bo *slice_data_bo;
1609 assert(decode_state->pic_param && decode_state->pic_param->buffer);
1610 pic_param = (VAPictureParameterBufferMPEG2 *)decode_state->pic_param->buffer;
1612 gen75_mfd_mpeg2_decode_init(ctx, decode_state, gen7_mfd_context);
1613 intel_batchbuffer_start_atomic_bcs(batch, 0x1000);
1614 intel_batchbuffer_emit_mi_flush(batch);
1615 gen75_mfd_pipe_mode_select(ctx, decode_state, MFX_FORMAT_MPEG2, gen7_mfd_context);
1616 gen75_mfd_surface_state(ctx, decode_state, MFX_FORMAT_MPEG2, gen7_mfd_context);
1617 gen75_mfd_pipe_buf_addr_state(ctx, decode_state, MFX_FORMAT_MPEG2, gen7_mfd_context);
1618 gen75_mfd_bsp_buf_base_addr_state(ctx, decode_state, MFX_FORMAT_MPEG2, gen7_mfd_context);
1619 gen75_mfd_mpeg2_pic_state(ctx, decode_state, gen7_mfd_context);
1620 gen75_mfd_mpeg2_qm_state(ctx, decode_state, gen7_mfd_context);
1622 if (gen7_mfd_context->wa_mpeg2_slice_vertical_position < 0)
1623 gen7_mfd_context->wa_mpeg2_slice_vertical_position =
1624 mpeg2_wa_slice_vertical_position(decode_state, pic_param);
1626 for (j = 0; j < decode_state->num_slice_params; j++) {
1627 assert(decode_state->slice_params && decode_state->slice_params[j]->buffer);
1628 slice_param = (VASliceParameterBufferMPEG2 *)decode_state->slice_params[j]->buffer;
1629 slice_data_bo = decode_state->slice_datas[j]->bo;
1630 gen75_mfd_ind_obj_base_addr_state(ctx, slice_data_bo, MFX_FORMAT_MPEG2, gen7_mfd_context);
1632 if (j == decode_state->num_slice_params - 1)
1633 next_slice_group_param = NULL;
1635 next_slice_group_param = (VASliceParameterBufferMPEG2 *)decode_state->slice_params[j + 1]->buffer;
1637 for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) {
1638 assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL);
1640 if (i < decode_state->slice_params[j]->num_elements - 1)
1641 next_slice_param = slice_param + 1;
1643 next_slice_param = next_slice_group_param;
1645 gen75_mfd_mpeg2_bsd_object(ctx, pic_param, slice_param, next_slice_param, gen7_mfd_context);
1650 intel_batchbuffer_end_atomic(batch);
1651 intel_batchbuffer_flush(batch);
1654 static const int va_to_gen7_vc1_pic_type[5] = {
1658 GEN7_VC1_BI_PICTURE,
1662 static const int va_to_gen7_vc1_mv[4] = {
1664 2, /* 1-MV half-pel */
1665 3, /* 1-MV half-pef bilinear */
1669 static const int b_picture_scale_factor[21] = {
1670 128, 85, 170, 64, 192,
1671 51, 102, 153, 204, 43,
1672 215, 37, 74, 111, 148,
1673 185, 222, 32, 96, 160,
1677 static const int va_to_gen7_vc1_condover[3] = {
1683 static const int va_to_gen7_vc1_profile[4] = {
1684 GEN7_VC1_SIMPLE_PROFILE,
1685 GEN7_VC1_MAIN_PROFILE,
1686 GEN7_VC1_RESERVED_PROFILE,
1687 GEN7_VC1_ADVANCED_PROFILE
1691 gen75_mfd_free_vc1_surface(void **data)
1693 struct gen7_vc1_surface *gen7_vc1_surface = *data;
1695 if (!gen7_vc1_surface)
1698 dri_bo_unreference(gen7_vc1_surface->dmv);
1699 free(gen7_vc1_surface);
1704 gen75_mfd_init_vc1_surface(VADriverContextP ctx,
1705 VAPictureParameterBufferVC1 *pic_param,
1706 struct object_surface *obj_surface)
1708 struct i965_driver_data *i965 = i965_driver_data(ctx);
1709 struct gen7_vc1_surface *gen7_vc1_surface = obj_surface->private_data;
1710 int width_in_mbs = ALIGN(pic_param->coded_width, 16) / 16;
1711 int height_in_mbs = ALIGN(pic_param->coded_height, 16) / 16;
1713 obj_surface->free_private_data = gen75_mfd_free_vc1_surface;
1715 if (!gen7_vc1_surface) {
1716 gen7_vc1_surface = calloc(sizeof(struct gen7_vc1_surface), 1);
1717 assert((obj_surface->size & 0x3f) == 0);
1718 obj_surface->private_data = gen7_vc1_surface;
1721 gen7_vc1_surface->picture_type = pic_param->picture_fields.bits.picture_type;
1723 if (gen7_vc1_surface->dmv == NULL) {
1724 gen7_vc1_surface->dmv = dri_bo_alloc(i965->intel.bufmgr,
1725 "direct mv w/r buffer",
1726 width_in_mbs * height_in_mbs * 64,
1732 gen75_mfd_vc1_decode_init(VADriverContextP ctx,
1733 struct decode_state *decode_state,
1734 struct gen7_mfd_context *gen7_mfd_context)
1736 VAPictureParameterBufferVC1 *pic_param;
1737 struct i965_driver_data *i965 = i965_driver_data(ctx);
1738 struct object_surface *obj_surface;
1743 assert(decode_state->pic_param && decode_state->pic_param->buffer);
1744 pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
1745 width_in_mbs = ALIGN(pic_param->coded_width, 16) / 16;
1747 /* reference picture */
1748 obj_surface = SURFACE(pic_param->forward_reference_picture);
1750 if (obj_surface && obj_surface->bo)
1751 gen7_mfd_context->reference_surface[0].surface_id = pic_param->forward_reference_picture;
1753 gen7_mfd_context->reference_surface[0].surface_id = VA_INVALID_ID;
1755 obj_surface = SURFACE(pic_param->backward_reference_picture);
1757 if (obj_surface && obj_surface->bo)
1758 gen7_mfd_context->reference_surface[1].surface_id = pic_param->backward_reference_picture;
1760 gen7_mfd_context->reference_surface[1].surface_id = pic_param->forward_reference_picture;
1762 /* must do so !!! */
1763 for (i = 2; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++)
1764 gen7_mfd_context->reference_surface[i].surface_id = gen7_mfd_context->reference_surface[i % 2].surface_id;
1766 /* Current decoded picture */
1767 obj_surface = SURFACE(decode_state->current_render_target);
1768 assert(obj_surface);
1769 i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC('N','V','1','2'), SUBSAMPLE_YUV420);
1770 gen75_mfd_init_vc1_surface(ctx, pic_param, obj_surface);
1772 dri_bo_unreference(gen7_mfd_context->post_deblocking_output.bo);
1773 gen7_mfd_context->post_deblocking_output.bo = obj_surface->bo;
1774 dri_bo_reference(gen7_mfd_context->post_deblocking_output.bo);
1775 gen7_mfd_context->post_deblocking_output.valid = pic_param->entrypoint_fields.bits.loopfilter;
1777 dri_bo_unreference(gen7_mfd_context->pre_deblocking_output.bo);
1778 gen7_mfd_context->pre_deblocking_output.bo = obj_surface->bo;
1779 dri_bo_reference(gen7_mfd_context->pre_deblocking_output.bo);
1780 gen7_mfd_context->pre_deblocking_output.valid = !pic_param->entrypoint_fields.bits.loopfilter;
1782 dri_bo_unreference(gen7_mfd_context->intra_row_store_scratch_buffer.bo);
1783 bo = dri_bo_alloc(i965->intel.bufmgr,
1788 gen7_mfd_context->intra_row_store_scratch_buffer.bo = bo;
1789 gen7_mfd_context->intra_row_store_scratch_buffer.valid = 1;
1791 dri_bo_unreference(gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.bo);
1792 bo = dri_bo_alloc(i965->intel.bufmgr,
1793 "deblocking filter row store",
1794 width_in_mbs * 6 * 64,
1797 gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.bo = bo;
1798 gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.valid = 1;
1800 dri_bo_unreference(gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.bo);
1801 bo = dri_bo_alloc(i965->intel.bufmgr,
1802 "bsd mpc row store",
1806 gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.bo = bo;
1807 gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.valid = 1;
1809 gen7_mfd_context->mpr_row_store_scratch_buffer.valid = 0;
1811 gen7_mfd_context->bitplane_read_buffer.valid = !!pic_param->bitplane_present.value;
1812 dri_bo_unreference(gen7_mfd_context->bitplane_read_buffer.bo);
1814 if (gen7_mfd_context->bitplane_read_buffer.valid) {
1815 int width_in_mbs = ALIGN(pic_param->coded_width, 16) / 16;
1816 int height_in_mbs = ALIGN(pic_param->coded_height, 16) / 16;
1817 int bitplane_width = ALIGN(width_in_mbs, 2) / 2;
1819 uint8_t *src = NULL, *dst = NULL;
1821 assert(decode_state->bit_plane->buffer);
1822 src = decode_state->bit_plane->buffer;
1824 bo = dri_bo_alloc(i965->intel.bufmgr,
1826 bitplane_width * bitplane_width,
1829 gen7_mfd_context->bitplane_read_buffer.bo = bo;
1831 dri_bo_map(bo, True);
1832 assert(bo->virtual);
1835 for (src_h = 0; src_h < height_in_mbs; src_h++) {
1836 for(src_w = 0; src_w < width_in_mbs; src_w++) {
1837 int src_index, dst_index;
1841 src_index = (src_h * width_in_mbs + src_w) / 2;
1842 src_shift = !((src_h * width_in_mbs + src_w) & 1) * 4;
1843 src_value = ((src[src_index] >> src_shift) & 0xf);
1845 dst_index = src_w / 2;
1846 dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
1850 dst[src_w / 2] >>= 4;
1852 dst += bitplane_width;
1857 gen7_mfd_context->bitplane_read_buffer.bo = NULL;
1861 gen75_mfd_vc1_pic_state(VADriverContextP ctx,
1862 struct decode_state *decode_state,
1863 struct gen7_mfd_context *gen7_mfd_context)
1865 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
1866 VAPictureParameterBufferVC1 *pic_param;
1867 struct i965_driver_data *i965 = i965_driver_data(ctx);
1868 struct object_surface *obj_surface;
1869 int alt_pquant_config = 0, alt_pquant_edge_mask = 0, alt_pq;
1870 int dquant, dquantfrm, dqprofile, dqdbedge, dqsbedge, dqbilevel;
1871 int unified_mv_mode;
1872 int ref_field_pic_polarity = 0;
1873 int scale_factor = 0;
1875 int dmv_surface_valid = 0;
1881 int interpolation_mode = 0;
1883 assert(decode_state->pic_param && decode_state->pic_param->buffer);
1884 pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
1886 profile = va_to_gen7_vc1_profile[pic_param->sequence_fields.bits.profile];
1887 dquant = pic_param->pic_quantizer_fields.bits.dquant;
1888 dquantfrm = pic_param->pic_quantizer_fields.bits.dq_frame;
1889 dqprofile = pic_param->pic_quantizer_fields.bits.dq_profile;
1890 dqdbedge = pic_param->pic_quantizer_fields.bits.dq_db_edge;
1891 dqsbedge = pic_param->pic_quantizer_fields.bits.dq_sb_edge;
1892 dqbilevel = pic_param->pic_quantizer_fields.bits.dq_binary_level;
1893 alt_pq = pic_param->pic_quantizer_fields.bits.alt_pic_quantizer;
1896 alt_pquant_config = 0;
1897 alt_pquant_edge_mask = 0;
1898 } else if (dquant == 2) {
1899 alt_pquant_config = 1;
1900 alt_pquant_edge_mask = 0xf;
1902 assert(dquant == 1);
1903 if (dquantfrm == 0) {
1904 alt_pquant_config = 0;
1905 alt_pquant_edge_mask = 0;
1908 assert(dquantfrm == 1);
1909 alt_pquant_config = 1;
1911 switch (dqprofile) {
1913 if (dqbilevel == 0) {
1914 alt_pquant_config = 2;
1915 alt_pquant_edge_mask = 0;
1917 assert(dqbilevel == 1);
1918 alt_pquant_config = 3;
1919 alt_pquant_edge_mask = 0;
1924 alt_pquant_edge_mask = 0xf;
1929 alt_pquant_edge_mask = 0x9;
1931 alt_pquant_edge_mask = (0x3 << dqdbedge);
1936 alt_pquant_edge_mask = (0x1 << dqsbedge);
1945 if (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation) {
1946 assert(pic_param->mv_fields.bits.mv_mode2 < 4);
1947 unified_mv_mode = va_to_gen7_vc1_mv[pic_param->mv_fields.bits.mv_mode2];
1949 assert(pic_param->mv_fields.bits.mv_mode < 4);
1950 unified_mv_mode = va_to_gen7_vc1_mv[pic_param->mv_fields.bits.mv_mode];
1953 if (pic_param->sequence_fields.bits.interlace == 1 &&
1954 pic_param->picture_fields.bits.frame_coding_mode != 0) { /* frame-interlace or field-interlace */
1955 /* FIXME: calculate reference field picture polarity */
1957 ref_field_pic_polarity = 0;
1960 if (pic_param->b_picture_fraction < 21)
1961 scale_factor = b_picture_scale_factor[pic_param->b_picture_fraction];
1963 picture_type = va_to_gen7_vc1_pic_type[pic_param->picture_fields.bits.picture_type];
1965 if (profile == GEN7_VC1_ADVANCED_PROFILE &&
1966 picture_type == GEN7_VC1_I_PICTURE)
1967 picture_type = GEN7_VC1_BI_PICTURE;
1969 if (picture_type == GEN7_VC1_I_PICTURE || picture_type == GEN7_VC1_BI_PICTURE) /* I picture */
1970 trans_ac_y = pic_param->transform_fields.bits.transform_ac_codingset_idx2;
1972 trans_ac_y = pic_param->transform_fields.bits.transform_ac_codingset_idx1;
1975 if (picture_type == GEN7_VC1_B_PICTURE) {
1976 struct gen7_vc1_surface *gen7_vc1_surface = NULL;
1978 obj_surface = SURFACE(pic_param->backward_reference_picture);
1979 assert(obj_surface);
1980 gen7_vc1_surface = obj_surface->private_data;
1982 if (!gen7_vc1_surface ||
1983 (va_to_gen7_vc1_pic_type[gen7_vc1_surface->picture_type] == GEN7_VC1_I_PICTURE ||
1984 va_to_gen7_vc1_pic_type[gen7_vc1_surface->picture_type] == GEN7_VC1_BI_PICTURE))
1985 dmv_surface_valid = 0;
1987 dmv_surface_valid = 1;
1990 assert(pic_param->picture_fields.bits.frame_coding_mode < 3);
1992 if (pic_param->picture_fields.bits.frame_coding_mode < 2)
1993 fcm = pic_param->picture_fields.bits.frame_coding_mode;
1995 if (pic_param->picture_fields.bits.top_field_first)
2001 if (pic_param->picture_fields.bits.picture_type == GEN7_VC1_B_PICTURE) { /* B picture */
2002 brfd = pic_param->reference_fields.bits.reference_distance;
2003 brfd = (scale_factor * brfd) >> 8;
2004 brfd = pic_param->reference_fields.bits.reference_distance - brfd - 1;
2010 overlap = pic_param->sequence_fields.bits.overlap;
2011 if (profile != GEN7_VC1_ADVANCED_PROFILE && pic_param->pic_quantizer_fields.bits.pic_quantizer_scale < 9)
2014 assert(pic_param->conditional_overlap_flag < 3);
2015 assert(pic_param->mv_fields.bits.mv_table < 4); /* FIXME: interlace mode */
2017 if (pic_param->mv_fields.bits.mv_mode == VAMvMode1MvHalfPelBilinear ||
2018 (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation &&
2019 pic_param->mv_fields.bits.mv_mode2 == VAMvMode1MvHalfPelBilinear))
2020 interpolation_mode = 9; /* Half-pel bilinear */
2021 else if (pic_param->mv_fields.bits.mv_mode == VAMvMode1MvHalfPel ||
2022 (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation &&
2023 pic_param->mv_fields.bits.mv_mode2 == VAMvMode1MvHalfPel))
2024 interpolation_mode = 1; /* Half-pel bicubic */
2026 interpolation_mode = 0; /* Quarter-pel bicubic */
2028 BEGIN_BCS_BATCH(batch, 6);
2029 OUT_BCS_BATCH(batch, MFD_VC1_LONG_PIC_STATE | (6 - 2));
2030 OUT_BCS_BATCH(batch,
2031 (((ALIGN(pic_param->coded_height, 16) / 16) - 1) << 16) |
2032 ((ALIGN(pic_param->coded_width, 16) / 16) - 1));
2033 OUT_BCS_BATCH(batch,
2034 ((ALIGN(pic_param->coded_width, 16) / 16 + 1) / 2 - 1) << 24 |
2035 dmv_surface_valid << 15 |
2036 (pic_param->pic_quantizer_fields.bits.quantizer == 0) << 14 | /* implicit quantizer */
2037 pic_param->rounding_control << 13 |
2038 pic_param->sequence_fields.bits.syncmarker << 12 |
2039 interpolation_mode << 8 |
2040 0 << 7 | /* FIXME: scale up or down ??? */
2041 pic_param->range_reduction_frame << 6 |
2042 pic_param->entrypoint_fields.bits.loopfilter << 5 |
2044 !pic_param->picture_fields.bits.is_first_field << 3 |
2045 (pic_param->sequence_fields.bits.profile == 3) << 0);
2046 OUT_BCS_BATCH(batch,
2047 va_to_gen7_vc1_condover[pic_param->conditional_overlap_flag] << 29 |
2048 picture_type << 26 |
2051 pic_param->pic_quantizer_fields.bits.pic_quantizer_scale << 8 |
2053 OUT_BCS_BATCH(batch,
2054 unified_mv_mode << 28 |
2055 pic_param->mv_fields.bits.four_mv_switch << 27 |
2056 pic_param->fast_uvmc_flag << 26 |
2057 ref_field_pic_polarity << 25 |
2058 pic_param->reference_fields.bits.num_reference_pictures << 24 |
2059 pic_param->reference_fields.bits.reference_distance << 20 |
2060 pic_param->reference_fields.bits.reference_distance << 16 | /* FIXME: ??? */
2061 pic_param->mv_fields.bits.extended_dmv_range << 10 |
2062 pic_param->mv_fields.bits.extended_mv_range << 8 |
2063 alt_pquant_edge_mask << 4 |
2064 alt_pquant_config << 2 |
2065 pic_param->pic_quantizer_fields.bits.half_qp << 1 |
2066 pic_param->pic_quantizer_fields.bits.pic_quantizer_type << 0);
2067 OUT_BCS_BATCH(batch,
2068 !!pic_param->bitplane_present.value << 31 |
2069 !pic_param->bitplane_present.flags.bp_forward_mb << 30 |
2070 !pic_param->bitplane_present.flags.bp_mv_type_mb << 29 |
2071 !pic_param->bitplane_present.flags.bp_skip_mb << 28 |
2072 !pic_param->bitplane_present.flags.bp_direct_mb << 27 |
2073 !pic_param->bitplane_present.flags.bp_overflags << 26 |
2074 !pic_param->bitplane_present.flags.bp_ac_pred << 25 |
2075 !pic_param->bitplane_present.flags.bp_field_tx << 24 |
2076 pic_param->mv_fields.bits.mv_table << 20 |
2077 pic_param->mv_fields.bits.four_mv_block_pattern_table << 18 |
2078 pic_param->mv_fields.bits.two_mv_block_pattern_table << 16 |
2079 pic_param->transform_fields.bits.frame_level_transform_type << 12 |
2080 pic_param->transform_fields.bits.mb_level_transform_type_flag << 11 |
2081 pic_param->mb_mode_table << 8 |
2083 pic_param->transform_fields.bits.transform_ac_codingset_idx1 << 4 |
2084 pic_param->transform_fields.bits.intra_transform_dc_table << 3 |
2085 pic_param->cbp_table << 0);
2086 ADVANCE_BCS_BATCH(batch);
2090 gen75_mfd_vc1_pred_pipe_state(VADriverContextP ctx,
2091 struct decode_state *decode_state,
2092 struct gen7_mfd_context *gen7_mfd_context)
2094 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2095 VAPictureParameterBufferVC1 *pic_param;
2096 int intensitycomp_single;
2098 assert(decode_state->pic_param && decode_state->pic_param->buffer);
2099 pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
2101 assert(decode_state->pic_param && decode_state->pic_param->buffer);
2102 pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
2103 intensitycomp_single = (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation);
2105 BEGIN_BCS_BATCH(batch, 6);
2106 OUT_BCS_BATCH(batch, MFX_VC1_PRED_PIPE_STATE | (6 - 2));
2107 OUT_BCS_BATCH(batch,
2108 0 << 14 | /* FIXME: double ??? */
2110 intensitycomp_single << 10 |
2111 intensitycomp_single << 8 |
2112 0 << 4 | /* FIXME: interlace mode */
2114 OUT_BCS_BATCH(batch,
2115 pic_param->luma_shift << 16 |
2116 pic_param->luma_scale << 0); /* FIXME: Luma Scaling */
2117 OUT_BCS_BATCH(batch, 0);
2118 OUT_BCS_BATCH(batch, 0);
2119 OUT_BCS_BATCH(batch, 0);
2120 ADVANCE_BCS_BATCH(batch);
2124 gen75_mfd_vc1_directmode_state_bplus(VADriverContextP ctx,
2125 struct decode_state *decode_state,
2126 struct gen7_mfd_context *gen7_mfd_context)
2128 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2129 VAPictureParameterBufferVC1 *pic_param;
2130 struct i965_driver_data *i965 = i965_driver_data(ctx);
2131 struct object_surface *obj_surface;
2132 dri_bo *dmv_read_buffer = NULL, *dmv_write_buffer = NULL;
2134 assert(decode_state->pic_param && decode_state->pic_param->buffer);
2135 pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
2137 obj_surface = SURFACE(decode_state->current_render_target);
2139 if (obj_surface && obj_surface->private_data) {
2140 dmv_write_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
2143 obj_surface = SURFACE(pic_param->backward_reference_picture);
2145 if (obj_surface && obj_surface->private_data) {
2146 dmv_read_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
2149 BEGIN_BCS_BATCH(batch, 7);
2150 OUT_BCS_BATCH(batch, MFX_VC1_DIRECTMODE_STATE | (7 - 2));
2152 if (dmv_write_buffer)
2153 OUT_BCS_RELOC(batch, dmv_write_buffer,
2154 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
2157 OUT_BCS_BATCH(batch, 0);
2159 OUT_BCS_BATCH(batch, 0);
2160 OUT_BCS_BATCH(batch, 0);
2162 if (dmv_read_buffer)
2163 OUT_BCS_RELOC(batch, dmv_read_buffer,
2164 I915_GEM_DOMAIN_INSTRUCTION, 0,
2167 OUT_BCS_BATCH(batch, 0);
2168 OUT_BCS_BATCH(batch, 0);
2169 OUT_BCS_BATCH(batch, 0);
2171 ADVANCE_BCS_BATCH(batch);
2175 gen75_mfd_vc1_directmode_state(VADriverContextP ctx,
2176 struct decode_state *decode_state,
2177 struct gen7_mfd_context *gen7_mfd_context)
2179 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2180 VAPictureParameterBufferVC1 *pic_param;
2181 struct i965_driver_data *i965 = i965_driver_data(ctx);
2182 struct object_surface *obj_surface;
2183 dri_bo *dmv_read_buffer = NULL, *dmv_write_buffer = NULL;
2185 if (IS_STEPPING_BPLUS(i965)) {
2186 gen75_mfd_vc1_directmode_state_bplus(ctx, decode_state, gen7_mfd_context);
2189 assert(decode_state->pic_param && decode_state->pic_param->buffer);
2190 pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
2192 obj_surface = SURFACE(decode_state->current_render_target);
2194 if (obj_surface && obj_surface->private_data) {
2195 dmv_write_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
2198 obj_surface = SURFACE(pic_param->backward_reference_picture);
2200 if (obj_surface && obj_surface->private_data) {
2201 dmv_read_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv;
2204 BEGIN_BCS_BATCH(batch, 3);
2205 OUT_BCS_BATCH(batch, MFX_VC1_DIRECTMODE_STATE | (3 - 2));
2207 if (dmv_write_buffer)
2208 OUT_BCS_RELOC(batch, dmv_write_buffer,
2209 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
2212 OUT_BCS_BATCH(batch, 0);
2214 if (dmv_read_buffer)
2215 OUT_BCS_RELOC(batch, dmv_read_buffer,
2216 I915_GEM_DOMAIN_INSTRUCTION, 0,
2219 OUT_BCS_BATCH(batch, 0);
2221 ADVANCE_BCS_BATCH(batch);
2225 gen75_mfd_vc1_get_macroblock_bit_offset(uint8_t *buf, int in_slice_data_bit_offset, int profile)
2227 int out_slice_data_bit_offset;
2228 int slice_header_size = in_slice_data_bit_offset / 8;
2232 out_slice_data_bit_offset = in_slice_data_bit_offset;
2234 for (i = 0, j = 0; i < slice_header_size; i++, j++) {
2235 if (!buf[j] && !buf[j + 1] && buf[j + 2] == 3 && buf[j + 3] < 4) {
2240 out_slice_data_bit_offset = 8 * j + in_slice_data_bit_offset % 8;
2243 return out_slice_data_bit_offset;
2247 gen75_mfd_vc1_bsd_object(VADriverContextP ctx,
2248 VAPictureParameterBufferVC1 *pic_param,
2249 VASliceParameterBufferVC1 *slice_param,
2250 VASliceParameterBufferVC1 *next_slice_param,
2251 dri_bo *slice_data_bo,
2252 struct gen7_mfd_context *gen7_mfd_context)
2254 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2255 int next_slice_start_vert_pos;
2256 int macroblock_offset;
2257 uint8_t *slice_data = NULL;
2259 dri_bo_map(slice_data_bo, 0);
2260 slice_data = (uint8_t *)(slice_data_bo->virtual + slice_param->slice_data_offset);
2261 macroblock_offset = gen75_mfd_vc1_get_macroblock_bit_offset(slice_data,
2262 slice_param->macroblock_offset,
2263 pic_param->sequence_fields.bits.profile);
2264 dri_bo_unmap(slice_data_bo);
2266 if (next_slice_param)
2267 next_slice_start_vert_pos = next_slice_param->slice_vertical_position;
2269 next_slice_start_vert_pos = ALIGN(pic_param->coded_height, 16) / 16;
2271 BEGIN_BCS_BATCH(batch, 5);
2272 OUT_BCS_BATCH(batch, MFD_VC1_BSD_OBJECT | (5 - 2));
2273 OUT_BCS_BATCH(batch,
2274 slice_param->slice_data_size - (macroblock_offset >> 3));
2275 OUT_BCS_BATCH(batch,
2276 slice_param->slice_data_offset + (macroblock_offset >> 3));
2277 OUT_BCS_BATCH(batch,
2278 slice_param->slice_vertical_position << 16 |
2279 next_slice_start_vert_pos << 0);
2280 OUT_BCS_BATCH(batch,
2281 (macroblock_offset & 0x7));
2282 ADVANCE_BCS_BATCH(batch);
2286 gen75_mfd_vc1_decode_picture(VADriverContextP ctx,
2287 struct decode_state *decode_state,
2288 struct gen7_mfd_context *gen7_mfd_context)
2290 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2291 VAPictureParameterBufferVC1 *pic_param;
2292 VASliceParameterBufferVC1 *slice_param, *next_slice_param, *next_slice_group_param;
2293 dri_bo *slice_data_bo;
2296 assert(decode_state->pic_param && decode_state->pic_param->buffer);
2297 pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
2299 gen75_mfd_vc1_decode_init(ctx, decode_state, gen7_mfd_context);
2300 intel_batchbuffer_start_atomic_bcs(batch, 0x1000);
2301 intel_batchbuffer_emit_mi_flush(batch);
2302 gen75_mfd_pipe_mode_select(ctx, decode_state, MFX_FORMAT_VC1, gen7_mfd_context);
2303 gen75_mfd_surface_state(ctx, decode_state, MFX_FORMAT_VC1, gen7_mfd_context);
2304 gen75_mfd_pipe_buf_addr_state(ctx, decode_state, MFX_FORMAT_VC1, gen7_mfd_context);
2305 gen75_mfd_bsp_buf_base_addr_state(ctx, decode_state, MFX_FORMAT_VC1, gen7_mfd_context);
2306 gen75_mfd_vc1_pic_state(ctx, decode_state, gen7_mfd_context);
2307 gen75_mfd_vc1_pred_pipe_state(ctx, decode_state, gen7_mfd_context);
2308 gen75_mfd_vc1_directmode_state(ctx, decode_state, gen7_mfd_context);
2310 for (j = 0; j < decode_state->num_slice_params; j++) {
2311 assert(decode_state->slice_params && decode_state->slice_params[j]->buffer);
2312 slice_param = (VASliceParameterBufferVC1 *)decode_state->slice_params[j]->buffer;
2313 slice_data_bo = decode_state->slice_datas[j]->bo;
2314 gen75_mfd_ind_obj_base_addr_state(ctx, slice_data_bo, MFX_FORMAT_VC1, gen7_mfd_context);
2316 if (j == decode_state->num_slice_params - 1)
2317 next_slice_group_param = NULL;
2319 next_slice_group_param = (VASliceParameterBufferVC1 *)decode_state->slice_params[j + 1]->buffer;
2321 for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) {
2322 assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL);
2324 if (i < decode_state->slice_params[j]->num_elements - 1)
2325 next_slice_param = slice_param + 1;
2327 next_slice_param = next_slice_group_param;
2329 gen75_mfd_vc1_bsd_object(ctx, pic_param, slice_param, next_slice_param, slice_data_bo, gen7_mfd_context);
2334 intel_batchbuffer_end_atomic(batch);
2335 intel_batchbuffer_flush(batch);
2339 gen75_mfd_jpeg_decode_init(VADriverContextP ctx,
2340 struct decode_state *decode_state,
2341 struct gen7_mfd_context *gen7_mfd_context)
2343 struct i965_driver_data *i965 = i965_driver_data(ctx);
2344 struct object_surface *obj_surface;
2345 VAPictureParameterBufferJPEGBaseline *pic_param;
2346 int subsampling = SUBSAMPLE_YUV420;
2348 pic_param = (VAPictureParameterBufferJPEGBaseline *)decode_state->pic_param->buffer;
2350 if (pic_param->num_components == 1)
2351 subsampling = SUBSAMPLE_YUV400;
2352 else if (pic_param->num_components == 3) {
2353 int h1 = pic_param->components[0].h_sampling_factor;
2354 int h2 = pic_param->components[1].h_sampling_factor;
2355 int h3 = pic_param->components[2].h_sampling_factor;
2356 int v1 = pic_param->components[0].v_sampling_factor;
2357 int v2 = pic_param->components[1].v_sampling_factor;
2358 int v3 = pic_param->components[2].v_sampling_factor;
2360 if (h1 == 2 && h2 == 1 && h3 == 1 &&
2361 v1 == 2 && v2 == 1 && v3 == 1)
2362 subsampling = SUBSAMPLE_YUV420;
2363 else if (h1 == 2 && h2 == 1 && h3 == 1 &&
2364 v1 == 1 && v2 == 1 && v3 == 1)
2365 subsampling = SUBSAMPLE_YUV422H;
2366 else if (h1 == 1 && h2 == 1 && h3 == 1 &&
2367 v1 == 1 && v2 == 1 && v3 == 1)
2368 subsampling = SUBSAMPLE_YUV444;
2369 else if (h1 == 4 && h2 == 1 && h3 == 1 &&
2370 v1 == 1 && v2 == 1 && v3 == 1)
2371 subsampling = SUBSAMPLE_YUV411;
2372 else if (h1 == 1 && h2 == 1 && h3 == 1 &&
2373 v1 == 2 && v2 == 1 && v3 == 1)
2374 subsampling = SUBSAMPLE_YUV422V;
2375 else if (h1 == 2 && h2 == 1 && h3 == 1 &&
2376 v1 == 2 && v2 == 2 && v3 == 2)
2377 subsampling = SUBSAMPLE_YUV422H;
2378 else if (h2 == 2 && h2 == 2 && h3 == 2 &&
2379 v1 == 2 && v2 == 1 && v3 == 1)
2380 subsampling = SUBSAMPLE_YUV422V;
2387 /* Current decoded picture */
2388 obj_surface = SURFACE(decode_state->current_render_target);
2389 assert(obj_surface);
2390 i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC('I','M','C','1'), subsampling);
2392 dri_bo_unreference(gen7_mfd_context->pre_deblocking_output.bo);
2393 gen7_mfd_context->pre_deblocking_output.bo = obj_surface->bo;
2394 dri_bo_reference(gen7_mfd_context->pre_deblocking_output.bo);
2395 gen7_mfd_context->pre_deblocking_output.valid = 1;
2397 gen7_mfd_context->post_deblocking_output.bo = NULL;
2398 gen7_mfd_context->post_deblocking_output.valid = 0;
2400 gen7_mfd_context->intra_row_store_scratch_buffer.bo = NULL;
2401 gen7_mfd_context->intra_row_store_scratch_buffer.valid = 0;
2403 gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.bo = NULL;
2404 gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.valid = 0;
2406 gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.bo = NULL;
2407 gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.valid = 0;
2409 gen7_mfd_context->mpr_row_store_scratch_buffer.bo = NULL;
2410 gen7_mfd_context->mpr_row_store_scratch_buffer.valid = 0;
2412 gen7_mfd_context->bitplane_read_buffer.bo = NULL;
2413 gen7_mfd_context->bitplane_read_buffer.valid = 0;
2416 static const int va_to_gen7_jpeg_rotation[4] = {
2417 GEN7_JPEG_ROTATION_0,
2418 GEN7_JPEG_ROTATION_90,
2419 GEN7_JPEG_ROTATION_180,
2420 GEN7_JPEG_ROTATION_270
2424 gen75_mfd_jpeg_pic_state(VADriverContextP ctx,
2425 struct decode_state *decode_state,
2426 struct gen7_mfd_context *gen7_mfd_context)
2428 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2429 VAPictureParameterBufferJPEGBaseline *pic_param;
2430 int chroma_type = GEN7_YUV420;
2431 int frame_width_in_blks;
2432 int frame_height_in_blks;
2434 assert(decode_state->pic_param && decode_state->pic_param->buffer);
2435 pic_param = (VAPictureParameterBufferJPEGBaseline *)decode_state->pic_param->buffer;
2437 if (pic_param->num_components == 1)
2438 chroma_type = GEN7_YUV400;
2439 else if (pic_param->num_components == 3) {
2440 int h1 = pic_param->components[0].h_sampling_factor;
2441 int h2 = pic_param->components[1].h_sampling_factor;
2442 int h3 = pic_param->components[2].h_sampling_factor;
2443 int v1 = pic_param->components[0].v_sampling_factor;
2444 int v2 = pic_param->components[1].v_sampling_factor;
2445 int v3 = pic_param->components[2].v_sampling_factor;
2447 if (h1 == 2 && h2 == 1 && h3 == 1 &&
2448 v1 == 2 && v2 == 1 && v3 == 1)
2449 chroma_type = GEN7_YUV420;
2450 else if (h1 == 2 && h2 == 1 && h3 == 1 &&
2451 v1 == 1 && v2 == 1 && v3 == 1)
2452 chroma_type = GEN7_YUV422H_2Y;
2453 else if (h1 == 1 && h2 == 1 && h3 == 1 &&
2454 v1 == 1 && v2 == 1 && v3 == 1)
2455 chroma_type = GEN7_YUV444;
2456 else if (h1 == 4 && h2 == 1 && h3 == 1 &&
2457 v1 == 1 && v2 == 1 && v3 == 1)
2458 chroma_type = GEN7_YUV411;
2459 else if (h1 == 1 && h2 == 1 && h3 == 1 &&
2460 v1 == 2 && v2 == 1 && v3 == 1)
2461 chroma_type = GEN7_YUV422V_2Y;
2462 else if (h1 == 2 && h2 == 1 && h3 == 1 &&
2463 v1 == 2 && v2 == 2 && v3 == 2)
2464 chroma_type = GEN7_YUV422H_4Y;
2465 else if (h2 == 2 && h2 == 2 && h3 == 2 &&
2466 v1 == 2 && v2 == 1 && v3 == 1)
2467 chroma_type = GEN7_YUV422V_4Y;
2472 if (chroma_type == GEN7_YUV400 ||
2473 chroma_type == GEN7_YUV444 ||
2474 chroma_type == GEN7_YUV422V_2Y) {
2475 frame_width_in_blks = ((pic_param->picture_width + 7) / 8);
2476 frame_height_in_blks = ((pic_param->picture_height + 7) / 8);
2477 } else if (chroma_type == GEN7_YUV411) {
2478 frame_width_in_blks = ((pic_param->picture_width + 31) / 32) * 4;
2479 frame_height_in_blks = ((pic_param->picture_height + 31) / 32) * 4;
2481 frame_width_in_blks = ((pic_param->picture_width + 15) / 16) * 2;
2482 frame_height_in_blks = ((pic_param->picture_height + 15) / 16) * 2;
2485 BEGIN_BCS_BATCH(batch, 3);
2486 OUT_BCS_BATCH(batch, MFX_JPEG_PIC_STATE | (3 - 2));
2487 OUT_BCS_BATCH(batch,
2488 (va_to_gen7_jpeg_rotation[0] << 4) | /* without rotation */
2489 (chroma_type << 0));
2490 OUT_BCS_BATCH(batch,
2491 ((frame_height_in_blks - 1) << 16) | /* FrameHeightInBlks */
2492 ((frame_width_in_blks - 1) << 0)); /* FrameWidthInBlks */
2493 ADVANCE_BCS_BATCH(batch);
2496 static const int va_to_gen7_jpeg_hufftable[2] = {
2502 gen75_mfd_jpeg_huff_table_state(VADriverContextP ctx,
2503 struct decode_state *decode_state,
2504 struct gen7_mfd_context *gen7_mfd_context,
2507 VAHuffmanTableBufferJPEGBaseline *huffman_table;
2508 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2511 if (!decode_state->huffman_table || !decode_state->huffman_table->buffer)
2514 huffman_table = (VAHuffmanTableBufferJPEGBaseline *)decode_state->huffman_table->buffer;
2516 for (index = 0; index < num_tables; index++) {
2517 int id = va_to_gen7_jpeg_hufftable[index];
2518 if (!huffman_table->load_huffman_table[index])
2520 BEGIN_BCS_BATCH(batch, 53);
2521 OUT_BCS_BATCH(batch, MFX_JPEG_HUFF_TABLE_STATE | (53 - 2));
2522 OUT_BCS_BATCH(batch, id);
2523 intel_batchbuffer_data(batch, huffman_table->huffman_table[index].num_dc_codes, 12);
2524 intel_batchbuffer_data(batch, huffman_table->huffman_table[index].dc_values, 12);
2525 intel_batchbuffer_data(batch, huffman_table->huffman_table[index].num_ac_codes, 16);
2526 intel_batchbuffer_data(batch, huffman_table->huffman_table[index].ac_values, 164);
2527 ADVANCE_BCS_BATCH(batch);
2531 static const int va_to_gen7_jpeg_qm[5] = {
2533 MFX_QM_JPEG_LUMA_Y_QUANTIZER_MATRIX,
2534 MFX_QM_JPEG_CHROMA_CB_QUANTIZER_MATRIX,
2535 MFX_QM_JPEG_CHROMA_CR_QUANTIZER_MATRIX,
2536 MFX_QM_JPEG_ALPHA_QUANTIZER_MATRIX
2540 gen75_mfd_jpeg_qm_state(VADriverContextP ctx,
2541 struct decode_state *decode_state,
2542 struct gen7_mfd_context *gen7_mfd_context)
2544 VAPictureParameterBufferJPEGBaseline *pic_param;
2545 VAIQMatrixBufferJPEGBaseline *iq_matrix;
2548 if (!decode_state->iq_matrix || !decode_state->iq_matrix->buffer)
2551 iq_matrix = (VAIQMatrixBufferJPEGBaseline *)decode_state->iq_matrix->buffer;
2552 pic_param = (VAPictureParameterBufferJPEGBaseline *)decode_state->pic_param->buffer;
2554 assert(pic_param->num_components <= 3);
2556 for (index = 0; index < pic_param->num_components; index++) {
2557 int qm_type = va_to_gen7_jpeg_qm[pic_param->components[index].component_id - pic_param->components[0].component_id + 1];
2558 unsigned char *qm = iq_matrix->quantiser_table[pic_param->components[index].quantiser_table_selector];
2559 unsigned char raster_qm[64];
2562 if (!iq_matrix->load_quantiser_table[pic_param->components[index].quantiser_table_selector])
2565 for (j = 0; j < 64; j++)
2566 raster_qm[zigzag_direct[j]] = qm[j];
2568 gen75_mfd_qm_state(ctx, qm_type, raster_qm, 64, gen7_mfd_context);
2573 gen75_mfd_jpeg_bsd_object(VADriverContextP ctx,
2574 VAPictureParameterBufferJPEGBaseline *pic_param,
2575 VASliceParameterBufferJPEGBaseline *slice_param,
2576 VASliceParameterBufferJPEGBaseline *next_slice_param,
2577 dri_bo *slice_data_bo,
2578 struct gen7_mfd_context *gen7_mfd_context)
2580 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2581 int scan_component_mask = 0;
2584 assert(slice_param->num_components > 0);
2585 assert(slice_param->num_components < 4);
2586 assert(slice_param->num_components <= pic_param->num_components);
2588 for (i = 0; i < slice_param->num_components; i++) {
2589 switch (slice_param->components[i].component_selector - pic_param->components[0].component_id + 1) {
2591 scan_component_mask |= (1 << 0);
2594 scan_component_mask |= (1 << 1);
2597 scan_component_mask |= (1 << 2);
2605 BEGIN_BCS_BATCH(batch, 6);
2606 OUT_BCS_BATCH(batch, MFD_JPEG_BSD_OBJECT | (6 - 2));
2607 OUT_BCS_BATCH(batch,
2608 slice_param->slice_data_size);
2609 OUT_BCS_BATCH(batch,
2610 slice_param->slice_data_offset);
2611 OUT_BCS_BATCH(batch,
2612 slice_param->slice_horizontal_position << 16 |
2613 slice_param->slice_vertical_position << 0);
2614 OUT_BCS_BATCH(batch,
2615 ((slice_param->num_components != 1) << 30) | /* interleaved */
2616 (scan_component_mask << 27) | /* scan components */
2617 (0 << 26) | /* disable interrupt allowed */
2618 (slice_param->num_mcus << 0)); /* MCU count */
2619 OUT_BCS_BATCH(batch,
2620 (slice_param->restart_interval << 0)); /* RestartInterval */
2621 ADVANCE_BCS_BATCH(batch);
2624 /* Workaround for JPEG decoding on Ivybridge */
2627 i965_DestroySurfaces(VADriverContextP ctx,
2628 VASurfaceID *surface_list,
2631 i965_CreateSurfaces(VADriverContextP ctx,
2636 VASurfaceID *surfaces);
2641 unsigned char data[32];
2643 int data_bit_offset;
2645 } gen7_jpeg_wa_clip = {
2649 0x65, 0xb8, 0x40, 0x32, 0x13, 0xfd, 0x06, 0x6c,
2650 0xfc, 0x0a, 0x50, 0x71, 0x5c, 0x00
2658 gen75_jpeg_wa_init(VADriverContextP ctx,
2659 struct gen7_mfd_context *gen7_mfd_context)
2661 struct i965_driver_data *i965 = i965_driver_data(ctx);
2663 struct object_surface *obj_surface;
2665 if (gen7_mfd_context->jpeg_wa_surface_id != VA_INVALID_SURFACE)
2666 i965_DestroySurfaces(ctx,
2667 &gen7_mfd_context->jpeg_wa_surface_id,
2670 status = i965_CreateSurfaces(ctx,
2671 gen7_jpeg_wa_clip.width,
2672 gen7_jpeg_wa_clip.height,
2673 VA_RT_FORMAT_YUV420,
2675 &gen7_mfd_context->jpeg_wa_surface_id);
2676 assert(status == VA_STATUS_SUCCESS);
2678 obj_surface = SURFACE(gen7_mfd_context->jpeg_wa_surface_id);
2679 assert(obj_surface);
2680 i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
2682 if (!gen7_mfd_context->jpeg_wa_slice_data_bo) {
2683 gen7_mfd_context->jpeg_wa_slice_data_bo = dri_bo_alloc(i965->intel.bufmgr,
2687 dri_bo_subdata(gen7_mfd_context->jpeg_wa_slice_data_bo,
2689 gen7_jpeg_wa_clip.data_size,
2690 gen7_jpeg_wa_clip.data);
2695 gen75_jpeg_wa_pipe_mode_select(VADriverContextP ctx,
2696 struct gen7_mfd_context *gen7_mfd_context)
2698 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2700 BEGIN_BCS_BATCH(batch, 5);
2701 OUT_BCS_BATCH(batch, MFX_PIPE_MODE_SELECT | (5 - 2));
2702 OUT_BCS_BATCH(batch,
2703 (MFX_LONG_MODE << 17) | /* Currently only support long format */
2704 (MFD_MODE_VLD << 15) | /* VLD mode */
2705 (0 << 10) | /* disable Stream-Out */
2706 (0 << 9) | /* Post Deblocking Output */
2707 (1 << 8) | /* Pre Deblocking Output */
2708 (0 << 5) | /* not in stitch mode */
2709 (MFX_CODEC_DECODE << 4) | /* decoding mode */
2710 (MFX_FORMAT_AVC << 0));
2711 OUT_BCS_BATCH(batch,
2712 (0 << 4) | /* terminate if AVC motion and POC table error occurs */
2713 (0 << 3) | /* terminate if AVC mbdata error occurs */
2714 (0 << 2) | /* terminate if AVC CABAC/CAVLC decode error occurs */
2717 OUT_BCS_BATCH(batch, 0); /* pic status/error report id */
2718 OUT_BCS_BATCH(batch, 0); /* reserved */
2719 ADVANCE_BCS_BATCH(batch);
2723 gen75_jpeg_wa_surface_state(VADriverContextP ctx,
2724 struct gen7_mfd_context *gen7_mfd_context)
2726 struct i965_driver_data *i965 = i965_driver_data(ctx);
2727 struct object_surface *obj_surface = SURFACE(gen7_mfd_context->jpeg_wa_surface_id);
2728 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2730 BEGIN_BCS_BATCH(batch, 6);
2731 OUT_BCS_BATCH(batch, MFX_SURFACE_STATE | (6 - 2));
2732 OUT_BCS_BATCH(batch, 0);
2733 OUT_BCS_BATCH(batch,
2734 ((obj_surface->orig_width - 1) << 18) |
2735 ((obj_surface->orig_height - 1) << 4));
2736 OUT_BCS_BATCH(batch,
2737 (MFX_SURFACE_PLANAR_420_8 << 28) | /* 420 planar YUV surface */
2738 (1 << 27) | /* interleave chroma, set to 0 for JPEG */
2739 (0 << 22) | /* surface object control state, ignored */
2740 ((obj_surface->width - 1) << 3) | /* pitch */
2741 (0 << 2) | /* must be 0 */
2742 (1 << 1) | /* must be tiled */
2743 (I965_TILEWALK_YMAJOR << 0)); /* tile walk, must be 1 */
2744 OUT_BCS_BATCH(batch,
2745 (0 << 16) | /* X offset for U(Cb), must be 0 */
2746 (obj_surface->y_cb_offset << 0)); /* Y offset for U(Cb) */
2747 OUT_BCS_BATCH(batch,
2748 (0 << 16) | /* X offset for V(Cr), must be 0 */
2749 (0 << 0)); /* Y offset for V(Cr), must be 0 for video codec, non-zoro for JPEG */
2750 ADVANCE_BCS_BATCH(batch);
2754 gen75_jpeg_wa_pipe_buf_addr_state_bplus(VADriverContextP ctx,
2755 struct gen7_mfd_context *gen7_mfd_context)
2757 struct i965_driver_data *i965 = i965_driver_data(ctx);
2758 struct object_surface *obj_surface = SURFACE(gen7_mfd_context->jpeg_wa_surface_id);
2759 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2763 intra_bo = dri_bo_alloc(i965->intel.bufmgr,
2768 BEGIN_BCS_BATCH(batch, 61);
2769 OUT_BCS_BATCH(batch, MFX_PIPE_BUF_ADDR_STATE | (61 - 2));
2770 OUT_BCS_RELOC(batch,
2772 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
2774 OUT_BCS_BATCH(batch, 0);
2775 OUT_BCS_BATCH(batch, 0);
2778 OUT_BCS_BATCH(batch, 0); /* post deblocking */
2779 OUT_BCS_BATCH(batch, 0);
2780 OUT_BCS_BATCH(batch, 0);
2782 /* uncompressed-video & stream out 7-12 */
2783 OUT_BCS_BATCH(batch, 0); /* ignore for decoding */
2784 OUT_BCS_BATCH(batch, 0); /* ignore for decoding */
2785 OUT_BCS_BATCH(batch, 0);
2786 OUT_BCS_BATCH(batch, 0);
2787 OUT_BCS_BATCH(batch, 0);
2788 OUT_BCS_BATCH(batch, 0);
2790 /* the DW 13-15 is for intra row store scratch */
2791 OUT_BCS_RELOC(batch,
2793 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
2795 OUT_BCS_BATCH(batch, 0);
2796 OUT_BCS_BATCH(batch, 0);
2798 /* the DW 16-18 is for deblocking filter */
2799 OUT_BCS_BATCH(batch, 0);
2800 OUT_BCS_BATCH(batch, 0);
2801 OUT_BCS_BATCH(batch, 0);
2804 for (i = 0; i < MAX_GEN_REFERENCE_FRAMES; i++) {
2805 OUT_BCS_BATCH(batch, 0);
2806 OUT_BCS_BATCH(batch, 0);
2808 OUT_BCS_BATCH(batch, 0);
2810 /* the DW52-54 is for mb status address */
2811 OUT_BCS_BATCH(batch, 0);
2812 OUT_BCS_BATCH(batch, 0);
2813 OUT_BCS_BATCH(batch, 0);
2814 /* the DW56-60 is for ILDB & second ILDB address */
2815 OUT_BCS_BATCH(batch, 0);
2816 OUT_BCS_BATCH(batch, 0);
2817 OUT_BCS_BATCH(batch, 0);
2818 OUT_BCS_BATCH(batch, 0);
2819 OUT_BCS_BATCH(batch, 0);
2820 OUT_BCS_BATCH(batch, 0);
2822 ADVANCE_BCS_BATCH(batch);
2824 dri_bo_unreference(intra_bo);
2827 gen75_jpeg_wa_pipe_buf_addr_state(VADriverContextP ctx,
2828 struct gen7_mfd_context *gen7_mfd_context)
2830 struct i965_driver_data *i965 = i965_driver_data(ctx);
2831 struct object_surface *obj_surface = SURFACE(gen7_mfd_context->jpeg_wa_surface_id);
2832 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2836 if (IS_STEPPING_BPLUS(i965)) {
2837 gen75_jpeg_wa_pipe_buf_addr_state_bplus(ctx, gen7_mfd_context);
2840 intra_bo = dri_bo_alloc(i965->intel.bufmgr,
2845 BEGIN_BCS_BATCH(batch, 25);
2846 OUT_BCS_BATCH(batch, MFX_PIPE_BUF_ADDR_STATE | (25 - 2));
2847 OUT_BCS_RELOC(batch,
2849 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
2852 OUT_BCS_BATCH(batch, 0); /* post deblocking */
2854 OUT_BCS_BATCH(batch, 0); /* ignore for decoding */
2855 OUT_BCS_BATCH(batch, 0); /* ignore for decoding */
2857 OUT_BCS_RELOC(batch,
2859 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
2862 OUT_BCS_BATCH(batch, 0);
2865 for (i = 0; i < MAX_GEN_REFERENCE_FRAMES; i++) {
2866 OUT_BCS_BATCH(batch, 0);
2869 OUT_BCS_BATCH(batch, 0); /* ignore DW23 for decoding */
2870 OUT_BCS_BATCH(batch, 0);
2871 ADVANCE_BCS_BATCH(batch);
2873 dri_bo_unreference(intra_bo);
2877 gen75_jpeg_wa_bsp_buf_base_addr_state_bplus(VADriverContextP ctx,
2878 struct gen7_mfd_context *gen7_mfd_context)
2880 struct i965_driver_data *i965 = i965_driver_data(ctx);
2881 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2882 dri_bo *bsd_mpc_bo, *mpr_bo;
2884 bsd_mpc_bo = dri_bo_alloc(i965->intel.bufmgr,
2885 "bsd mpc row store",
2886 11520, /* 1.5 * 120 * 64 */
2889 mpr_bo = dri_bo_alloc(i965->intel.bufmgr,
2891 7680, /* 1. 0 * 120 * 64 */
2894 BEGIN_BCS_BATCH(batch, 10);
2895 OUT_BCS_BATCH(batch, MFX_BSP_BUF_BASE_ADDR_STATE | (10 - 2));
2897 OUT_BCS_RELOC(batch,
2899 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
2902 OUT_BCS_BATCH(batch, 0);
2903 OUT_BCS_BATCH(batch, 0);
2905 OUT_BCS_RELOC(batch,
2907 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
2909 OUT_BCS_BATCH(batch, 0);
2910 OUT_BCS_BATCH(batch, 0);
2912 OUT_BCS_BATCH(batch, 0);
2913 OUT_BCS_BATCH(batch, 0);
2914 OUT_BCS_BATCH(batch, 0);
2916 ADVANCE_BCS_BATCH(batch);
2918 dri_bo_unreference(bsd_mpc_bo);
2919 dri_bo_unreference(mpr_bo);
2923 gen75_jpeg_wa_bsp_buf_base_addr_state(VADriverContextP ctx,
2924 struct gen7_mfd_context *gen7_mfd_context)
2926 struct i965_driver_data *i965 = i965_driver_data(ctx);
2927 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2928 dri_bo *bsd_mpc_bo, *mpr_bo;
2930 if (IS_STEPPING_BPLUS(i965)) {
2931 gen75_jpeg_wa_bsp_buf_base_addr_state_bplus(ctx, gen7_mfd_context);
2935 bsd_mpc_bo = dri_bo_alloc(i965->intel.bufmgr,
2936 "bsd mpc row store",
2937 11520, /* 1.5 * 120 * 64 */
2940 mpr_bo = dri_bo_alloc(i965->intel.bufmgr,
2942 7680, /* 1. 0 * 120 * 64 */
2945 BEGIN_BCS_BATCH(batch, 4);
2946 OUT_BCS_BATCH(batch, MFX_BSP_BUF_BASE_ADDR_STATE | (4 - 2));
2948 OUT_BCS_RELOC(batch,
2950 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
2953 OUT_BCS_RELOC(batch,
2955 I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
2957 OUT_BCS_BATCH(batch, 0);
2959 ADVANCE_BCS_BATCH(batch);
2961 dri_bo_unreference(bsd_mpc_bo);
2962 dri_bo_unreference(mpr_bo);
2966 gen75_jpeg_wa_avc_qm_state(VADriverContextP ctx,
2967 struct gen7_mfd_context *gen7_mfd_context)
2973 gen75_jpeg_wa_avc_img_state(VADriverContextP ctx,
2974 struct gen7_mfd_context *gen7_mfd_context)
2976 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
2978 int mbaff_frame_flag = 0;
2979 unsigned int width_in_mbs = 1, height_in_mbs = 1;
2981 BEGIN_BCS_BATCH(batch, 16);
2982 OUT_BCS_BATCH(batch, MFX_AVC_IMG_STATE | (16 - 2));
2983 OUT_BCS_BATCH(batch,
2984 width_in_mbs * height_in_mbs);
2985 OUT_BCS_BATCH(batch,
2986 ((height_in_mbs - 1) << 16) |
2987 ((width_in_mbs - 1) << 0));
2988 OUT_BCS_BATCH(batch,
2993 (0 << 12) | /* differ from GEN6 */
2996 OUT_BCS_BATCH(batch,
2997 (1 << 10) | /* 4:2:0 */
2998 (1 << 7) | /* CABAC */
3004 (mbaff_frame_flag << 1) |
3006 OUT_BCS_BATCH(batch, 0);
3007 OUT_BCS_BATCH(batch, 0);
3008 OUT_BCS_BATCH(batch, 0);
3009 OUT_BCS_BATCH(batch, 0);
3010 OUT_BCS_BATCH(batch, 0);
3011 OUT_BCS_BATCH(batch, 0);
3012 OUT_BCS_BATCH(batch, 0);
3013 OUT_BCS_BATCH(batch, 0);
3014 OUT_BCS_BATCH(batch, 0);
3015 OUT_BCS_BATCH(batch, 0);
3016 OUT_BCS_BATCH(batch, 0);
3017 ADVANCE_BCS_BATCH(batch);
3021 gen75_jpeg_wa_avc_directmode_state_bplus(VADriverContextP ctx,
3022 struct gen7_mfd_context *gen7_mfd_context)
3024 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
3027 BEGIN_BCS_BATCH(batch, 71);
3028 OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (71 - 2));
3030 /* reference surfaces 0..15 */
3031 for (i = 0; i < MAX_GEN_REFERENCE_FRAMES; i++) {
3032 OUT_BCS_BATCH(batch, 0); /* top */
3033 OUT_BCS_BATCH(batch, 0); /* bottom */
3036 OUT_BCS_BATCH(batch, 0);
3038 /* the current decoding frame/field */
3039 OUT_BCS_BATCH(batch, 0); /* top */
3040 OUT_BCS_BATCH(batch, 0);
3041 OUT_BCS_BATCH(batch, 0);
3044 for (i = 0; i < MAX_GEN_REFERENCE_FRAMES; i++) {
3045 OUT_BCS_BATCH(batch, 0);
3046 OUT_BCS_BATCH(batch, 0);
3049 OUT_BCS_BATCH(batch, 0);
3050 OUT_BCS_BATCH(batch, 0);
3052 ADVANCE_BCS_BATCH(batch);
3056 gen75_jpeg_wa_avc_directmode_state(VADriverContextP ctx,
3057 struct gen7_mfd_context *gen7_mfd_context)
3059 struct i965_driver_data *i965 = i965_driver_data(ctx);
3060 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
3063 if (IS_STEPPING_BPLUS(i965)) {
3064 gen75_jpeg_wa_avc_directmode_state_bplus(ctx, gen7_mfd_context);
3068 BEGIN_BCS_BATCH(batch, 69);
3069 OUT_BCS_BATCH(batch, MFX_AVC_DIRECTMODE_STATE | (69 - 2));
3071 /* reference surfaces 0..15 */
3072 for (i = 0; i < MAX_GEN_REFERENCE_FRAMES; i++) {
3073 OUT_BCS_BATCH(batch, 0); /* top */
3074 OUT_BCS_BATCH(batch, 0); /* bottom */
3077 /* the current decoding frame/field */
3078 OUT_BCS_BATCH(batch, 0); /* top */
3079 OUT_BCS_BATCH(batch, 0); /* bottom */
3082 for (i = 0; i < MAX_GEN_REFERENCE_FRAMES; i++) {
3083 OUT_BCS_BATCH(batch, 0);
3084 OUT_BCS_BATCH(batch, 0);
3087 OUT_BCS_BATCH(batch, 0);
3088 OUT_BCS_BATCH(batch, 0);
3090 ADVANCE_BCS_BATCH(batch);
3094 gen75_jpeg_wa_ind_obj_base_addr_state_bplus(VADriverContextP ctx,
3095 struct gen7_mfd_context *gen7_mfd_context)
3097 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
3099 BEGIN_BCS_BATCH(batch, 11);
3100 OUT_BCS_BATCH(batch, MFX_IND_OBJ_BASE_ADDR_STATE | (11 - 2));
3101 OUT_BCS_RELOC(batch,
3102 gen7_mfd_context->jpeg_wa_slice_data_bo,
3103 I915_GEM_DOMAIN_INSTRUCTION, 0,
3105 OUT_BCS_BATCH(batch, 0x80000000); /* must set, up to 2G */
3106 OUT_BCS_BATCH(batch, 0); /* ignore for VLD mode */
3107 OUT_BCS_BATCH(batch, 0);
3108 OUT_BCS_BATCH(batch, 0); /* ignore for VLD mode */
3109 OUT_BCS_BATCH(batch, 0);
3110 OUT_BCS_BATCH(batch, 0); /* ignore for VLD mode */
3111 OUT_BCS_BATCH(batch, 0);
3112 OUT_BCS_BATCH(batch, 0); /* ignore for VLD mode */
3113 OUT_BCS_BATCH(batch, 0);
3114 ADVANCE_BCS_BATCH(batch);
3118 gen75_jpeg_wa_ind_obj_base_addr_state(VADriverContextP ctx,
3119 struct gen7_mfd_context *gen7_mfd_context)
3121 struct i965_driver_data *i965 = i965_driver_data(ctx);
3122 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
3124 if (IS_STEPPING_BPLUS(i965)) {
3125 gen75_jpeg_wa_ind_obj_base_addr_state_bplus(ctx, gen7_mfd_context);
3128 BEGIN_BCS_BATCH(batch, 11);
3129 OUT_BCS_BATCH(batch, MFX_IND_OBJ_BASE_ADDR_STATE | (11 - 2));
3130 OUT_BCS_RELOC(batch,
3131 gen7_mfd_context->jpeg_wa_slice_data_bo,
3132 I915_GEM_DOMAIN_INSTRUCTION, 0,
3134 OUT_BCS_BATCH(batch, 0x80000000); /* must set, up to 2G */
3135 OUT_BCS_BATCH(batch, 0); /* ignore for VLD mode */
3136 OUT_BCS_BATCH(batch, 0);
3137 OUT_BCS_BATCH(batch, 0); /* ignore for VLD mode */
3138 OUT_BCS_BATCH(batch, 0);
3139 OUT_BCS_BATCH(batch, 0); /* ignore for VLD mode */
3140 OUT_BCS_BATCH(batch, 0);
3141 OUT_BCS_BATCH(batch, 0); /* ignore for VLD mode */
3142 OUT_BCS_BATCH(batch, 0);
3143 ADVANCE_BCS_BATCH(batch);
3147 gen75_jpeg_wa_avc_bsd_object(VADriverContextP ctx,
3148 struct gen7_mfd_context *gen7_mfd_context)
3150 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
3152 /* the input bitsteam format on GEN7 differs from GEN6 */
3153 BEGIN_BCS_BATCH(batch, 6);
3154 OUT_BCS_BATCH(batch, MFD_AVC_BSD_OBJECT | (6 - 2));
3155 OUT_BCS_BATCH(batch, gen7_jpeg_wa_clip.data_size);
3156 OUT_BCS_BATCH(batch, 0);
3157 OUT_BCS_BATCH(batch,
3163 OUT_BCS_BATCH(batch,
3164 ((gen7_jpeg_wa_clip.data_bit_offset >> 3) << 16) |
3167 (1 << 3) | /* LastSlice Flag */
3168 (gen7_jpeg_wa_clip.data_bit_offset & 0x7));
3169 OUT_BCS_BATCH(batch, 0);
3170 ADVANCE_BCS_BATCH(batch);
3174 gen75_jpeg_wa_avc_slice_state(VADriverContextP ctx,
3175 struct gen7_mfd_context *gen7_mfd_context)
3177 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
3178 int slice_hor_pos = 0, slice_ver_pos = 0, next_slice_hor_pos = 0, next_slice_ver_pos = 1;
3179 int num_ref_idx_l0 = 0, num_ref_idx_l1 = 0;
3180 int first_mb_in_slice = 0;
3181 int slice_type = SLICE_TYPE_I;
3183 BEGIN_BCS_BATCH(batch, 11);
3184 OUT_BCS_BATCH(batch, MFX_AVC_SLICE_STATE | (11 - 2));
3185 OUT_BCS_BATCH(batch, slice_type);
3186 OUT_BCS_BATCH(batch,
3187 (num_ref_idx_l1 << 24) |
3188 (num_ref_idx_l0 << 16) |
3191 OUT_BCS_BATCH(batch,
3193 (1 << 27) | /* disable Deblocking */
3195 (gen7_jpeg_wa_clip.qp << 16) |
3198 OUT_BCS_BATCH(batch,
3199 (slice_ver_pos << 24) |
3200 (slice_hor_pos << 16) |
3201 (first_mb_in_slice << 0));
3202 OUT_BCS_BATCH(batch,
3203 (next_slice_ver_pos << 16) |
3204 (next_slice_hor_pos << 0));
3205 OUT_BCS_BATCH(batch, (1 << 19)); /* last slice flag */
3206 OUT_BCS_BATCH(batch, 0);
3207 OUT_BCS_BATCH(batch, 0);
3208 OUT_BCS_BATCH(batch, 0);
3209 OUT_BCS_BATCH(batch, 0);
3210 ADVANCE_BCS_BATCH(batch);
3214 gen75_mfd_jpeg_wa(VADriverContextP ctx,
3215 struct gen7_mfd_context *gen7_mfd_context)
3217 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
3218 gen75_jpeg_wa_init(ctx, gen7_mfd_context);
3219 intel_batchbuffer_emit_mi_flush(batch);
3220 gen75_jpeg_wa_pipe_mode_select(ctx, gen7_mfd_context);
3221 gen75_jpeg_wa_surface_state(ctx, gen7_mfd_context);
3222 gen75_jpeg_wa_pipe_buf_addr_state(ctx, gen7_mfd_context);
3223 gen75_jpeg_wa_bsp_buf_base_addr_state(ctx, gen7_mfd_context);
3224 gen75_jpeg_wa_avc_qm_state(ctx, gen7_mfd_context);
3225 gen75_jpeg_wa_avc_img_state(ctx, gen7_mfd_context);
3226 gen75_jpeg_wa_ind_obj_base_addr_state(ctx, gen7_mfd_context);
3228 gen75_jpeg_wa_avc_directmode_state(ctx, gen7_mfd_context);
3229 gen75_jpeg_wa_avc_slice_state(ctx, gen7_mfd_context);
3230 gen75_jpeg_wa_avc_bsd_object(ctx, gen7_mfd_context);
3234 gen75_mfd_jpeg_decode_picture(VADriverContextP ctx,
3235 struct decode_state *decode_state,
3236 struct gen7_mfd_context *gen7_mfd_context)
3238 struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
3239 VAPictureParameterBufferJPEGBaseline *pic_param;
3240 VASliceParameterBufferJPEGBaseline *slice_param, *next_slice_param, *next_slice_group_param;
3241 dri_bo *slice_data_bo;
3242 int i, j, max_selector = 0;
3244 assert(decode_state->pic_param && decode_state->pic_param->buffer);
3245 pic_param = (VAPictureParameterBufferJPEGBaseline *)decode_state->pic_param->buffer;
3247 /* Currently only support Baseline DCT */
3248 gen75_mfd_jpeg_decode_init(ctx, decode_state, gen7_mfd_context);
3249 intel_batchbuffer_start_atomic_bcs(batch, 0x1000);
3250 gen75_mfd_jpeg_wa(ctx, gen7_mfd_context);
3251 intel_batchbuffer_emit_mi_flush(batch);
3252 gen75_mfd_pipe_mode_select(ctx, decode_state, MFX_FORMAT_JPEG, gen7_mfd_context);
3253 gen75_mfd_surface_state(ctx, decode_state, MFX_FORMAT_JPEG, gen7_mfd_context);
3254 gen75_mfd_pipe_buf_addr_state(ctx, decode_state, MFX_FORMAT_JPEG, gen7_mfd_context);
3255 gen75_mfd_jpeg_pic_state(ctx, decode_state, gen7_mfd_context);
3256 gen75_mfd_jpeg_qm_state(ctx, decode_state, gen7_mfd_context);
3258 for (j = 0; j < decode_state->num_slice_params; j++) {
3259 assert(decode_state->slice_params && decode_state->slice_params[j]->buffer);
3260 slice_param = (VASliceParameterBufferJPEGBaseline *)decode_state->slice_params[j]->buffer;
3261 slice_data_bo = decode_state->slice_datas[j]->bo;
3262 gen75_mfd_ind_obj_base_addr_state(ctx, slice_data_bo, MFX_FORMAT_JPEG, gen7_mfd_context);
3264 if (j == decode_state->num_slice_params - 1)
3265 next_slice_group_param = NULL;
3267 next_slice_group_param = (VASliceParameterBufferJPEGBaseline *)decode_state->slice_params[j + 1]->buffer;
3269 for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) {
3272 assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL);
3274 if (i < decode_state->slice_params[j]->num_elements - 1)
3275 next_slice_param = slice_param + 1;
3277 next_slice_param = next_slice_group_param;
3279 for (component = 0; component < slice_param->num_components; component++) {
3280 if (max_selector < slice_param->components[component].dc_table_selector)
3281 max_selector = slice_param->components[component].dc_table_selector;
3283 if (max_selector < slice_param->components[component].ac_table_selector)
3284 max_selector = slice_param->components[component].ac_table_selector;
3291 assert(max_selector < 2);
3292 gen75_mfd_jpeg_huff_table_state(ctx, decode_state, gen7_mfd_context, max_selector + 1);
3294 for (j = 0; j < decode_state->num_slice_params; j++) {
3295 assert(decode_state->slice_params && decode_state->slice_params[j]->buffer);
3296 slice_param = (VASliceParameterBufferJPEGBaseline *)decode_state->slice_params[j]->buffer;
3297 slice_data_bo = decode_state->slice_datas[j]->bo;
3298 gen75_mfd_ind_obj_base_addr_state(ctx, slice_data_bo, MFX_FORMAT_JPEG, gen7_mfd_context);
3300 if (j == decode_state->num_slice_params - 1)
3301 next_slice_group_param = NULL;
3303 next_slice_group_param = (VASliceParameterBufferJPEGBaseline *)decode_state->slice_params[j + 1]->buffer;
3305 for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) {
3306 assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL);
3308 if (i < decode_state->slice_params[j]->num_elements - 1)
3309 next_slice_param = slice_param + 1;
3311 next_slice_param = next_slice_group_param;
3313 gen75_mfd_jpeg_bsd_object(ctx, pic_param, slice_param, next_slice_param, slice_data_bo, gen7_mfd_context);
3318 intel_batchbuffer_end_atomic(batch);
3319 intel_batchbuffer_flush(batch);
3323 gen75_mfd_decode_picture(VADriverContextP ctx,
3325 union codec_state *codec_state,
3326 struct hw_context *hw_context)
3329 struct gen7_mfd_context *gen7_mfd_context = (struct gen7_mfd_context *)hw_context;
3330 struct decode_state *decode_state = &codec_state->decode;
3332 assert(gen7_mfd_context);
3334 gen7_mfd_context->wa_mpeg2_slice_vertical_position = -1;
3337 case VAProfileMPEG2Simple:
3338 case VAProfileMPEG2Main:
3339 gen75_mfd_mpeg2_decode_picture(ctx, decode_state, gen7_mfd_context);
3342 case VAProfileH264Baseline:
3343 case VAProfileH264Main:
3344 case VAProfileH264High:
3345 gen75_mfd_avc_decode_picture(ctx, decode_state, gen7_mfd_context);
3348 case VAProfileVC1Simple:
3349 case VAProfileVC1Main:
3350 case VAProfileVC1Advanced:
3351 gen75_mfd_vc1_decode_picture(ctx, decode_state, gen7_mfd_context);
3354 case VAProfileJPEGBaseline:
3355 gen75_mfd_jpeg_decode_picture(ctx, decode_state, gen7_mfd_context);
3365 gen75_mfd_context_destroy(void *hw_context)
3367 struct gen7_mfd_context *gen7_mfd_context = (struct gen7_mfd_context *)hw_context;
3369 dri_bo_unreference(gen7_mfd_context->post_deblocking_output.bo);
3370 gen7_mfd_context->post_deblocking_output.bo = NULL;
3372 dri_bo_unreference(gen7_mfd_context->pre_deblocking_output.bo);
3373 gen7_mfd_context->pre_deblocking_output.bo = NULL;
3375 dri_bo_unreference(gen7_mfd_context->intra_row_store_scratch_buffer.bo);
3376 gen7_mfd_context->intra_row_store_scratch_buffer.bo = NULL;
3378 dri_bo_unreference(gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.bo);
3379 gen7_mfd_context->deblocking_filter_row_store_scratch_buffer.bo = NULL;
3381 dri_bo_unreference(gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.bo);
3382 gen7_mfd_context->bsd_mpc_row_store_scratch_buffer.bo = NULL;
3384 dri_bo_unreference(gen7_mfd_context->mpr_row_store_scratch_buffer.bo);
3385 gen7_mfd_context->mpr_row_store_scratch_buffer.bo = NULL;
3387 dri_bo_unreference(gen7_mfd_context->bitplane_read_buffer.bo);
3388 gen7_mfd_context->bitplane_read_buffer.bo = NULL;
3390 dri_bo_unreference(gen7_mfd_context->jpeg_wa_slice_data_bo);
3392 intel_batchbuffer_free(gen7_mfd_context->base.batch);
3393 free(gen7_mfd_context);
3396 static void gen75_mfd_mpeg2_context_init(VADriverContextP ctx,
3397 struct gen7_mfd_context *gen7_mfd_context)
3399 gen7_mfd_context->iq_matrix.mpeg2.load_intra_quantiser_matrix = -1;
3400 gen7_mfd_context->iq_matrix.mpeg2.load_non_intra_quantiser_matrix = -1;
3401 gen7_mfd_context->iq_matrix.mpeg2.load_chroma_intra_quantiser_matrix = -1;
3402 gen7_mfd_context->iq_matrix.mpeg2.load_chroma_non_intra_quantiser_matrix = -1;
3406 gen75_dec_hw_context_init(VADriverContextP ctx, struct object_config *obj_config)
3408 struct intel_driver_data *intel = intel_driver_data(ctx);
3409 struct gen7_mfd_context *gen7_mfd_context = calloc(1, sizeof(struct gen7_mfd_context));
3412 gen7_mfd_context->base.destroy = gen75_mfd_context_destroy;
3413 gen7_mfd_context->base.run = gen75_mfd_decode_picture;
3414 gen7_mfd_context->base.batch = intel_batchbuffer_new(intel, I915_EXEC_RENDER);
3416 for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->reference_surface); i++) {
3417 gen7_mfd_context->reference_surface[i].surface_id = VA_INVALID_ID;
3418 gen7_mfd_context->reference_surface[i].frame_store_id = -1;
3421 gen7_mfd_context->jpeg_wa_surface_id = VA_INVALID_SURFACE;
3423 switch (obj_config->profile) {
3424 case VAProfileMPEG2Simple:
3425 case VAProfileMPEG2Main:
3426 gen75_mfd_mpeg2_context_init(ctx, gen7_mfd_context);
3429 case VAProfileH264Baseline:
3430 case VAProfileH264Main:
3431 case VAProfileH264High:
3432 gen75_mfd_avc_context_init(ctx, gen7_mfd_context);
3437 return (struct hw_context *)gen7_mfd_context;