[Libva] [PATCH 02/14] Encoding: Setup one cost_table surface state for VME shader

Xiang, Haihao haihao.xiang at intel.com
Fri Jul 1 05:04:25 UTC 2016



> From: Zhao Yakui <yakui.zhao at intel.com>
> 
> v1:
> format/style aligment accordingly to avoid the warning.
> Currently the length of VME MEDIA_OBJECT command on Ivy can't exceed
> 8 dwords. If more parameter needs to be passed, the buffer length
> should be enlarged.
> Pass the Qp parameter into VME shader
> 
> Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
> Signed-off-by: pjl <ceciliapeng at intel.com>
> Signed-off-by: Pengfei Qu <Pengfei.Qu at intel.com>
> ---
>  src/gen6_mfc_common.c | 57
> +++++++++++++++++++++++++++++++++++++++++++++++++--
>  src/gen6_vme.h        |  6 ++++++
>  src/gen75_vme.c       | 29 +++++++++++++++++++++-----
>  src/gen7_vme.c        | 30 ++++++++++++++++++++++-----
>  src/gen8_vme.c        | 29 +++++++++++++++++++++-----
>  5 files changed, 134 insertions(+), 17 deletions(-)
> 
> diff --git a/src/gen6_mfc_common.c b/src/gen6_mfc_common.c
> index bb02c83..baa8ec4 100644
> --- a/src/gen6_mfc_common.c
> +++ b/src/gen6_mfc_common.c
> @@ -1017,6 +1017,16 @@
> gen7_vme_walker_fill_vme_batchbuffer(VADriverContextP ctx,
>      int mb_row;
>      int s;
>      unsigned int *command_ptr;
> +    struct gen6_mfc_context *mfc_context = encoder_context-
> >mfc_context;
> +    VAEncPictureParameterBufferH264 *pic_param =
> (VAEncPictureParameterBufferH264 *)encode_state->pic_param_ext-
> >buffer;
> +    VAEncSliceParameterBufferH264 *slice_param =
> (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]-
> >buffer;
> +    int qp,qp_mb;
> +    int slice_type = intel_avc_enc_slice_type_fixup(slice_param-
> >slice_type);
> +
> +    if (encoder_context->rate_control_mode == VA_RC_CQP)
> +        qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
> +    else
> +        qp = mfc_context-
> >bit_rate_control_context[slice_type].QpPrimeY;
>  
>  #define		USE_SCOREBOARD		(1 << 21)
>   
> @@ -1056,7 +1066,7 @@
> gen7_vme_walker_fill_vme_batchbuffer(VADriverContextP ctx,
>                      }
>                  }
>  
> -                *command_ptr++ = (CMD_MEDIA_OBJECT | (8 - 2));
> +                *command_ptr++ = (CMD_MEDIA_OBJECT | (9 - 2));
>                  *command_ptr++ = kernel;
>                  *command_ptr++ = USE_SCOREBOARD;
>                  /* Indirect data */
> @@ -1067,6 +1077,8 @@
> gen7_vme_walker_fill_vme_batchbuffer(VADriverContextP ctx,
>                  /*inline data */
>                  *command_ptr++ = (mb_width << 16 | y_inner << 8 |
> x_inner);
>                  *command_ptr++ = ((1 << 18) | (1 << 16) |
> transform_8x8_mode_flag | (mb_intra_ub << 8));
> +                /* qp occupies one byte */
> +                *command_ptr++ = qp_mb;
>                  x_inner -= 2;
>                  y_inner += 1;
>              }
> @@ -1100,7 +1112,7 @@
> gen7_vme_walker_fill_vme_batchbuffer(VADriverContextP ctx,
>                      }
>                  }
>  
> -                *command_ptr++ = (CMD_MEDIA_OBJECT | (8 - 2));
> +                *command_ptr++ = (CMD_MEDIA_OBJECT | (9 - 2));
>                  *command_ptr++ = kernel;
>                  *command_ptr++ = USE_SCOREBOARD;
>                  /* Indirect data */
> @@ -1111,6 +1123,8 @@
> gen7_vme_walker_fill_vme_batchbuffer(VADriverContextP ctx,
>                  /*inline data */
>                  *command_ptr++ = (mb_width << 16 | y_inner << 8 |
> x_inner);
>                  *command_ptr++ = ((1 << 18) | (1 << 16) |
> transform_8x8_mode_flag | (mb_intra_ub << 8));
> +                /* qp occupies one byte */
> +                *command_ptr++ = qp_mb;
>  
>                  x_inner -= 2;
>                  y_inner += 1;
> @@ -1700,6 +1714,45 @@
> intel_h264_initialize_mbmv_cost(VADriverContextP ctx,
>      return;
>  }
>  
> +extern void
> +intel_h264_setup_cost_surface(VADriverContextP ctx,
> +                              struct encode_state *encode_state,
> +                              struct intel_encoder_context
> *encoder_context,
> +                              unsigned long binding_table_offset,
> +                              unsigned long surface_state_offset)
> +{
> +    struct i965_driver_data *i965 = i965_driver_data(ctx);
> +    struct gen6_vme_context *vme_context = encoder_context-
> >vme_context;
> +    VAEncSliceParameterBufferH264 *slice_param =
> (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]-
> >buffer;
> +    int qp;
> +    dri_bo *bo;
> +
> +
> +    struct i965_buffer_surface cost_table;
> +
> +    int slice_type = intel_avc_enc_slice_type_fixup(slice_param-
> >slice_type);
> +
> +
> +    if (slice_type == SLICE_TYPE_I) {
> +        bo = vme_context->i_qp_cost_table;
> +    } else if (slice_type == SLICE_TYPE_P) {
> +        bo = vme_context->p_qp_cost_table;
> +    } else {
> +        bo = vme_context->b_qp_cost_table;
> +    }
> +
> +    cost_table.bo = bo;
> +    cost_table.num_blocks = QP_MAX;
> +    cost_table.pitch = 16;
> +    cost_table.size_block = 32;
> +
> +    vme_context->vme_buffer_suface_setup(ctx,
> +                                         &vme_context->gpe_context,
> +                                         &cost_table,
> +                                         binding_table_offset,
> +                                         surface_state_offset);
> +}
> +
>  /* HEVC */
>  static int
>  hevc_temporal_find_surface(VAPictureHEVC *curr_pic,
> diff --git a/src/gen6_vme.h b/src/gen6_vme.h
> index ea9918b..7059831 100644
> --- a/src/gen6_vme.h
> +++ b/src/gen6_vme.h
> @@ -213,4 +213,10 @@ intel_h264_initialize_mbmv_cost(VADriverContextP
> ctx,
>                                  struct encode_state *encode_state,
>                                  struct intel_encoder_context
> *encoder_context);
>  
> +extern void
> +intel_h264_setup_cost_surface(VADriverContextP ctx,
> +                              struct encode_state *encode_state,
> +                              struct intel_encoder_context
> *encoder_context,
> +                              unsigned long binding_table_offset,
> +                              unsigned long surface_state_offset);
>  #endif /* _GEN6_VME_H_ */
> diff --git a/src/gen75_vme.c b/src/gen75_vme.c
> index a85d6b3..8434e6f 100644
> --- a/src/gen75_vme.c
> +++ b/src/gen75_vme.c
> @@ -280,6 +280,9 @@ gen75_vme_surface_setup(VADriverContextP ctx,
>      /* VME output */
>      gen75_vme_output_buffer_setup(ctx, encode_state, 3,
> encoder_context);
>      gen75_vme_output_vme_batchbuffer_setup(ctx, encode_state, 5,
> encoder_context);
> +    intel_h264_setup_cost_surface(ctx, encode_state,
> encoder_context,
> +                                 BINDING_TABLE_OFFSET(INTEL_COST_TAB
> LE_OFFSET),
> +                                 SURFACE_STATE_OFFSET(INTEL_COST_TAB
> LE_OFFSET));
>  
>      return VA_STATUS_SUCCESS;
>  }
> @@ -643,11 +646,12 @@ static VAStatus
> gen75_vme_prepare(VADriverContextP ctx,
>  
>      if (!vme_context->h264_level ||
>          (vme_context->h264_level != pSequenceParameter->level_idc))
> {
> -	vme_context->h264_level = pSequenceParameter->level_idc;	
> -    }	
> +            vme_context->h264_level = pSequenceParameter->level_idc;
> +    }
>  
>      intel_vme_update_mbmv_cost(ctx, encode_state, encoder_context);
> -    	
> +    intel_h264_initialize_mbmv_cost(ctx, encode_state,
> encoder_context);
> +
>      /*Setup all the memory object*/
>      gen75_vme_surface_setup(ctx, encode_state, is_intra,
> encoder_context);
>      gen75_vme_interface_setup(ctx, encode_state, encoder_context);
> @@ -1003,8 +1007,23 @@ gen75_vme_context_destroy(void *context)
>      vme_context->vme_batchbuffer.bo = NULL;
>  
>      if (vme_context->vme_state_message) {
> -	free(vme_context->vme_state_message);
> -	vme_context->vme_state_message = NULL;
> +        free(vme_context->vme_state_message);
> +        vme_context->vme_state_message = NULL;
> +    }
> +
> +    if (vme_context->i_qp_cost_table) {
> +        dri_bo_unreference(vme_context->i_qp_cost_table);
> +        vme_context->i_qp_cost_table = NULL;
> +    }
> +
> +    if (vme_context->p_qp_cost_table) {
> +        dri_bo_unreference(vme_context->p_qp_cost_table);
> +        vme_context->p_qp_cost_table = NULL;
> +    }
> +
> +    if (vme_context->b_qp_cost_table) {
> +        dri_bo_unreference(vme_context->b_qp_cost_table);
> +        vme_context->b_qp_cost_table = NULL;
>      }
> 

Both free(NULL) and dri_bo_unreference(NULL) are safe.

>  
>      free(vme_context);
> diff --git a/src/gen7_vme.c b/src/gen7_vme.c
> index 9da44d1..6dd13a8 100644
> --- a/src/gen7_vme.c
> +++ b/src/gen7_vme.c
> @@ -227,7 +227,7 @@
> gen7_vme_output_vme_batchbuffer_setup(VADriverContextP ctx,
>      int height_in_mbs = pSequenceParameter->picture_height_in_mbs;
>  
>      vme_context->vme_batchbuffer.num_blocks = width_in_mbs *
> height_in_mbs + 1;
> -    vme_context->vme_batchbuffer.size_block = 32; /* 2 OWORDs */
> +    vme_context->vme_batchbuffer.size_block = 64; /* 4 OWORDs */
>      vme_context->vme_batchbuffer.pitch = 16;
>      vme_context->vme_batchbuffer.bo = dri_bo_alloc(i965-
> >intel.bufmgr, 
>                                                     "VME
> batchbuffer",
> @@ -270,6 +270,9 @@ gen7_vme_surface_setup(VADriverContextP ctx,
>      /* VME output */
>      gen7_vme_output_buffer_setup(ctx, encode_state, 3,
> encoder_context);
>      gen7_vme_output_vme_batchbuffer_setup(ctx, encode_state, 5,
> encoder_context);
> +    intel_h264_setup_cost_surface(ctx, encode_state,
> encoder_context,
> +                                  BINDING_TABLE_OFFSET(INTEL_COST_TA
> BLE_OFFSET),
> +                                  SURFACE_STATE_OFFSET(INTEL_COST_TA
> BLE_OFFSET));
>  
>      return VA_STATUS_SUCCESS;
>  }
> @@ -667,10 +670,12 @@ static VAStatus
> gen7_vme_prepare(VADriverContextP ctx,
>  
>      if (!vme_context->h264_level ||
>          (vme_context->h264_level != pSequenceParameter->level_idc))
> {
> -	vme_context->h264_level = pSequenceParameter->level_idc;	
> +            vme_context->h264_level = pSequenceParameter->level_idc;
>      }
> -	
> +
>      intel_vme_update_mbmv_cost(ctx, encode_state, encoder_context);
> +    intel_h264_initialize_mbmv_cost(ctx, encode_state,
> encoder_context);
> +
>      /*Setup all the memory object*/
>      gen7_vme_surface_setup(ctx, encode_state, is_intra,
> encoder_context);
>      gen7_vme_interface_setup(ctx, encode_state, encoder_context);
> @@ -1019,8 +1024,23 @@ gen7_vme_context_destroy(void *context)
>      vme_context->vme_batchbuffer.bo = NULL;
>  
>      if (vme_context->vme_state_message) {
> -	free(vme_context->vme_state_message);
> -	vme_context->vme_state_message = NULL;
> +        free(vme_context->vme_state_message);
> +        vme_context->vme_state_message = NULL;
> +    }
> +
> +    if (vme_context->i_qp_cost_table) {
> +        dri_bo_unreference(vme_context->i_qp_cost_table);
> +        vme_context->i_qp_cost_table = NULL;
> +    }
> +
> +    if (vme_context->p_qp_cost_table) {
> +        dri_bo_unreference(vme_context->p_qp_cost_table);
> +        vme_context->p_qp_cost_table = NULL;
> +    }
> +
> +    if (vme_context->b_qp_cost_table) {
> +        dri_bo_unreference(vme_context->b_qp_cost_table);
> +        vme_context->b_qp_cost_table = NULL;
>      }


Both free(NULL) and dri_bo_unreference(NULL) are safe.


>  
>      free(vme_context);
> diff --git a/src/gen8_vme.c b/src/gen8_vme.c
> index edf6060..07dc462 100644
> --- a/src/gen8_vme.c
> +++ b/src/gen8_vme.c
> @@ -314,6 +314,9 @@ gen8_vme_surface_setup(VADriverContextP ctx,
>      /* VME output */
>      gen8_vme_avc_output_buffer_setup(ctx, encode_state, 3,
> encoder_context);
>      gen8_vme_avc_output_vme_batchbuffer_setup(ctx, encode_state, 5,
> encoder_context);
> +    intel_h264_setup_cost_surface(ctx, encode_state,
> encoder_context,
> +                                  BINDING_TABLE_OFFSET(INTEL_COST_TA
> BLE_OFFSET),
> +                                  SURFACE_STATE_OFFSET(INTEL_COST_TA
> BLE_OFFSET));
>  
>      return VA_STATUS_SUCCESS;
>  }
> @@ -717,11 +720,12 @@ static VAStatus
> gen8_vme_prepare(VADriverContextP ctx,
>  
>      if (!vme_context->h264_level ||
>          (vme_context->h264_level != pSequenceParameter->level_idc))
> {
> -	vme_context->h264_level = pSequenceParameter->level_idc;	
> -    }	
> +            vme_context->h264_level = pSequenceParameter->level_idc;
> +    }
>  
>      intel_vme_update_mbmv_cost(ctx, encode_state, encoder_context);
> -    	
> +    intel_h264_initialize_mbmv_cost(ctx, encode_state,
> encoder_context);
> +
>      /*Setup all the memory object*/
>      gen8_vme_surface_setup(ctx, encode_state, is_intra,
> encoder_context);
>      gen8_vme_interface_setup(ctx, encode_state, encoder_context);
> @@ -1288,8 +1292,23 @@ gen8_vme_context_destroy(void *context)
>      vme_context->vme_batchbuffer.bo = NULL;
>  
>      if (vme_context->vme_state_message) {
> -	free(vme_context->vme_state_message);
> -	vme_context->vme_state_message = NULL;
> +        free(vme_context->vme_state_message);
> +        vme_context->vme_state_message = NULL;
> +    }
> +
> +    if (vme_context->i_qp_cost_table) {
> +        dri_bo_unreference(vme_context->i_qp_cost_table);
> +        vme_context->i_qp_cost_table = NULL;
> +    }
> +
> +    if (vme_context->p_qp_cost_table) {
> +        dri_bo_unreference(vme_context->p_qp_cost_table);
> +        vme_context->p_qp_cost_table = NULL;
> +    }
> +
> +    if (vme_context->b_qp_cost_table) {
> +        dri_bo_unreference(vme_context->b_qp_cost_table);
> +        vme_context->b_qp_cost_table = NULL;
>      }

Both free(NULL) and dri_bo_unreference(NULL) are safe.

>  
>      free(vme_context);

This patch does a few different things. It would be better to use
separate patches.



More information about the Libva mailing list