summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhao Yakui <yakui.zhao@intel.com>2013-08-12 15:13:24 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2013-09-06 15:34:41 +0800
commit58e4c588326b332c2250842f6dd103a6e17adf2a (patch)
tree55f62a3cd6dd176863c87cc4200ad0433225df77
parentb6b6d3b86d9d587f4986c8a6c8ec70f643ff63cd (diff)
Optimize MPEG2 encoding on Ivb
This is backported from Haswell. The scoreboard/walker/cost-center is applied. Signed-off-by: Zhao yakui <yakui.zhao@intel.com> (cherry picked from commit cc7452d14f7faa1d5b5fa8c16db3e3cb3fd4f53d)
-rw-r--r--src/gen7_vme.c39
-rw-r--r--src/shaders/vme/mpeg2_inter_ivb.asm5
-rw-r--r--src/shaders/vme/mpeg2_inter_ivb.g7b9
-rw-r--r--src/shaders/vme/vme7_mpeg2.inc3
4 files changed, 43 insertions, 13 deletions
diff --git a/src/gen7_vme.c b/src/gen7_vme.c
index 847e801..097fe08 100644
--- a/src/gen7_vme.c
+++ b/src/gen7_vme.c
@@ -466,6 +466,9 @@ static VAStatus gen7_vme_mpeg2_state_setup(VADriverContextP ctx,
struct gen6_vme_context *vme_context = encoder_context->vme_context;
unsigned int *vme_state_message;
int i;
+ unsigned int *mb_cost_table;
+
+ mb_cost_table = (unsigned int *)vme_context->vme_state_message;
//building VME state message
dri_bo_map(vme_context->vme_state.bo, 1);
@@ -487,12 +490,12 @@ static VAStatus gen7_vme_mpeg2_state_setup(VADriverContextP ctx,
vme_state_message[12] = 0x00;
vme_state_message[13] = 0x00;
- vme_state_message[14] = 0x4a4a;
- vme_state_message[15] = 0x0;
- vme_state_message[16] = 0x4a4a4a4a;
- vme_state_message[17] = 0x4a4a4a4a;
- vme_state_message[18] = 0x21110100;
- vme_state_message[19] = 0x61514131;
+ vme_state_message[14] = (mb_cost_table[2] & 0xFFFF);
+ vme_state_message[15] = 0;
+ vme_state_message[16] = mb_cost_table[0];
+ vme_state_message[17] = 0;
+ vme_state_message[18] = mb_cost_table[3];
+ vme_state_message[19] = mb_cost_table[4];
for(i = 20; i < 32; i++) {
vme_state_message[i] = 0;
@@ -916,7 +919,29 @@ gen7_vme_mpeg2_pipeline_programing(VADriverContextP ctx,
int width_in_mbs = ALIGN(seq_param->picture_width, 16) / 16;
int height_in_mbs = ALIGN(seq_param->picture_height, 16) / 16;
- gen7_vme_mpeg2_fill_vme_batchbuffer(ctx,
+ bool allow_hwscore = true;
+ int s;
+
+ for (s = 0; s < encode_state->num_slice_params_ext; s++) {
+ int j;
+ VAEncSliceParameterBufferMPEG2 *slice_param = (VAEncSliceParameterBufferMPEG2 *)encode_state->slice_params_ext[s]->buffer;
+
+ for (j = 0; j < encode_state->slice_params_ext[s]->num_elements; j++) {
+ if (slice_param->macroblock_address % width_in_mbs) {
+ allow_hwscore = false;
+ break;
+ }
+ }
+ }
+
+ if (allow_hwscore)
+ gen7_vme_mpeg2_walker_fill_vme_batchbuffer(ctx,
+ encode_state,
+ width_in_mbs, height_in_mbs,
+ MPEG2_VME_INTER_SHADER,
+ encoder_context);
+ else
+ gen7_vme_mpeg2_fill_vme_batchbuffer(ctx,
encode_state,
width_in_mbs, height_in_mbs,
MPEG2_VME_INTER_SHADER,
diff --git a/src/shaders/vme/mpeg2_inter_ivb.asm b/src/shaders/vme/mpeg2_inter_ivb.asm
index 3c7661f..57522e1 100644
--- a/src/shaders/vme/mpeg2_inter_ivb.asm
+++ b/src/shaders/vme/mpeg2_inter_ivb.asm
@@ -344,6 +344,7 @@ mov (1) mb_mvp_ref.2<1>:w RET_ARG<0,1,0>:w {align1};
__mb_hwdep_end:
+mov (2) mv_cc_ref.0<1>:w mba_result.4<2,2,1>:w {align1};
/* Calibrate the ref window for MPEG2 */
mov (1) vme_m0.0<1>:W -16:W {align1};
@@ -405,8 +406,8 @@ mov (1) tmp_reg0.0<1>:uw 0x04:uw {align1};
add (1) vme_m1.30<1>:ub vme_m1.30<0,1,0>:ub tmp_reg0.0<0,1,0>:ub {align1};
/* Set the MV cost center */
-mov (1) vme_m1.16<1>:ud mb_mvp_ref.0<0,1,0>:ud {align1};
-mov (1) vme_m1.20<1>:ud mb_mvp_ref.0<0,1,0>:ud {align1};
+mov (1) vme_m1.16<1>:ud mv_cc_ref.0<0,1,0>:ud {align1};
+mov (1) vme_m1.20<1>:ud mv_cc_ref.0<0,1,0>:ud {align1};
mov (8) vme_msg_1.0<1>:UD vme_m1.0<8,8,1>:UD {align1};
diff --git a/src/shaders/vme/mpeg2_inter_ivb.g7b b/src/shaders/vme/mpeg2_inter_ivb.g7b
index 96466d1..2973488 100644
--- a/src/shaders/vme/mpeg2_inter_ivb.g7b
+++ b/src/shaders/vme/mpeg2_inter_ivb.g7b
@@ -130,14 +130,15 @@
{ 0x00000001, 0x2fa401ad, 0x00000b04, 0x00000000 },
{ 0x00000001, 0x2fa801ad, 0x00000b24, 0x00000000 },
{ 0x00000040, 0x2fe00c01, 0x00001400, 0x00000020 },
- { 0x00000020, 0x34001c00, 0x00001400, 0x00000088 },
+ { 0x00000020, 0x34001c00, 0x00001400, 0x0000008a },
{ 0x00000001, 0x2ac001ad, 0x00000fe4, 0x00000000 },
{ 0x00000001, 0x2fa001ad, 0x00000ae6, 0x00000000 },
{ 0x00000001, 0x2fa401ad, 0x00000b06, 0x00000000 },
{ 0x00000001, 0x2fa801ad, 0x00000b26, 0x00000000 },
{ 0x00000040, 0x2fe00c01, 0x00001400, 0x00000020 },
- { 0x00000020, 0x34001c00, 0x00001400, 0x0000007c },
+ { 0x00000020, 0x34001c00, 0x00001400, 0x0000007e },
{ 0x00000001, 0x2ac201ad, 0x00000fe4, 0x00000000 },
+ { 0x00200001, 0x2a2001ad, 0x00450ae4, 0x00000000 },
{ 0x00000001, 0x244001ed, 0x00000000, 0xfff0fff0 },
{ 0x00000001, 0x244201ed, 0x00000000, 0xfff4fff4 },
{ 0x00000001, 0x2fa00021, 0x00000440, 0x00000000 },
@@ -170,8 +171,8 @@
{ 0x00000001, 0x24680061, 0x00000000, 0x30003030 },
{ 0x00000001, 0x24000169, 0x00000000, 0x00040004 },
{ 0x00000040, 0x247e4631, 0x0000047e, 0x00000400 },
- { 0x00000001, 0x24700021, 0x00000ac0, 0x00000000 },
- { 0x00000001, 0x24740021, 0x00000ac0, 0x00000000 },
+ { 0x00000001, 0x24700021, 0x00000a20, 0x00000000 },
+ { 0x00000001, 0x24740021, 0x00000a20, 0x00000000 },
{ 0x00600001, 0x28200021, 0x008d0460, 0x00000000 },
{ 0x08600031, 0x21801cbd, 0x00000800, 0x0a686000 },
{ 0x01000005, 0x20000c20, 0x00000180, 0x00002000 },
diff --git a/src/shaders/vme/vme7_mpeg2.inc b/src/shaders/vme/vme7_mpeg2.inc
index c8e42cc..8ca768b 100644
--- a/src/shaders/vme/vme7_mpeg2.inc
+++ b/src/shaders/vme/vme7_mpeg2.inc
@@ -19,3 +19,6 @@ define(`INTER_PART_MASK', `0x7e000000')
define(`mpeg2_ref', `r83')
define(`pic_ref', `r82')
define(`INTRA16_DC_PRED', `0xBB')
+
+/* Cost center ref */
+define(`mv_cc_ref', `r81')