+static void rate_control(struct rvce_encoder *enc)
+{
+ RVCE_BEGIN(0x04000005); // rate control
+ RVCE_CS(enc->enc_pic.rc.rc_method);
+ RVCE_CS(enc->enc_pic.rc.target_bitrate);
+ RVCE_CS(enc->enc_pic.rc.peak_bitrate);
+ RVCE_CS(enc->enc_pic.rc.frame_rate_num);
+ RVCE_CS(enc->enc_pic.rc.gop_size);
+ RVCE_CS(enc->enc_pic.rc.quant_i_frames);
+ RVCE_CS(enc->enc_pic.rc.quant_p_frames);
+ RVCE_CS(enc->enc_pic.rc.quant_b_frames);
+ RVCE_CS(enc->enc_pic.rc.vbv_buffer_size);
+ RVCE_CS(enc->enc_pic.rc.frame_rate_den);
+ RVCE_CS(enc->enc_pic.rc.vbv_buf_lv);
+ RVCE_CS(enc->enc_pic.rc.max_au_size);
+ RVCE_CS(enc->enc_pic.rc.qp_initial_mode);
+ RVCE_CS(enc->enc_pic.rc.target_bits_picture);
+ RVCE_CS(enc->enc_pic.rc.peak_bits_picture_integer);
+ RVCE_CS(enc->enc_pic.rc.peak_bits_picture_fraction);
+ RVCE_CS(enc->enc_pic.rc.min_qp);
+ RVCE_CS(enc->enc_pic.rc.max_qp);
+ RVCE_CS(enc->enc_pic.rc.skip_frame_enable);
+ RVCE_CS(enc->enc_pic.rc.fill_data_enable);
+ RVCE_CS(enc->enc_pic.rc.enforce_hrd);
+ RVCE_CS(enc->enc_pic.rc.b_pics_delta_qp);
+ RVCE_CS(enc->enc_pic.rc.ref_b_pics_delta_qp);
+ RVCE_CS(enc->enc_pic.rc.rc_reinit_disable);
+ RVCE_CS(enc->enc_pic.rc.enc_lcvbr_init_qp_flag);
+ RVCE_CS(enc->enc_pic.rc.lcvbrsatd_based_nonlinear_bit_budget_flag);
+ RVCE_END();
+}
+
+static void config(struct rvce_encoder *enc)
+{
+ enc->task_info(enc, 0x00000002, 0, 0xffffffff, 0);
+ enc->rate_control(enc);
+ enc->config_extension(enc);
+ enc->motion_estimation(enc);
+ enc->rdo(enc);
+ if (enc->use_vui)
+ enc->vui(enc);
+ enc->pic_control(enc);
+}
+
+static void config_extension(struct rvce_encoder *enc)
+{
+ RVCE_BEGIN(0x04000001); // config extension
+ RVCE_CS(enc->enc_pic.ce.enc_enable_perf_logging);
+ 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
+ RVCE_WRITE(enc->fb->res->buf, enc->fb->res->domains, 0x0); // feedbackRingAddressHi/Lo
+ RVCE_CS(enc->enc_pic.fb.feedback_ring_size);
+ RVCE_END();
+}
+
+static void motion_estimation(struct rvce_encoder *enc)
+{
+ RVCE_BEGIN(0x04000007); // motion estimation
+ RVCE_CS(enc->enc_pic.me.enc_ime_decimation_search);
+ RVCE_CS(enc->enc_pic.me.motion_est_half_pixel);
+ RVCE_CS(enc->enc_pic.me.motion_est_quarter_pixel);
+ RVCE_CS(enc->enc_pic.me.disable_favor_pmv_point);
+ RVCE_CS(enc->enc_pic.me.force_zero_point_center);
+ RVCE_CS(enc->enc_pic.me.lsmvert);
+ RVCE_CS(enc->enc_pic.me.enc_search_range_x);
+ RVCE_CS(enc->enc_pic.me.enc_search_range_y);
+ RVCE_CS(enc->enc_pic.me.enc_search1_range_x);
+ RVCE_CS(enc->enc_pic.me.enc_search1_range_y);
+ RVCE_CS(enc->enc_pic.me.disable_16x16_frame1);
+ RVCE_CS(enc->enc_pic.me.disable_satd);
+ RVCE_CS(enc->enc_pic.me.enable_amd);
+ RVCE_CS(enc->enc_pic.me.enc_disable_sub_mode);
+ RVCE_CS(enc->enc_pic.me.enc_ime_skip_x);
+ RVCE_CS(enc->enc_pic.me.enc_ime_skip_y);
+ RVCE_CS(enc->enc_pic.me.enc_en_ime_overw_dis_subm);
+ RVCE_CS(enc->enc_pic.me.enc_ime_overw_dis_subm_no);
+ RVCE_CS(enc->enc_pic.me.enc_ime2_search_range_x);
+ RVCE_CS(enc->enc_pic.me.enc_ime2_search_range_y);
+ RVCE_CS(enc->enc_pic.me.parallel_mode_speedup_enable);
+ RVCE_CS(enc->enc_pic.me.fme0_enc_disable_sub_mode);
+ RVCE_CS(enc->enc_pic.me.fme1_enc_disable_sub_mode);
+ RVCE_CS(enc->enc_pic.me.ime_sw_speedup_enable);
+ RVCE_END();
+}
+
+static void pic_control(struct rvce_encoder *enc)
+{
+ RVCE_BEGIN(0x04000002); // pic control
+ RVCE_CS(enc->enc_pic.pc.enc_use_constrained_intra_pred);
+ RVCE_CS(enc->enc_pic.pc.enc_cabac_enable);
+ RVCE_CS(enc->enc_pic.pc.enc_cabac_idc);
+ RVCE_CS(enc->enc_pic.pc.enc_loop_filter_disable);
+ RVCE_CS(enc->enc_pic.pc.enc_lf_beta_offset);
+ RVCE_CS(enc->enc_pic.pc.enc_lf_alpha_c0_offset);
+ RVCE_CS(enc->enc_pic.pc.enc_crop_left_offset);
+ RVCE_CS(enc->enc_pic.pc.enc_crop_right_offset);
+ RVCE_CS(enc->enc_pic.pc.enc_crop_top_offset);
+ RVCE_CS(enc->enc_pic.pc.enc_crop_bottom_offset);
+ RVCE_CS(enc->enc_pic.pc.enc_num_mbs_per_slice);
+ RVCE_CS(enc->enc_pic.pc.enc_intra_refresh_num_mbs_per_slot);
+ RVCE_CS(enc->enc_pic.pc.enc_force_intra_refresh);
+ RVCE_CS(enc->enc_pic.pc.enc_force_imb_period);
+ RVCE_CS(enc->enc_pic.pc.enc_pic_order_cnt_type);
+ RVCE_CS(enc->enc_pic.pc.log2_max_pic_order_cnt_lsb_minus4);
+ RVCE_CS(enc->enc_pic.pc.enc_sps_id);
+ RVCE_CS(enc->enc_pic.pc.enc_pps_id);
+ RVCE_CS(enc->enc_pic.pc.enc_constraint_set_flags);
+ RVCE_CS(enc->enc_pic.pc.enc_b_pic_pattern);
+ RVCE_CS(enc->enc_pic.pc.weight_pred_mode_b_picture);
+ RVCE_CS(enc->enc_pic.pc.enc_number_of_reference_frames);
+ RVCE_CS(enc->enc_pic.pc.enc_max_num_ref_frames);
+ RVCE_CS(enc->enc_pic.pc.enc_num_default_active_ref_l0);
+ RVCE_CS(enc->enc_pic.pc.enc_num_default_active_ref_l1);
+ RVCE_CS(enc->enc_pic.pc.enc_slice_mode);
+ RVCE_CS(enc->enc_pic.pc.enc_max_slice_size);
+ RVCE_END();
+}
+
+static void rdo(struct rvce_encoder *enc)
+{
+ RVCE_BEGIN(0x04000008); // rdo
+ RVCE_CS(enc->enc_pic.rdo.enc_disable_tbe_pred_i_frame);
+ RVCE_CS(enc->enc_pic.rdo.enc_disable_tbe_pred_p_frame);
+ RVCE_CS(enc->enc_pic.rdo.use_fme_interpol_y);
+ RVCE_CS(enc->enc_pic.rdo.use_fme_interpol_uv);
+ RVCE_CS(enc->enc_pic.rdo.use_fme_intrapol_y);
+ RVCE_CS(enc->enc_pic.rdo.use_fme_intrapol_uv);
+ RVCE_CS(enc->enc_pic.rdo.use_fme_interpol_y_1);
+ RVCE_CS(enc->enc_pic.rdo.use_fme_interpol_uv_1);
+ RVCE_CS(enc->enc_pic.rdo.use_fme_intrapol_y_1);
+ RVCE_CS(enc->enc_pic.rdo.use_fme_intrapol_uv_1);
+ RVCE_CS(enc->enc_pic.rdo.enc_16x16_cost_adj);
+ RVCE_CS(enc->enc_pic.rdo.enc_skip_cost_adj);
+ RVCE_CS(enc->enc_pic.rdo.enc_force_16x16_skip);
+ RVCE_CS(enc->enc_pic.rdo.enc_disable_threshold_calc_a);
+ RVCE_CS(enc->enc_pic.rdo.enc_luma_coeff_cost);
+ RVCE_CS(enc->enc_pic.rdo.enc_luma_mb_coeff_cost);
+ RVCE_CS(enc->enc_pic.rdo.enc_chroma_coeff_cost);
+ RVCE_END();
+}
+
+static void session(struct rvce_encoder *enc)