summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gen6_mfc.c21
-rw-r--r--src/gen6_mfc_common.c11
-rw-r--r--src/gen6_vme.h1
-rw-r--r--src/gen75_mfc.c5
-rw-r--r--src/shaders/utils/mfc_batchbuffer.inc2
-rw-r--r--src/shaders/utils/mfc_batchbuffer_avc_inter.asm6
-rw-r--r--src/shaders/utils/mfc_batchbuffer_avc_inter.g6b6
-rw-r--r--src/shaders/utils/mfc_batchbuffer_avc_inter.g7b6
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 },