[Libva] [PATCH 2/7] Use the same shader to configure quality level

Zhao, Yakui yakui.zhao at intel.com
Sun Jul 27 23:15:47 PDT 2014


On Thu, 2014-07-24 at 03:47 -0600, Zhong Li wrote:
> Using the same shader to configure gen7 avc quality level,
> it is benefit to make code clear and reduce profile limitation.

It seems that two things are mixed in one patch.
   a. use the same shader to configure the quality level
   b. restore to the original mechanism of batch buffer. 

It will be better that one thing is done in one patch.

> 
> Signed-off-by: Zhong Li <zhong.li at intel.com>
> ---
>  src/gen6_mfc.c                      |  130 +++++++++--------------------------
>  src/gen7_vme.c                      |   73 +++-----------------
>  src/shaders/vme/inter_frame_ivb.asm |   22 +++++-
>  src/shaders/vme/inter_frame_ivb.g7b |   16 ++++-
>  src/shaders/vme/vme7.inc            |    8 ++-
>  5 files changed, 80 insertions(+), 169 deletions(-)
> 
> diff --git a/src/gen6_mfc.c b/src/gen6_mfc.c
> index 30cdb66..0a10054 100644
> --- a/src/gen6_mfc.c
> +++ b/src/gen6_mfc.c
> @@ -676,6 +676,8 @@ gen6_mfc_stop(VADriverContextP ctx,
>      return VA_STATUS_SUCCESS;
>  }
>  
> +#if __SOFTWARE__
> +
>  static int
>  gen6_mfc_avc_pak_object_intra(VADriverContextP ctx, int x, int y, int end_mb, int qp,unsigned int *msg,
>                                struct intel_encoder_context *encoder_context,
> @@ -766,58 +768,6 @@ gen6_mfc_avc_pak_object_inter(VADriverContextP ctx, int x, int y, int end_mb, in
>  
>      return len_in_dwords;
>  }
> - 
> -static int
> -gen6_mfc_avc_pak_object_inter2(VADriverContextP ctx, int x, int y, int end_mb, int qp,
> -                              unsigned int offset,
> -                              struct intel_encoder_context *encoder_context,
> -                              struct intel_batchbuffer *batch)
> -{
> -    struct gen6_vme_context *vme_context = encoder_context->vme_context;
> -    int len_in_dwords = 11;
> -
> -    if (batch == NULL)
> -        batch = encoder_context->base.batch;
> -
> -    BEGIN_BCS_BATCH(batch, len_in_dwords);
> -
> -    OUT_BCS_BATCH(batch, MFC_AVC_PAK_OBJECT | (len_in_dwords - 2));
> -
> -    OUT_BCS_BATCH(batch, 32);         /* 32 MV*/
> -    OUT_BCS_BATCH(batch, offset);
> -
> -    OUT_BCS_BATCH(batch, 
> -                  (1 << 24) |     /* PackedMvNum, Debug*/
> -                  (4 << 20) |     /* 8 MV, SNB don't use it*/
> -                  (1 << 19) |     /* CbpDcY */
> -                  (1 << 18) |     /* CbpDcU */
> -                  (1 << 17) |     /* CbpDcV */
> -                  (0 << 15) |     /* Transform8x8Flag = 0*/
> -                  (0 << 14) |     /* Frame based*/
> -                  (0 << 13) |     /* Inter MB */
> -                  (1 << 8)  |     /* MbType = P_L0_16x16 */   
> -                  (0 << 7)  |     /* MBZ for frame */
> -                  (0 << 6)  |     /* MBZ */
> -                  (2 << 4)  |     /* MBZ for inter*/
> -                  (0 << 3)  |     /* MBZ */
> -                  (0 << 2)  |     /* SkipMbFlag */
> -                  (0 << 0));      /* InterMbMode */
> -
> -    OUT_BCS_BATCH(batch, (0xFFFF<<16) | (y << 8) | x);        /* Code Block Pattern for Y*/
> -    OUT_BCS_BATCH(batch, 0x000F000F);                         /* Code Block Pattern */    
> -    OUT_BCS_BATCH(batch, (0 << 27) | (end_mb << 26) | qp);    /* Last MB */
> -
> -    /*Stuff for Inter MB*/
> -    OUT_BCS_BATCH(batch, 0x0);        
> -    OUT_BCS_BATCH(batch, 0x0);    
> -    OUT_BCS_BATCH(batch, 0x0);        
> -
> -    OUT_BCS_BATCH(batch, 0xF0020000); /*MaxSizeInWord and TargetSzieInWord*/
> -
> -    ADVANCE_BCS_BATCH(batch);
> -
> -    return len_in_dwords;
> -}
>  
>  static void 
>  gen6_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
> @@ -841,7 +791,6 @@ gen6_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
>      unsigned int tail_data[] = { 0x0, 0x0 };
>      int slice_type = intel_avc_enc_slice_type_fixup(pSliceParameter->slice_type);
>      int is_intra = slice_type == SLICE_TYPE_I;
> -    int is_low_quality = (encoder_context->quality_level == ENCODER_LOW_QUALITY);
>  
>      if (rate_control_mode == VA_RC_CBR) {
>          qp = mfc_context->bit_rate_control_context[slice_type].QpPrimeY;
> @@ -869,54 +818,36 @@ gen6_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
>      dri_bo_map(vme_context->vme_output.bo , 1);
>      msg = (unsigned int *)vme_context->vme_output.bo->virtual;
>  
> -    if (is_low_quality) {
> -        for (i = pSliceParameter->macroblock_address; 
> -                i < pSliceParameter->macroblock_address + pSliceParameter->num_macroblocks; i++) {
> -            int last_mb = (i == (pSliceParameter->macroblock_address + pSliceParameter->num_macroblocks - 1) );
> -            x = i % width_in_mbs;
> -            y = i / width_in_mbs;
> -
> -            if (is_intra) {
> -                assert(msg);
> -                gen6_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg, encoder_context, 0, 0, slice_batch);
> -                msg += 4;
> -            } else {
> -                gen6_mfc_avc_pak_object_inter2(ctx, x, y, last_mb, qp, offset, encoder_context, slice_batch);
> -                offset += 64;
> -            }
> -        }
> +    if (is_intra) {
> +        msg += pSliceParameter->macroblock_address * INTRA_VME_OUTPUT_IN_DWS;
>      } else {
> +        msg += pSliceParameter->macroblock_address * INTER_VME_OUTPUT_IN_DWS;
> +        msg += 32; /* the first 32 DWs are MVs */
> +        offset = pSliceParameter->macroblock_address * INTER_VME_OUTPUT_IN_BYTES;
> +    }
> +   
> +    for (i = pSliceParameter->macroblock_address; 
> +         i < pSliceParameter->macroblock_address + pSliceParameter->num_macroblocks; i++) {
> +        int last_mb = (i == (pSliceParameter->macroblock_address + pSliceParameter->num_macroblocks - 1) );
> +        x = i % width_in_mbs;
> +        y = i / width_in_mbs;
> +
>          if (is_intra) {
> -            msg += pSliceParameter->macroblock_address * INTRA_VME_OUTPUT_IN_DWS;
> +            assert(msg);
> +            gen6_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg, encoder_context, 0, 0, slice_batch);
> +            msg += INTRA_VME_OUTPUT_IN_DWS;
>          } else {
> -            msg += pSliceParameter->macroblock_address * INTER_VME_OUTPUT_IN_DWS;
> -            msg += 32; /* the first 32 DWs are MVs */
> -            offset = pSliceParameter->macroblock_address * INTER_VME_OUTPUT_IN_BYTES;
> -        }
> -
> -        for (i = pSliceParameter->macroblock_address; 
> -                i < pSliceParameter->macroblock_address + pSliceParameter->num_macroblocks; i++) {
> -            int last_mb = (i == (pSliceParameter->macroblock_address + pSliceParameter->num_macroblocks - 1) );
> -            x = i % width_in_mbs;
> -            y = i / width_in_mbs;
> -
> -            if (is_intra) {
> -                assert(msg);
> +            if (msg[0] & INTRA_MB_FLAG_MASK) {
>                  gen6_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg, encoder_context, 0, 0, slice_batch);
> -                msg += INTRA_VME_OUTPUT_IN_DWS;
>              } else {
> -                if (msg[0] & INTRA_MB_FLAG_MASK) {
> -                    gen6_mfc_avc_pak_object_intra(ctx, x, y, last_mb, qp, msg, encoder_context, 0, 0, slice_batch);
> -                } else {
> -                    gen6_mfc_avc_pak_object_inter(ctx, x, y, last_mb, qp, msg, offset, encoder_context, 0, 0, slice_type, slice_batch);
> -                }
> -
> -                msg += INTER_VME_OUTPUT_IN_DWS;
> -                offset += INTER_VME_OUTPUT_IN_BYTES;
> +                gen6_mfc_avc_pak_object_inter(ctx, x, y, last_mb, qp, msg, offset, encoder_context, 0, 0, slice_type, slice_batch);
>              }
> +
> +            msg += INTER_VME_OUTPUT_IN_DWS;
> +            offset += INTER_VME_OUTPUT_IN_BYTES;
>          }
>      }
> -
> +   
>      dri_bo_unmap(vme_context->vme_output.bo);
>  
>      if ( last_slice ) {    
> @@ -965,6 +896,8 @@ gen6_mfc_avc_software_batchbuffer(VADriverContextP ctx,
>      return batch_bo;
>  }
>  
> +#else
> +
>  static void
>  gen6_mfc_batchbuffer_surfaces_input(VADriverContextP ctx,
>                                      struct encode_state *encode_state,
> @@ -1358,6 +1291,9 @@ gen6_mfc_avc_hardware_batchbuffer(VADriverContextP ctx,
>      return mfc_context->mfc_batchbuffer_surface.bo;
>  }
>  
> +#endif
> +
> +
>  static void
>  gen6_mfc_avc_pipeline_programing(VADriverContextP ctx,
>                                   struct encode_state *encode_state,
> @@ -1372,15 +1308,11 @@ gen6_mfc_avc_pipeline_programing(VADriverContextP ctx,
>          return; 
>      }
>  
> -    if (encoder_context->quality_level == ENCODER_LOW_QUALITY )
> -        slice_batch_bo = gen6_mfc_avc_software_batchbuffer(ctx, encode_state, encoder_context);
> -    else {
>  #if __SOFTWARE__
> -        slice_batch_bo = gen6_mfc_avc_software_batchbuffer(ctx, encode_state, encoder_context);
> +    slice_batch_bo = gen6_mfc_avc_software_batchbuffer(ctx, encode_state, encoder_context);
>  #else
> -        slice_batch_bo = gen6_mfc_avc_hardware_batchbuffer(ctx, encode_state, encoder_context);
> +    slice_batch_bo = gen6_mfc_avc_hardware_batchbuffer(ctx, encode_state, encoder_context);
>  #endif
> -    }
>  
>      // begin programing
>      intel_batchbuffer_start_atomic_bcs(batch, 0x4000); 
> diff --git a/src/gen7_vme.c b/src/gen7_vme.c
> index 135a5ad..dc15445 100644
> --- a/src/gen7_vme.c
> +++ b/src/gen7_vme.c
> @@ -63,8 +63,6 @@ enum VIDEO_CODING_TYPE{
>  enum AVC_VME_KERNEL_TYPE{ 
>      AVC_VME_INTRA_SHADER = 0,
>      AVC_VME_INTER_SHADER,
> -    AVC_VME_OLD_INTRA_SHADER,
> -    AVC_VME_OLD_INTER_SHADER,
>      AVC_VME_BATCHBUFFER,
>      AVC_VME_BINTER_SHADER,
>      AVC_VME_KERNEL_SUM
> @@ -85,14 +83,6 @@ static const uint32_t gen7_vme_inter_frame[][4] = {
>  #include "shaders/vme/inter_frame_ivb.g7b"
>  };
>  
> -static const uint32_t gen7_vme_old_intra_frame[][4] = {
> -#include "shaders/vme_old/intra_frame.g7b"
> -};
> -
> -static const uint32_t gen7_vme_old_inter_frame[][4] = {
> -#include "shaders/vme_old/inter_frame.g7b"
> -};
> -
>  static const uint32_t gen7_vme_batchbuffer[][4] = {
>  #include "shaders/vme/batchbuffer.g7b"
>  };
> @@ -117,20 +107,6 @@ static struct i965_kernel gen7_vme_kernels[] = {
>          NULL
>      },
>      {
> -        "AVC VME Old Intra Frame",
> -        AVC_VME_OLD_INTRA_SHADER,
> -        gen7_vme_old_intra_frame, 			
> -        sizeof(gen7_vme_old_intra_frame),		
> -        NULL
> -    },
> -    {
> -        "AVC VME Old Inter Frame",
> -        AVC_VME_OLD_INTER_SHADER,
> -        gen7_vme_old_inter_frame,
> -        sizeof(gen7_vme_old_inter_frame),
> -        NULL
> -    },
> -    {
>          "AVC VME BATCHBUFFER",
>          AVC_VME_BATCHBUFFER,
>          gen7_vme_batchbuffer,
> @@ -383,36 +359,6 @@ static VAStatus gen7_vme_constant_setup(VADriverContextP ctx,
>      return VA_STATUS_SUCCESS;
>  }
>  
> -static VAStatus
> -gen7_vme_vme_state_setup(VADriverContextP ctx,
> -        struct encode_state *encode_state,
> -        int is_intra,
> -        struct intel_encoder_context *encoder_context)
> -{
> -    struct gen6_vme_context *vme_context = encoder_context->vme_context;
> -    unsigned int *vme_state_message;
> -    int i;
> -
> -    //building VME state message
> -    dri_bo_map(vme_context->vme_state.bo, 1);
> -    assert(vme_context->vme_state.bo->virtual);
> -    vme_state_message = (unsigned int *)vme_context->vme_state.bo->virtual;
> -
> -    vme_state_message[0] = 0x10010101;
> -    vme_state_message[1] = 0x100F0F0F;
> -    vme_state_message[2] = 0x10010101;
> -    vme_state_message[3] = 0x000F0F0F;
> -    for(i = 4; i < 14; i++) {
> -        vme_state_message[i] = 0x00000000;
> -    }	
> -
> -    for(i = 14; i < 32; i++) {
> -        vme_state_message[i] = 0x00000000;
> -    }
> -
> -    dri_bo_unmap( vme_context->vme_state.bo);
> -    return VA_STATUS_SUCCESS;
> -}
>  
>  static VAStatus gen7_vme_avc_state_setup(VADriverContextP ctx,
>                                           struct encode_state *encode_state,
> @@ -424,6 +370,7 @@ static VAStatus gen7_vme_avc_state_setup(VADriverContextP ctx,
>      unsigned int *mb_cost_table;
>      int i;
>      VAEncSliceParameterBufferH264 *slice_param = (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]->buffer;
> +    unsigned int is_low_quality = (encoder_context->quality_level == ENCODER_LOW_QUALITY);
>  
>      mb_cost_table = (unsigned int *)vme_context->vme_state_message;
>      //building VME state message
> @@ -431,8 +378,9 @@ static VAStatus gen7_vme_avc_state_setup(VADriverContextP ctx,
>      assert(vme_context->vme_state.bo->virtual);
>      vme_state_message = (unsigned int *)vme_context->vme_state.bo->virtual;
>  
> -    if ((slice_param->slice_type == SLICE_TYPE_P) ||
> -        (slice_param->slice_type == SLICE_TYPE_SP)) {
> +    if (((slice_param->slice_type == SLICE_TYPE_P) ||
> +        (slice_param->slice_type == SLICE_TYPE_SP) &&
> +        !is_low_quality)) {

Maybe it should be
    if (((slice_param->slice_type == SLICE_TYPE_P) ||
        (slice_param->slice_type == SLICE_TYPE_SP)) &&
        !is_low_quality)


>          vme_state_message[0] = 0x01010101;
>          vme_state_message[1] = 0x10010101;
>          vme_state_message[2] = 0x0F0F0F0F;
> @@ -598,7 +546,7 @@ gen7_vme_fill_vme_batchbuffer(VADriverContextP ctx,
>     
>                  /*inline data */
>                  *command_ptr++ = (mb_width << 16 | mb_y << 8 | mb_x);
> -                *command_ptr++ = ( (1 << 16) | transform_8x8_mode_flag | (mb_intra_ub << 8));
> +                *command_ptr++ = ((encoder_context->quality_level << 24) | (1 << 16) | transform_8x8_mode_flag | (mb_intra_ub << 8));
>  
>                  i += 1;
>              }
> @@ -668,14 +616,14 @@ static void gen7_vme_pipeline_programing(VADriverContextP ctx,
>  
>      if ((pSliceParameter->slice_type == SLICE_TYPE_I) ||
>  	(pSliceParameter->slice_type == SLICE_TYPE_I)) {
> -	kernel_shader = (is_low_quality ? AVC_VME_OLD_INTRA_SHADER : AVC_VME_INTRA_SHADER);
> +	kernel_shader = AVC_VME_INTRA_SHADER;
>      } else if ((pSliceParameter->slice_type == SLICE_TYPE_P) ||
>                 (pSliceParameter->slice_type == SLICE_TYPE_SP)) {
> -	kernel_shader = (is_low_quality ? AVC_VME_OLD_INTER_SHADER : AVC_VME_INTER_SHADER);
> +	kernel_shader = AVC_VME_INTER_SHADER;
>      } else {
>  	kernel_shader = AVC_VME_BINTER_SHADER;
>  	if (!allow_hwscore)
> -            kernel_shader = (is_low_quality ? AVC_VME_OLD_INTER_SHADER : AVC_VME_INTER_SHADER);
> +            kernel_shader = AVC_VME_INTER_SHADER;
>      }
>  
>      if (allow_hwscore)
> @@ -727,10 +675,7 @@ static VAStatus gen7_vme_prepare(VADriverContextP ctx,
>      gen7_vme_surface_setup(ctx, encode_state, is_intra, encoder_context);
>      gen7_vme_interface_setup(ctx, encode_state, encoder_context);
>      gen7_vme_constant_setup(ctx, encode_state, encoder_context);
> -    if (encoder_context->quality_level == ENCODER_LOW_QUALITY)
> -        gen7_vme_vme_state_setup(ctx, encode_state, is_intra, encoder_context);
> -    else
> -        gen7_vme_avc_state_setup(ctx, encode_state, is_intra, encoder_context);
> +    gen7_vme_avc_state_setup(ctx, encode_state, is_intra, encoder_context);
>  
>      /*Programing media pipeline*/
>      gen7_vme_pipeline_programing(ctx, encode_state, encoder_context);
> diff --git a/src/shaders/vme/inter_frame_ivb.asm b/src/shaders/vme/inter_frame_ivb.asm
> index 3c08851..46f2b4b 100644
> --- a/src/shaders/vme/inter_frame_ivb.asm
> +++ b/src/shaders/vme/inter_frame_ivb.asm
> @@ -391,12 +391,14 @@ mov (1) mb_intra_struct_ub<1>:UB input_mb_intra_ub<0,1,0>:UB {align1};
>  
>  /* M0 */
>  /* IME search */
> +cmp.z.f0.0 (1)		null<1>:uw	quality_level_ub<0,1,0>:ub		LOW_QUALITY_LEVEL:uw   {align1};
> +(f0.0) jmpi (1) __low_quality_search;
> +
> +__high_quality_search:
>  mov  (1) vme_m0.12<1>:UD   SEARCH_CTRL_SINGLE + INTER_PART_MASK + INTER_SAD_HAAR + SUB_PEL_MODE_QUARTER:UD {align1};  
>  /* 16x16 Source, 1/4 pixel, harr */
>  mov  (1) vme_m0.22<1>:UW        REF_REGION_SIZE {align1};         /* Reference Width&Height, 48x40 */
>  
> -mov  (1) vme_m0.0<1>:UD		vme_m0.8<0,1,0>:UD      {align1};
> -
>  mov  (1) vme_m0.0<1>:W		-16:W			{align1};
>  mov  (1) vme_m0.2<1>:W		-12:W			{align1};
>  
> @@ -405,6 +407,22 @@ and.z.f0.0 (1)		null:uw	input_mb_intra_ub<0,1,0>:ub	INTRA_PRED_AVAIL_FLAG_AE:uw
>  and.z.f0.0 (1)		null:uw	input_mb_intra_ub<0,1,0>:ub	INTRA_PRED_AVAIL_FLAG_B:uw   {align1};
>  (f0.0)	add 	(1)	vme_m0.2<1>:w	vme_m0.2<0,1,0>:w	8:w	{align1};
>  
> +jmpi __vme_msg;
> +
> +__low_quality_search:
> +mov  (1) vme_m0.12<1>:UD   SEARCH_CTRL_SINGLE + INTER_PART_MASK + INTER_SAD_HAAR + SUB_PEL_MODE_HALF:UD {align1};  
> +/* 16x16 Source, 1/2 pixel, harr */
> +mov  (1) vme_m0.22<1>:UW        MIN_REF_REGION_SIZE {align1};         /* Reference Width&Height, 32x32 */
> +
> +mov  (1) vme_m0.0<1>:W		-8:W			{align1};
> +mov  (1) vme_m0.2<1>:W		-8:W			{align1};
> +
> +and.z.f0.0 (1)		null:uw	input_mb_intra_ub<0,1,0>:ub	INTRA_PRED_AVAIL_FLAG_AE:uw   {align1};
> +(f0.0)	add 	(1)	vme_m0.0<1>:w	vme_m0.0<0,1,0>:w	4:w	{align1};
> +and.z.f0.0 (1)		null:uw	input_mb_intra_ub<0,1,0>:ub	INTRA_PRED_AVAIL_FLAG_B:uw   {align1};
> +(f0.0)	add 	(1)	vme_m0.2<1>:w	vme_m0.2<0,1,0>:w	4:w	{align1};
> +
> +__vme_msg:
>  mov  (1) vme_m0.4<1>:UD		vme_m0.0<0,1,0>:UD	{align1};
>  add  (2) vme_m0.0<1>:w		vme_m0.0<2,2,1>:w	mb_ref_win.16<2,2,1>:w	{align1};
>  add  (2) vme_m0.4<1>:w		vme_m0.4<2,2,1>:w	mb_ref_win.16<2,2,1>:w	{align1};
> diff --git a/src/shaders/vme/inter_frame_ivb.g7b b/src/shaders/vme/inter_frame_ivb.g7b
> index e4db6ea..7ed38c5 100644
> --- a/src/shaders/vme/inter_frame_ivb.g7b
> +++ b/src/shaders/vme/inter_frame_ivb.g7b
> @@ -141,13 +141,13 @@
>     { 0x00000001, 0x2fa401ad, 0x00000b04, 0x00000000 },
>     { 0x00000001, 0x2fa801ad, 0x00000b24, 0x00000000 },
>     { 0x00000040, 0x2fe00c01, 0x00001400, 0x00000020 },
> -   { 0x00000020, 0x34001c00, 0x00001400, 0x000000bc },
> +   { 0x00000020, 0x34001c00, 0x00001400, 0x000000d0 },
>     { 0x00000001, 0x2ac001ad, 0x00000fe4, 0x00000000 },
>     { 0x00000001, 0x2fa001ad, 0x00000ae6, 0x00000000 },
>     { 0x00000001, 0x2fa401ad, 0x00000b06, 0x00000000 },
>     { 0x00000001, 0x2fa801ad, 0x00000b26, 0x00000000 },
>     { 0x00000040, 0x2fe00c01, 0x00001400, 0x00000020 },
> -   { 0x00000020, 0x34001c00, 0x00001400, 0x000000b0 },
> +   { 0x00000020, 0x34001c00, 0x00001400, 0x000000c4 },
>     { 0x00000001, 0x2ac201ad, 0x00000fe4, 0x00000000 },
>     { 0x0020000c, 0x2a803dad, 0x00450ac0, 0x00020002 },
>     { 0x00200040, 0x2a883dad, 0x00450a80, 0x00030003 },
> @@ -163,15 +163,25 @@
>     { 0x01000005, 0x20002e28, 0x000000a4, 0x00010001 },
>     { 0x00010001, 0x247c0171, 0x00000000, 0x00020002 },
>     { 0x00000001, 0x247d0231, 0x000000a5, 0x00000000 },
> +   { 0x01000010, 0x20002e28, 0x000000a7, 0x00020002 },
> +   { 0x00010020, 0x34001c00, 0x00001400, 0x00000012 },
>     { 0x00000001, 0x244c0061, 0x00000000, 0x00203000 },
>     { 0x00000001, 0x24560169, 0x00000000, 0x28302830 },
> -   { 0x00000001, 0x24400021, 0x00000448, 0x00000000 },
>     { 0x00000001, 0x244001ed, 0x00000000, 0xfff0fff0 },
>     { 0x00000001, 0x244201ed, 0x00000000, 0xfff4fff4 },
>     { 0x01000005, 0x20002e28, 0x000000a5, 0x00600060 },
>     { 0x00010040, 0x24403dad, 0x00000440, 0x000c000c },
>     { 0x01000005, 0x20002e28, 0x000000a5, 0x00100010 },
>     { 0x00010040, 0x24423dad, 0x00000442, 0x00080008 },
> +   { 0x00000020, 0x34001c00, 0x00001400, 0x00000010 },
> +   { 0x00000001, 0x244c0061, 0x00000000, 0x00201000 },
> +   { 0x00000001, 0x24560169, 0x00000000, 0x20202020 },
> +   { 0x00000001, 0x244001ed, 0x00000000, 0xfff8fff8 },
> +   { 0x00000001, 0x244201ed, 0x00000000, 0xfff8fff8 },
> +   { 0x01000005, 0x20002e28, 0x000000a5, 0x00600060 },
> +   { 0x00010040, 0x24403dad, 0x00000440, 0x00040004 },
> +   { 0x01000005, 0x20002e28, 0x000000a5, 0x00100010 },
> +   { 0x00010040, 0x24423dad, 0x00000442, 0x00040004 },
>     { 0x00000001, 0x24440021, 0x00000440, 0x00000000 },
>     { 0x00200040, 0x244035ad, 0x00450440, 0x00450a90 },
>     { 0x00200040, 0x244435ad, 0x00450444, 0x00450a90 },
> diff --git a/src/shaders/vme/vme7.inc b/src/shaders/vme/vme7.inc
> index 3fa99b7..8a8c32a 100644
> --- a/src/shaders/vme/vme7.inc
> +++ b/src/shaders/vme/vme7.inc
> @@ -54,6 +54,8 @@ define(`SEARCH_CTRL_DUAL_RECORD',       `0x00000300')
>  define(`SEARCH_CTRL_DUAL_REFERENCE',    `0x00000700')
>  
>  define(`REF_REGION_SIZE',               `0x2830:UW')
> +define(`MIN_REF_REGION_SIZE',           `0x2020:UW')
> +define(`DREF_REGION_SIZE',              `0x2020:UW')
>  
>  define(`BI_SUB_MB_PART_MASK',           `0x0c000000')
>  define(`MAX_NUM_MV',                    `0x00000020')
> @@ -132,6 +134,7 @@ define(`orig_y_ub',             `inline_reg0.1')
>  define(`transform_8x8_ub',      `inline_reg0.4')
>  define(`input_mb_intra_ub',     `inline_reg0.5')
>  define(`num_macroblocks',       `inline_reg0.6')
> +define(`quality_level_ub',      `inline_reg0.7')
>  
>  /*
>   * GRF 6~11 -- reserved
> @@ -291,7 +294,6 @@ define(`mb_mv3',		`r96')
>  define(`mb_ref',		`r97')
>  define(`mb_ref_win',		`r84')
>  
> -define(`DREF_REGION_SIZE',               `0x2020:UW')
>  define(`PRED_L0',               `0x0':uw)
>  define(`PRED_L1',               `0x1':uw)
>  define(`PRED_BI',               `0x2':uw)
> @@ -317,3 +319,7 @@ define(`INTER_8X16MODE',		`0x02')
>  define(`OBR_MESSAGE_FENCE',              `7')
>  define(`OBR_MF_NOCOMMIT',		 `0')
>  define(`OBR_MF_COMMIT',			 `0x20')
> +
> +define(`DEFAULT_QUALITY_LEVEL',           `0x00')
> +define(`HIGH_QUALITY_LEVEL',              `0x01')
> +define(`LOW_QUALITY_LEVEL',               `0x02')




More information about the Libva mailing list