X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fradeon%2Fradeon_vce_52.c;h=fc7ddc62a90b4f3795a1b16440ceecf3c396dd21;hb=ae2cb7280436ab3fe24afef510d30201e54b795c;hp=7d333133dc39544aa90b7a6b53c9c7ad0e78eda3;hpb=06f0a4d9ed50a5b562f7642cbf16a7c880693e95;p=mesa.git diff --git a/src/gallium/drivers/radeon/radeon_vce_52.c b/src/gallium/drivers/radeon/radeon_vce_52.c index 7d333133dc3..fc7ddc62a90 100644 --- a/src/gallium/drivers/radeon/radeon_vce_52.c +++ b/src/gallium/drivers/radeon/radeon_vce_52.c @@ -34,12 +34,10 @@ #include "vl/vl_video_buffer.h" -#include "r600_pipe_common.h" +#include "radeonsi/si_pipe.h" #include "radeon_video.h" #include "radeon_vce.h" -static const unsigned profiles[7] = { 66, 77, 88, 100, 110, 122, 244 }; - static void get_rate_control_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) { enc->enc_pic.rc.rc_method = pic->rate_ctrl.rate_ctrl_method; @@ -48,13 +46,14 @@ static void get_rate_control_param(struct rvce_encoder *enc, struct pipe_h264_en enc->enc_pic.rc.quant_i_frames = pic->quant_i_frames; enc->enc_pic.rc.quant_p_frames = pic->quant_p_frames; enc->enc_pic.rc.quant_b_frames = pic->quant_b_frames; + enc->enc_pic.rc.gop_size = pic->gop_size; enc->enc_pic.rc.frame_rate_num = pic->rate_ctrl.frame_rate_num; enc->enc_pic.rc.frame_rate_den = pic->rate_ctrl.frame_rate_den; enc->enc_pic.rc.max_qp = 51; enc->enc_pic.rc.vbv_buffer_size = pic->rate_ctrl.vbv_buffer_size; - enc->enc_pic.rc.vbv_buf_lv = 0; - enc->enc_pic.rc.fill_data_enable = 0; - enc->enc_pic.rc.enforce_hrd = 0; + enc->enc_pic.rc.vbv_buf_lv = pic->rate_ctrl.vbv_buf_lv; + enc->enc_pic.rc.fill_data_enable = pic->rate_ctrl.fill_data_enable; + enc->enc_pic.rc.enforce_hrd = pic->rate_ctrl.enforce_hrd; enc->enc_pic.rc.target_bits_picture = pic->rate_ctrl.target_bits_picture; enc->enc_pic.rc.peak_bits_picture_integer = pic->rate_ctrl.peak_bits_picture_integer; enc->enc_pic.rc.peak_bits_picture_fraction = pic->rate_ctrl.peak_bits_picture_fraction; @@ -62,13 +61,13 @@ static void get_rate_control_param(struct rvce_encoder *enc, struct pipe_h264_en static void get_motion_estimation_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) { - enc->enc_pic.me.motion_est_quarter_pixel = 0x00000000; - enc->enc_pic.me.enc_disable_sub_mode = 0x000000fe; - enc->enc_pic.me.lsmvert = 0x00000000; - enc->enc_pic.me.enc_en_ime_overw_dis_subm = 0x00000000; - enc->enc_pic.me.enc_ime_overw_dis_subm_no = 0x00000000; - enc->enc_pic.me.enc_ime2_search_range_x = 0x00000001; - enc->enc_pic.me.enc_ime2_search_range_y = 0x00000001; + enc->enc_pic.me.motion_est_quarter_pixel = pic->motion_est.motion_est_quarter_pixel; + enc->enc_pic.me.enc_disable_sub_mode = pic->motion_est.enc_disable_sub_mode; + enc->enc_pic.me.lsmvert = pic->motion_est.lsmvert; + enc->enc_pic.me.enc_en_ime_overw_dis_subm = pic->motion_est.enc_en_ime_overw_dis_subm; + enc->enc_pic.me.enc_ime_overw_dis_subm_no = pic->motion_est.enc_ime_overw_dis_subm_no; + enc->enc_pic.me.enc_ime2_search_range_x = pic->motion_est.enc_ime2_search_range_x; + enc->enc_pic.me.enc_ime2_search_range_y = pic->motion_est.enc_ime2_search_range_y; enc->enc_pic.me.enc_ime_decimation_search = 0x00000001; enc->enc_pic.me.motion_est_half_pixel = 0x00000001; enc->enc_pic.me.enc_search_range_x = 0x00000010; @@ -90,8 +89,8 @@ static void get_pic_control_param(struct rvce_encoder *enc, struct pipe_h264_enc enc->enc_pic.pc.enc_max_num_ref_frames = enc->base.max_references + 1; enc->enc_pic.pc.enc_num_default_active_ref_l0 = 0x00000001; enc->enc_pic.pc.enc_num_default_active_ref_l1 = 0x00000001; - enc->enc_pic.pc.enc_cabac_enable = 0x00000000; - enc->enc_pic.pc.enc_constraint_set_flags = 0x00000040; + enc->enc_pic.pc.enc_cabac_enable = pic->pic_ctrl.enc_cabac_enable; + enc->enc_pic.pc.enc_constraint_set_flags = pic->pic_ctrl.enc_constraint_set_flags; enc->enc_pic.pc.enc_num_default_active_ref_l0 = 0x00000001; enc->enc_pic.pc.enc_num_default_active_ref_l1 = 0x00000001; } @@ -113,7 +112,7 @@ static void get_config_ext_param(struct rvce_encoder *enc) static void get_vui_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) { - enc->enc_pic.enable_vui = (pic->rate_ctrl.frame_rate_num != 0); + enc->enc_pic.enable_vui = pic->enable_vui; enc->enc_pic.vui.video_format = 0x00000005; enc->enc_pic.vui.color_prim = 0x00000002; enc->enc_pic.vui.transfer_char = 0x00000002; @@ -137,7 +136,7 @@ static void get_vui_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture enc->enc_pic.vui.max_dec_frame_buffering = 0x00000003; } -void radeon_vce_52_get_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) +void si_vce_52_get_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) { get_rate_control_param(enc, pic); get_motion_estimation_param(enc, pic); @@ -149,27 +148,44 @@ void radeon_vce_52_get_param(struct rvce_encoder *enc, struct pipe_h264_enc_pict enc->enc_pic.picture_type = pic->picture_type; enc->enc_pic.frame_num = pic->frame_num; + enc->enc_pic.frame_num_cnt = pic->frame_num_cnt; + enc->enc_pic.p_remain = pic->p_remain; + enc->enc_pic.i_remain = pic->i_remain; + enc->enc_pic.gop_cnt = pic->gop_cnt; enc->enc_pic.pic_order_cnt = pic->pic_order_cnt; enc->enc_pic.ref_idx_l0 = pic->ref_idx_l0; enc->enc_pic.ref_idx_l1 = pic->ref_idx_l1; enc->enc_pic.not_referenced = pic->not_referenced; + if (enc->dual_inst) + enc->enc_pic.addrmode_arraymode_disrdo_distwoinstants = 0x00000201; + else + enc->enc_pic.addrmode_arraymode_disrdo_distwoinstants = 0x01000201; + enc->enc_pic.is_idr = (pic->picture_type == PIPE_H264_ENC_PICTURE_TYPE_IDR); } static void create(struct rvce_encoder *enc) { + struct si_screen *sscreen = (struct si_screen *)enc->screen; enc->task_info(enc, 0x00000000, 0, 0, 0); RVCE_BEGIN(0x01000001); // create cmd RVCE_CS(enc->enc_pic.ec.enc_use_circular_buffer); - RVCE_CS(profiles[enc->base.profile - - PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE]); // encProfile + RVCE_CS(u_get_h264_profile_idc(enc->base.profile)); // encProfile RVCE_CS(enc->base.level); // encLevel RVCE_CS(enc->enc_pic.ec.enc_pic_struct_restriction); RVCE_CS(enc->base.width); // encImageWidth RVCE_CS(enc->base.height); // encImageHeight - RVCE_CS(enc->luma->level[0].pitch_bytes); // encRefPicLumaPitch - RVCE_CS(enc->chroma->level[0].pitch_bytes); // encRefPicChromaPitch - RVCE_CS(align(enc->luma->npix_y, 16) / 8); // encRefYHeightInQw + + if (sscreen->info.chip_class < GFX9) { + RVCE_CS(enc->luma->u.legacy.level[0].nblk_x * enc->luma->bpe); // encRefPicLumaPitch + RVCE_CS(enc->chroma->u.legacy.level[0].nblk_x * enc->chroma->bpe); // encRefPicChromaPitch + RVCE_CS(align(enc->luma->u.legacy.level[0].nblk_y, 16) / 8); // encRefYHeightInQw + } else { + RVCE_CS(enc->luma->u.gfx9.surf_pitch * enc->luma->bpe); // encRefPicLumaPitch + RVCE_CS(enc->chroma->u.gfx9.surf_pitch * enc->chroma->bpe); // encRefPicChromaPitch + RVCE_CS(align(enc->luma->u.gfx9.surf_height, 16) / 8); // encRefYHeightInQw + } + RVCE_CS(enc->enc_pic.addrmode_arraymode_disrdo_distwoinstants); RVCE_CS(enc->enc_pic.ec.enc_pre_encode_context_buffer_offset); @@ -181,6 +197,7 @@ static void create(struct rvce_encoder *enc) static void encode(struct rvce_encoder *enc) { + struct si_screen *sscreen = (struct si_screen *)enc->screen; signed luma_offset, chroma_offset, bs_offset; unsigned dep, bs_idx = enc->bs_idx++; int i; @@ -229,13 +246,25 @@ static void encode(struct rvce_encoder *enc) RVCE_CS(enc->enc_pic.eo.insert_aud); RVCE_CS(enc->enc_pic.eo.end_of_sequence); RVCE_CS(enc->enc_pic.eo.end_of_stream); - RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM, - enc->luma->level[0].offset); // inputPictureLumaAddressHi/Lo - RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM, - enc->chroma->level[0].offset); // inputPictureChromaAddressHi/Lo - RVCE_CS(align(enc->luma->npix_y, 16)); // encInputFrameYPitch - RVCE_CS(enc->luma->level[0].pitch_bytes); // encInputPicLumaPitch - RVCE_CS(enc->chroma->level[0].pitch_bytes); // encInputPicChromaPitch + + if (sscreen->info.chip_class < GFX9) { + RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM, + enc->luma->u.legacy.level[0].offset); // inputPictureLumaAddressHi/Lo + RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM, + enc->chroma->u.legacy.level[0].offset); // inputPictureChromaAddressHi/Lo + RVCE_CS(align(enc->luma->u.legacy.level[0].nblk_y, 16)); // encInputFrameYPitch + RVCE_CS(enc->luma->u.legacy.level[0].nblk_x * enc->luma->bpe); // encInputPicLumaPitch + RVCE_CS(enc->chroma->u.legacy.level[0].nblk_x * enc->chroma->bpe); // encInputPicChromaPitch + } else { + RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM, + enc->luma->u.gfx9.surf_offset); // inputPictureLumaAddressHi/Lo + RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM, + enc->chroma->u.gfx9.surf_offset); // inputPictureChromaAddressHi/Lo + RVCE_CS(align(enc->luma->u.gfx9.surf_height, 16)); // encInputFrameYPitch + RVCE_CS(enc->luma->u.gfx9.surf_pitch * enc->luma->bpe); // encInputPicLumaPitch + RVCE_CS(enc->chroma->u.gfx9.surf_pitch * enc->chroma->bpe); // encInputPicChromaPitch + } + if (enc->dual_pipe) enc->enc_pic.eo.enc_input_pic_addr_array_disable2pipe_disablemboffload = 0x00000000; else @@ -287,8 +316,8 @@ static void encode(struct rvce_encoder *enc) RVCE_CS(0x00000000); // pictureStructure if(enc->enc_pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_P || enc->enc_pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_B) { - struct rvce_cpb_slot *l0 = l0_slot(enc); - rvce_frame_offset(enc, l0, &luma_offset, &chroma_offset); + struct rvce_cpb_slot *l0 = si_l0_slot(enc); + si_vce_frame_offset(enc, l0, &luma_offset, &chroma_offset); RVCE_CS(l0->picture_type); RVCE_CS(l0->frame_num); RVCE_CS(l0->pic_order_cnt); @@ -324,8 +353,8 @@ static void encode(struct rvce_encoder *enc) // encReferencePictureL1[0] RVCE_CS(0x00000000); // pictureStructure if(enc->enc_pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_B) { - struct rvce_cpb_slot *l1 = l1_slot(enc); - rvce_frame_offset(enc, l1, &luma_offset, &chroma_offset); + struct rvce_cpb_slot *l1 = si_l1_slot(enc); + si_vce_frame_offset(enc, l1, &luma_offset, &chroma_offset); RVCE_CS(l1->picture_type); RVCE_CS(l1->frame_num); RVCE_CS(l1->pic_order_cnt); @@ -344,7 +373,7 @@ static void encode(struct rvce_encoder *enc) RVCE_CS(enc->enc_pic.eo.l1_chroma_offset); } - rvce_frame_offset(enc, current_slot(enc), &luma_offset, &chroma_offset); + si_vce_frame_offset(enc, si_current_slot(enc), &luma_offset, &chroma_offset); RVCE_CS(luma_offset); RVCE_CS(chroma_offset); RVCE_CS(enc->enc_pic.eo.enc_coloc_buffer_offset); @@ -426,14 +455,6 @@ static void config_extension(struct rvce_encoder *enc) RVCE_END(); } -static void destroy(struct rvce_encoder *enc) -{ - enc->task_info(enc, 0x00000001, 0, 0, 0); - - RVCE_BEGIN(0x02000001); // destroy - RVCE_END(); -} - static void feedback(struct rvce_encoder *enc) { RVCE_BEGIN(0x05000005); // feedback buffer @@ -442,6 +463,16 @@ static void feedback(struct rvce_encoder *enc) RVCE_END(); } +static void destroy(struct rvce_encoder *enc) +{ + enc->task_info(enc, 0x00000001, 0, 0, 0); + + feedback(enc); + + RVCE_BEGIN(0x02000001); // destroy + RVCE_END(); +} + static void motion_estimation(struct rvce_encoder *enc) { RVCE_BEGIN(0x04000007); // motion estimation @@ -614,7 +645,7 @@ static void vui(struct rvce_encoder *enc) RVCE_END(); } -void radeon_vce_52_init(struct rvce_encoder *enc) +void si_vce_52_init(struct rvce_encoder *enc) { enc->session = session; enc->task_info = task_info;