diff options
-rw-r--r-- | src/gen6_mfc.c | 21 | ||||
-rw-r--r-- | src/gen6_mfc_common.c | 11 | ||||
-rw-r--r-- | src/gen6_vme.h | 1 | ||||
-rw-r--r-- | src/gen75_mfc.c | 5 | ||||
-rw-r--r-- | src/shaders/utils/mfc_batchbuffer.inc | 2 | ||||
-rw-r--r-- | src/shaders/utils/mfc_batchbuffer_avc_inter.asm | 6 | ||||
-rw-r--r-- | src/shaders/utils/mfc_batchbuffer_avc_inter.g6b | 6 | ||||
-rw-r--r-- | src/shaders/utils/mfc_batchbuffer_avc_inter.g7b | 6 |
8 files changed, 43 insertions, 15 deletions
diff --git a/src/gen6_mfc.c b/src/gen6_mfc.c index 62fa2e93..d152ed98 100644 --- a/src/gen6_mfc.c +++ b/src/gen6_mfc.c @@ -708,6 +708,7 @@ gen6_mfc_avc_pak_object_inter(VADriverContextP ctx, int x, int y, int end_mb, in unsigned char target_mb_size,unsigned char max_mb_size, int slice_type, struct intel_batchbuffer *batch) { + struct gen6_vme_context *vme_context = encoder_context->vme_context; int len_in_dwords = 11; if (batch == NULL) @@ -737,8 +738,8 @@ gen6_mfc_avc_pak_object_inter(VADriverContextP ctx, int x, int y, int end_mb, in /*Stuff for Inter MB*/ OUT_BCS_BATCH(batch, msg[1]); - OUT_BCS_BATCH(batch, 0x0); - OUT_BCS_BATCH(batch, 0x0); + OUT_BCS_BATCH(batch, vme_context->ref_index_in_mb[0]); + OUT_BCS_BATCH(batch, vme_context->ref_index_in_mb[1]); /*MaxSizeInWord and TargetSzieInWord*/ OUT_BCS_BATCH(batch, (max_mb_size << 24) | @@ -1004,11 +1005,12 @@ gen6_mfc_batchbuffer_emit_object_command(struct intel_batchbuffer *batch, int mb_x, int mb_y, int width_in_mbs, - int qp) + int qp, + unsigned int ref_index[2]) { - BEGIN_BATCH(batch, 12); + BEGIN_BATCH(batch, 14); - OUT_BATCH(batch, CMD_MEDIA_OBJECT | (12 - 2)); + OUT_BATCH(batch, CMD_MEDIA_OBJECT | (14 - 2)); OUT_BATCH(batch, index); OUT_BATCH(batch, 0); OUT_BATCH(batch, 0); @@ -1032,6 +1034,8 @@ gen6_mfc_batchbuffer_emit_object_command(struct intel_batchbuffer *batch, OUT_BATCH(batch, qp << 16 | width_in_mbs); + OUT_BATCH(batch, ref_index[0]); + OUT_BATCH(batch, ref_index[1]); ADVANCE_BATCH(batch); } @@ -1049,6 +1053,7 @@ gen6_mfc_avc_batchbuffer_slice_command(VADriverContextP ctx, { struct intel_batchbuffer *batch = encoder_context->base.batch; struct gen6_mfc_context *mfc_context = encoder_context->mfc_context; + struct gen6_vme_context *vme_context = encoder_context->vme_context; int width_in_mbs = (mfc_context->surface_state.width + 15) / 16; int total_mbs = slice_param->num_macroblocks; int number_mb_cmds = 128; @@ -1080,7 +1085,8 @@ gen6_mfc_avc_batchbuffer_slice_command(VADriverContextP ctx, mb_x, mb_y, width_in_mbs, - qp); + qp, + vme_context->ref_index_in_mb); if (first_object) { head_offset += head_size; @@ -1118,7 +1124,8 @@ gen6_mfc_avc_batchbuffer_slice_command(VADriverContextP ctx, mb_x, mb_y, width_in_mbs, - qp); + qp, + vme_context->ref_index_in_mb); } } diff --git a/src/gen6_mfc_common.c b/src/gen6_mfc_common.c index 5c3f82fc..5605ef3f 100644 --- a/src/gen6_mfc_common.c +++ b/src/gen6_mfc_common.c @@ -1336,6 +1336,7 @@ intel_avc_vme_reference_state(VADriverContextP ctx, int max_num_references; VAPictureH264 *curr_pic; VAPictureH264 *ref_list; + int ref_idx; if (list_index == 0) { max_num_references = pic_param->num_ref_idx_l0_active_minus1 + 1; @@ -1362,9 +1363,9 @@ intel_avc_vme_reference_state(VADriverContextP ctx, obj_surface = encode_state->reference_objects[list_index]; vme_context->used_references[list_index] = &pic_param->ReferenceFrames[list_index]; } - } else { - int ref_idx; + ref_idx = 0; + } else { curr_pic = &pic_param->CurrPic; /* select the reference frame in temporal space */ @@ -1380,10 +1381,16 @@ intel_avc_vme_reference_state(VADriverContextP ctx, if (obj_surface && obj_surface->bo) { + assert(ref_idx >= 0); vme_context->used_reference_objects[list_index] = obj_surface; vme_source_surface_state(ctx, surface_index, obj_surface, encoder_context); + vme_context->ref_index_in_mb[list_index] = (ref_idx << 24 | + ref_idx << 16 | + ref_idx << 8 | + ref_idx); } else { vme_context->used_reference_objects[list_index] = NULL; vme_context->used_references[list_index] = NULL; + vme_context->ref_index_in_mb[list_index] = 0; } } diff --git a/src/gen6_vme.h b/src/gen6_vme.h index 45f1472f..939a4a37 100644 --- a/src/gen6_vme.h +++ b/src/gen6_vme.h @@ -89,6 +89,7 @@ struct gen6_vme_context struct object_surface *used_reference_objects[2]; void *used_references[2]; + unsigned int ref_index_in_mb[2]; }; #define MPEG2_PIC_WIDTH_HEIGHT 30 diff --git a/src/gen75_mfc.c b/src/gen75_mfc.c index 4eecc9c7..c92f74de 100644 --- a/src/gen75_mfc.c +++ b/src/gen75_mfc.c @@ -1040,6 +1040,7 @@ gen75_mfc_avc_pak_object_inter(VADriverContextP ctx, int x, int y, int end_mb, i unsigned char target_mb_size,unsigned char max_mb_size, int slice_type, struct intel_batchbuffer *batch) { + struct gen6_vme_context *vme_context = encoder_context->vme_context; int len_in_dwords = 12; unsigned int inter_msg = 0; if (batch == NULL) @@ -1117,8 +1118,8 @@ gen75_mfc_avc_pak_object_inter(VADriverContextP ctx, int x, int y, int end_mb, i inter_msg = msg[1] >> 8; /*Stuff for Inter MB*/ OUT_BCS_BATCH(batch, inter_msg); - OUT_BCS_BATCH(batch, 0x0); - OUT_BCS_BATCH(batch, 0x0); + OUT_BCS_BATCH(batch, vme_context->ref_index_in_mb[0]); + OUT_BCS_BATCH(batch, vme_context->ref_index_in_mb[1]); /*MaxSizeInWord and TargetSzieInWord*/ OUT_BCS_BATCH(batch, (max_mb_size << 24) | diff --git a/src/shaders/utils/mfc_batchbuffer.inc b/src/shaders/utils/mfc_batchbuffer.inc index c83d5d43..c3a0fec6 100644 --- a/src/shaders/utils/mfc_batchbuffer.inc +++ b/src/shaders/utils/mfc_batchbuffer.inc @@ -139,6 +139,8 @@ define(`mb_y', `inline_reg0.17') /* :ub, */ define(`mb_xy', `inline_reg0.16') /* :uw, */ define(`width_in_mb', `inline_reg0.20') /* :uw, the picture width in macroblocks */ define(`qp', `inline_reg0.22') /* :ub, */ +define(`ref_idx0', `inline_reg0.24') /* :ud */ +define(`ref_idx1', `inline_reg0.28') /* :ud */ /* * GRF 8~15 -- temporary registers diff --git a/src/shaders/utils/mfc_batchbuffer_avc_inter.asm b/src/shaders/utils/mfc_batchbuffer_avc_inter.asm index 59152b88..549f0213 100644 --- a/src/shaders/utils/mfc_batchbuffer_avc_inter.asm +++ b/src/shaders/utils/mfc_batchbuffer_avc_inter.asm @@ -103,6 +103,12 @@ __FILL_INTER_PAK_COMMAND: /* DW7 */ mov (1) pak_object7_ud<1>:ud ob_read_wb0.4<0,1,0>:ud {align1} ; + /* DW8 */ + mov (1) pak_object8_ud<1>:ud ref_idx0<0,1,0>:ud {align1} ; + + /* DW9 */ + mov (1) pak_object9_ud<1>:ud ref_idx1<0,1,0>:ud {align1} ; + jmpi (1) __OUTPUT_PAK_COMMAND ; __FILL_INTRA_PAK_COMMAND: diff --git a/src/shaders/utils/mfc_batchbuffer_avc_inter.g6b b/src/shaders/utils/mfc_batchbuffer_avc_inter.g6b index 2e1703e4..24b268f5 100644 --- a/src/shaders/utils/mfc_batchbuffer_avc_inter.g6b +++ b/src/shaders/utils/mfc_batchbuffer_avc_inter.g6b @@ -24,7 +24,7 @@ { 0x00800001, 0x23400061, 0x00000000, 0x00000000 }, { 0x01000005, 0x20002d28, 0x020000ac, 0x00020002 }, { 0x01000005, 0x20000c20, 0x00000200, 0x00002000 }, - { 0x00110020, 0x34001c00, 0x00001400, 0x00000022 }, + { 0x00110020, 0x34001c00, 0x00001400, 0x00000026 }, { 0x00000001, 0x23400061, 0x00000000, 0x71490009 }, { 0x00000041, 0x23480c21, 0x000001e0, 0x000000a0 }, { 0x00000001, 0x23540061, 0x00000000, 0x000f000f }, @@ -41,6 +41,8 @@ { 0x00110001, 0x23580061, 0x00000000, 0x00000000 }, { 0x00000040, 0x23584421, 0x00000358, 0x000000b6 }, { 0x00000001, 0x235c0021, 0x00000204, 0x00000000 }, + { 0x00000001, 0x23600021, 0x000000b8, 0x00000000 }, + { 0x00000001, 0x23640021, 0x000000bc, 0x00000000 }, { 0x00000020, 0x34001c00, 0x00001400, 0x00000022 }, { 0x00000001, 0x23400061, 0x00000000, 0x71490009 }, { 0x00000001, 0x23540061, 0x00000000, 0x000f000f }, @@ -67,7 +69,7 @@ { 0x00000040, 0x21480c21, 0x00000148, 0x00000004 }, { 0x00000040, 0x21e00c21, 0x000001e0, 0x00000001 }, { 0x01000040, 0x20ae3dad, 0x000000ae, 0xffffffff }, - { 0x00110020, 0x34001c00, 0x00001400, 0xffffff9e }, + { 0x00110020, 0x34001c00, 0x00001400, 0xffffff9a }, { 0x00010020, 0x34001c00, 0x02001400, 0x0000001e }, { 0x00600001, 0x20000022, 0x008d0120, 0x00000000 }, { 0x05800031, 0x22001cc9, 0x00000000, 0x021a0001 }, diff --git a/src/shaders/utils/mfc_batchbuffer_avc_inter.g7b b/src/shaders/utils/mfc_batchbuffer_avc_inter.g7b index 1664010b..f0e20128 100644 --- a/src/shaders/utils/mfc_batchbuffer_avc_inter.g7b +++ b/src/shaders/utils/mfc_batchbuffer_avc_inter.g7b @@ -24,7 +24,7 @@ { 0x00800001, 0x23400061, 0x00000000, 0x00000000 }, { 0x01000005, 0x20002d28, 0x020000ac, 0x00020002 }, { 0x01000005, 0x20000c20, 0x00000200, 0x00002000 }, - { 0x00110020, 0x34001c00, 0x00001400, 0x00000022 }, + { 0x00110020, 0x34001c00, 0x00001400, 0x00000026 }, { 0x00000001, 0x23400061, 0x00000000, 0x71490009 }, { 0x00000041, 0x23480c21, 0x000001e0, 0x000000a0 }, { 0x00000001, 0x23540061, 0x00000000, 0x000f000f }, @@ -41,6 +41,8 @@ { 0x00110001, 0x23580061, 0x00000000, 0x00000000 }, { 0x00000040, 0x23584421, 0x00000358, 0x000000b6 }, { 0x00000001, 0x235c0021, 0x00000204, 0x00000000 }, + { 0x00000001, 0x23600021, 0x000000b8, 0x00000000 }, + { 0x00000001, 0x23640021, 0x000000bc, 0x00000000 }, { 0x00000020, 0x34001c00, 0x00001400, 0x00000022 }, { 0x00000001, 0x23400061, 0x00000000, 0x71490009 }, { 0x00000001, 0x23540061, 0x00000000, 0x000f000f }, @@ -67,7 +69,7 @@ { 0x00000040, 0x21480c21, 0x00000148, 0x00000004 }, { 0x00000040, 0x21e00c21, 0x000001e0, 0x00000001 }, { 0x01000040, 0x20ae3dad, 0x000000ae, 0xffffffff }, - { 0x00110020, 0x34001c00, 0x00001400, 0xffffff9e }, + { 0x00110020, 0x34001c00, 0x00001400, 0xffffff9a }, { 0x00010020, 0x34001c00, 0x02001400, 0x0000001e }, { 0x00600001, 0x28000021, 0x008d0120, 0x00000000 }, { 0x0a800031, 0x22001ca9, 0x00000800, 0x02180001 }, |