From: Zhao Yakui <[email protected]> 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 <[email protected]> Signed-off-by: pjl <[email protected]> Signed-off-by: Pengfei Qu <[email protected]> --- 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_TABLE_OFFSET), + SURFACE_STATE_OFFSET(INTEL_COST_TABLE_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; } 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_TABLE_OFFSET), + SURFACE_STATE_OFFSET(INTEL_COST_TABLE_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; } 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_TABLE_OFFSET), + SURFACE_STATE_OFFSET(INTEL_COST_TABLE_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; } free(vme_context); -- 2.7.4 _______________________________________________ Libva mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libva
