diff options
author | Zhao Yakui <yakui.zhao@intel.com> | 2013-08-12 15:13:24 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2013-09-06 15:34:41 +0800 |
commit | 58e4c588326b332c2250842f6dd103a6e17adf2a (patch) | |
tree | 55f62a3cd6dd176863c87cc4200ad0433225df77 | |
parent | b6b6d3b86d9d587f4986c8a6c8ec70f643ff63cd (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.c | 39 | ||||
-rw-r--r-- | src/shaders/vme/mpeg2_inter_ivb.asm | 5 | ||||
-rw-r--r-- | src/shaders/vme/mpeg2_inter_ivb.g7b | 9 | ||||
-rw-r--r-- | src/shaders/vme/vme7_mpeg2.inc | 3 |
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') |