radv/video: rework command buffer emission

This is much closer to RadeonSI and could be shared at some point.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34150>
This commit is contained in:
Samuel Pitoiset
2025-03-24 09:36:27 +01:00
committed by Marge Bot
parent 0e0a393a4a
commit c036736e2e
2 changed files with 272 additions and 314 deletions
-7
View File
@@ -328,13 +328,6 @@ radeon_emit(struct radeon_cmdbuf *cs, uint32_t value)
cs->buf[cs->cdw++] = value;
}
static inline void
radeon_emit_direct(struct radeon_cmdbuf *cs, uint32_t offset, uint32_t value)
{
assert(offset < cs->reserved_dw);
cs->buf[offset] = value;
}
static inline void
radeon_emit_array(struct radeon_cmdbuf *cs, const uint32_t *values, unsigned count)
{
+272 -307
View File
@@ -429,13 +429,16 @@ radv_enc_code_se(struct radv_cmd_buffer *cmd_buffer, int value)
radv_enc_code_ue(cmd_buffer, v);
}
#define ENC_BEGIN \
{ \
uint32_t begin = cs->cdw++;
#define RADEON_ENC_CS(value) (cmd_buffer->cs->buf[cmd_buffer->cs->cdw++] = (value))
#define ENC_END \
radeon_emit_direct(cs, begin, (cs->cdw - begin) * 4); \
cmd_buffer->video.enc.total_task_size += cs->buf[begin]; \
#define RADEON_ENC_BEGIN(cmd) \
{ \
uint32_t *begin = &cmd_buffer->cs->buf[cmd_buffer->cs->cdw++]; \
RADEON_ENC_CS(cmd)
#define RADEON_ENC_END() \
*begin = (&cmd_buffer->cs->buf[cmd_buffer->cs->cdw] - begin) * 4; \
cmd_buffer->video.enc.total_task_size += *begin; \
}
static void
@@ -444,17 +447,18 @@ radv_enc_session_info(struct radv_cmd_buffer *cmd_buffer)
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.session_info);
radeon_emit(cs, pdev->encoder_interface_version);
radv_cs_add_buffer(device->ws, cs, cmd_buffer->video.vid->sessionctx.mem->bo);
uint64_t va = radv_buffer_get_va(cmd_buffer->video.vid->sessionctx.mem->bo);
va += cmd_buffer->video.vid->sessionctx.offset;
radeon_emit(cs, va >> 32);
radeon_emit(cs, va & 0xffffffff);
radeon_emit(cs, RENCODE_ENGINE_TYPE_ENCODE);
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.session_info);
RADEON_ENC_CS(pdev->encoder_interface_version);
RADEON_ENC_CS(va >> 32);
RADEON_ENC_CS(va & 0xffffffff);
RADEON_ENC_CS(RENCODE_ENGINE_TYPE_ENCODE);
RADEON_ENC_END();
}
static void
@@ -466,12 +470,11 @@ radv_enc_task_info(struct radv_cmd_buffer *cmd_buffer, bool feedback)
struct radv_enc_state *enc = &cmd_buffer->video.enc;
enc->task_id++;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.task_info);
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.task_info);
enc->p_task_size = &cs->buf[cs->cdw++];
radeon_emit(cs, enc->task_id);
radeon_emit(cs, feedback ? 1 : 0);
ENC_END;
RADEON_ENC_CS(enc->task_id);
RADEON_ENC_CS(feedback ? 1 : 0);
RADEON_ENC_END();
}
static void
@@ -480,7 +483,6 @@ radv_enc_session_init(struct radv_cmd_buffer *cmd_buffer, const struct VkVideoEn
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radv_video_session *vid = cmd_buffer->video.vid;
struct radeon_cmdbuf *cs = cmd_buffer->cs;
unsigned alignment_w = 16;
unsigned alignment_h = 16;
if (vid->vk.op == VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR) {
@@ -494,23 +496,22 @@ radv_enc_session_init(struct radv_cmd_buffer *cmd_buffer, const struct VkVideoEn
uint32_t padding_width = aligned_picture_width - w;
uint32_t padding_height = aligned_picture_height - h;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.session_init);
radeon_emit(cs, vid->enc_session.encode_standard);
radeon_emit(cs, aligned_picture_width);
radeon_emit(cs, aligned_picture_height);
radeon_emit(cs, padding_width);
radeon_emit(cs, padding_height);
radeon_emit(cs, vid->enc_session.pre_encode_mode);
radeon_emit(cs, vid->enc_session.pre_encode_chroma_enabled);
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.session_init);
RADEON_ENC_CS(vid->enc_session.encode_standard);
RADEON_ENC_CS(aligned_picture_width);
RADEON_ENC_CS(aligned_picture_height);
RADEON_ENC_CS(padding_width);
RADEON_ENC_CS(padding_height);
RADEON_ENC_CS(vid->enc_session.pre_encode_mode);
RADEON_ENC_CS(vid->enc_session.pre_encode_chroma_enabled);
if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_3) {
radeon_emit(cs, 0); // slice output enabled.
RADEON_ENC_CS(0); // slice output enabled.
}
radeon_emit(cs, vid->enc_session.display_remote);
RADEON_ENC_CS(vid->enc_session.display_remote);
if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_4) {
radeon_emit(cs, 0);
RADEON_ENC_CS(0);
}
ENC_END;
RADEON_ENC_END();
}
static void
@@ -518,12 +519,11 @@ radv_enc_layer_control(struct radv_cmd_buffer *cmd_buffer, const rvcn_enc_layer_
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.layer_control);
radeon_emit(cs, rc_layer_control->max_num_temporal_layers); // max num temporal layesr
radeon_emit(cs, rc_layer_control->num_temporal_layers); // num temporal layers
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.layer_control);
RADEON_ENC_CS(rc_layer_control->max_num_temporal_layers); // max num temporal layesr
RADEON_ENC_CS(rc_layer_control->num_temporal_layers); // num temporal layers
RADEON_ENC_END();
}
static void
@@ -531,11 +531,10 @@ radv_enc_layer_select(struct radv_cmd_buffer *cmd_buffer, int tl_idx)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.layer_select);
radeon_emit(cs, tl_idx); // temporal layer index
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.layer_select);
RADEON_ENC_CS(tl_idx); // temporal layer index
RADEON_ENC_END();
}
static void
@@ -543,17 +542,16 @@ radv_enc_slice_control(struct radv_cmd_buffer *cmd_buffer, const struct VkVideoE
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
uint32_t num_mbs_in_slice;
uint32_t width_in_mbs = DIV_ROUND_UP(enc_info->srcPictureResource.codedExtent.width, 16);
uint32_t height_in_mbs = DIV_ROUND_UP(enc_info->srcPictureResource.codedExtent.height, 16);
num_mbs_in_slice = width_in_mbs * height_in_mbs;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.slice_control_h264);
radeon_emit(cs, RENCODE_H264_SLICE_CONTROL_MODE_FIXED_MBS); // slice control mode
radeon_emit(cs, num_mbs_in_slice); // num mbs per slice
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.slice_control_h264);
RADEON_ENC_CS(RENCODE_H264_SLICE_CONTROL_MODE_FIXED_MBS); // slice control mode
RADEON_ENC_CS(num_mbs_in_slice); // num mbs per slice
RADEON_ENC_END();
}
static void
@@ -561,7 +559,6 @@ radv_enc_spec_misc_h264(struct radv_cmd_buffer *cmd_buffer, const struct VkVideo
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
const struct VkVideoEncodeH264PictureInfoKHR *h264_picture_info =
vk_find_struct_const(enc_info->pNext, VIDEO_ENCODE_H264_PICTURE_INFO_KHR);
const StdVideoEncodeH264PictureInfo *pic = h264_picture_info->pStdPictureInfo;
@@ -569,26 +566,26 @@ radv_enc_spec_misc_h264(struct radv_cmd_buffer *cmd_buffer, const struct VkVideo
vk_video_find_h264_enc_std_sps(&cmd_buffer->video.params->vk, pic->seq_parameter_set_id);
const StdVideoH264PictureParameterSet *pps =
vk_video_find_h264_enc_std_pps(&cmd_buffer->video.params->vk, pic->pic_parameter_set_id);
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.spec_misc_h264);
radeon_emit(cs, pps->flags.constrained_intra_pred_flag); // constrained_intra_pred_flag
radeon_emit(cs, pps->flags.entropy_coding_mode_flag); // cabac enable
radeon_emit(cs, 0); // cabac init idc
radeon_emit(cs, 1); // half pel enabled
radeon_emit(cs, 1); // quarter pel enabled
radeon_emit(cs, cmd_buffer->video.vid->vk.h264.profile_idc); // profile_idc
radeon_emit(cs, vk_video_get_h264_level(sps->level_idc));
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.spec_misc_h264);
RADEON_ENC_CS(pps->flags.constrained_intra_pred_flag); // constrained_intra_pred_flag
RADEON_ENC_CS(pps->flags.entropy_coding_mode_flag); // cabac enable
RADEON_ENC_CS(0); // cabac init idc
RADEON_ENC_CS(1); // half pel enabled
RADEON_ENC_CS(1); // quarter pel enabled
RADEON_ENC_CS(cmd_buffer->video.vid->vk.h264.profile_idc); // profile_idc
RADEON_ENC_CS(vk_video_get_h264_level(sps->level_idc));
if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_3) {
bool b_pic_enabled = false;
if (sps->pSequenceParameterSetVui) {
b_pic_enabled = !!sps->pSequenceParameterSetVui->max_num_reorder_frames;
}
radeon_emit(cs, b_pic_enabled); // v3 b_picture_enabled
radeon_emit(cs, pps->weighted_bipred_idc); // v3 weighted bipred idc
RADEON_ENC_CS(b_pic_enabled); // v3 b_picture_enabled
RADEON_ENC_CS(pps->weighted_bipred_idc); // v3 weighted bipred idc
}
ENC_END;
RADEON_ENC_END();
}
static void
@@ -596,7 +593,6 @@ radv_enc_spec_misc_hevc(struct radv_cmd_buffer *cmd_buffer, const struct VkVideo
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
const struct VkVideoEncodeH265PictureInfoKHR *h265_picture_info =
vk_find_struct_const(enc_info->pNext, VIDEO_ENCODE_H265_PICTURE_INFO_KHR);
const StdVideoEncodeH265PictureInfo *pic = h265_picture_info->pStdPictureInfo;
@@ -606,20 +602,20 @@ radv_enc_spec_misc_hevc(struct radv_cmd_buffer *cmd_buffer, const struct VkVideo
vk_video_find_h265_enc_std_sps(&cmd_buffer->video.params->vk, pic->pps_seq_parameter_set_id);
const StdVideoH265PictureParameterSet *pps =
vk_video_find_h265_enc_std_pps(&cmd_buffer->video.params->vk, pic->pps_pic_parameter_set_id);
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.spec_misc_hevc);
radeon_emit(cs, sps->log2_min_luma_coding_block_size_minus3);
radeon_emit(cs, !sps->flags.amp_enabled_flag);
radeon_emit(cs, sps->flags.strong_intra_smoothing_enabled_flag);
radeon_emit(cs, pps->flags.constrained_intra_pred_flag);
radeon_emit(cs, slice->flags.cabac_init_flag);
radeon_emit(cs, 1); // enc->enc_pic.hevc_spec_misc.half_pel_enabled
radeon_emit(cs, 1); // enc->enc_pic.hevc_spec_misc.quarter_pel_enabled
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.spec_misc_hevc);
RADEON_ENC_CS(sps->log2_min_luma_coding_block_size_minus3);
RADEON_ENC_CS(!sps->flags.amp_enabled_flag);
RADEON_ENC_CS(sps->flags.strong_intra_smoothing_enabled_flag);
RADEON_ENC_CS(pps->flags.constrained_intra_pred_flag);
RADEON_ENC_CS(slice->flags.cabac_init_flag);
RADEON_ENC_CS(1); // enc->enc_pic.hevc_spec_misc.half_pel_enabled
RADEON_ENC_CS(1); // enc->enc_pic.hevc_spec_misc.quarter_pel_enabled
if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_3) {
radeon_emit(cs, !pps->flags.transform_skip_enabled_flag);
radeon_emit(cs, pps->flags.cu_qp_delta_enabled_flag);
RADEON_ENC_CS(!pps->flags.transform_skip_enabled_flag);
RADEON_ENC_CS(pps->flags.cu_qp_delta_enabled_flag);
}
ENC_END;
RADEON_ENC_END();
}
static void
@@ -627,19 +623,18 @@ radv_enc_slice_control_hevc(struct radv_cmd_buffer *cmd_buffer, const struct VkV
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
uint32_t width_in_ctb, height_in_ctb, num_ctbs_in_slice;
width_in_ctb = DIV_ROUND_UP(enc_info->srcPictureResource.codedExtent.width, 64);
height_in_ctb = DIV_ROUND_UP(enc_info->srcPictureResource.codedExtent.height, 64);
num_ctbs_in_slice = width_in_ctb * height_in_ctb;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.slice_control_hevc);
radeon_emit(cs, RENCODE_HEVC_SLICE_CONTROL_MODE_FIXED_CTBS);
radeon_emit(cs, num_ctbs_in_slice); // num_ctbs_in_slice
radeon_emit(cs, num_ctbs_in_slice); // num_ctbs_in_slice_segment
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.slice_control_hevc);
RADEON_ENC_CS(RENCODE_HEVC_SLICE_CONTROL_MODE_FIXED_CTBS);
RADEON_ENC_CS(num_ctbs_in_slice); // num_ctbs_in_slice
RADEON_ENC_CS(num_ctbs_in_slice); // num_ctbs_in_slice_segment
RADEON_ENC_END();
}
static void
@@ -647,13 +642,12 @@ radv_enc_rc_session_init(struct radv_cmd_buffer *cmd_buffer)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
struct radv_video_session *vid = cmd_buffer->video.vid;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.rc_session_init);
radeon_emit(cs, vid->enc_rate_control_method); // rate_control_method);
radeon_emit(cs, vid->enc_vbv_buffer_level); // vbv_buffer_level);
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.rc_session_init);
RADEON_ENC_CS(vid->enc_rate_control_method); // rate_control_method);
RADEON_ENC_CS(vid->enc_vbv_buffer_level); // vbv_buffer_level);
RADEON_ENC_END();
}
static void
@@ -661,18 +655,17 @@ radv_enc_rc_layer_init(struct radv_cmd_buffer *cmd_buffer, rvcn_enc_rate_ctl_lay
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.rc_layer_init);
radeon_emit(cs, layer_init->target_bit_rate); // target bit rate
radeon_emit(cs, layer_init->peak_bit_rate); // peak bit rate
radeon_emit(cs, layer_init->frame_rate_num); // frame rate num
radeon_emit(cs, layer_init->frame_rate_den); // frame rate dem
radeon_emit(cs, layer_init->vbv_buffer_size); // vbv buffer size
radeon_emit(cs, layer_init->avg_target_bits_per_picture); // avg target bits per picture
radeon_emit(cs, layer_init->peak_bits_per_picture_integer); // peak bit per picture int
radeon_emit(cs, layer_init->peak_bits_per_picture_fractional); // peak bit per picture fract
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.rc_layer_init);
RADEON_ENC_CS(layer_init->target_bit_rate); // target bit rate
RADEON_ENC_CS(layer_init->peak_bit_rate); // peak bit rate
RADEON_ENC_CS(layer_init->frame_rate_num); // frame rate num
RADEON_ENC_CS(layer_init->frame_rate_den); // frame rate dem
RADEON_ENC_CS(layer_init->vbv_buffer_size); // vbv buffer size
RADEON_ENC_CS(layer_init->avg_target_bits_per_picture); // avg target bits per picture
RADEON_ENC_CS(layer_init->peak_bits_per_picture_integer); // peak bit per picture int
RADEON_ENC_CS(layer_init->peak_bits_per_picture_fractional); // peak bit per picture fract
RADEON_ENC_END();
}
static void
@@ -680,19 +673,18 @@ radv_enc_deblocking_filter_h264(struct radv_cmd_buffer *cmd_buffer, const VkVide
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
const struct VkVideoEncodeH264PictureInfoKHR *h264_picture_info =
vk_find_struct_const(enc_info->pNext, VIDEO_ENCODE_H264_PICTURE_INFO_KHR);
const VkVideoEncodeH264NaluSliceInfoKHR *h264_slice = &h264_picture_info->pNaluSliceEntries[0];
const StdVideoEncodeH264SliceHeader *slice = h264_slice->pStdSliceHeader;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.deblocking_filter_h264);
radeon_emit(cs, slice->disable_deblocking_filter_idc);
radeon_emit(cs, slice->slice_alpha_c0_offset_div2);
radeon_emit(cs, slice->slice_beta_offset_div2);
radeon_emit(cs, 0); // cb qp offset
radeon_emit(cs, 0); // cr qp offset
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.deblocking_filter_h264);
RADEON_ENC_CS(slice->disable_deblocking_filter_idc);
RADEON_ENC_CS(slice->slice_alpha_c0_offset_div2);
RADEON_ENC_CS(slice->slice_beta_offset_div2);
RADEON_ENC_CS(0); // cb qp offset
RADEON_ENC_CS(0); // cr qp offset
RADEON_ENC_END();
}
static void
@@ -700,7 +692,6 @@ radv_enc_deblocking_filter_hevc(struct radv_cmd_buffer *cmd_buffer, const VkVide
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
const struct VkVideoEncodeH265PictureInfoKHR *h265_picture_info =
vk_find_struct_const(enc_info->pNext, VIDEO_ENCODE_H265_PICTURE_INFO_KHR);
const StdVideoEncodeH265PictureInfo *pic = h265_picture_info->pStdPictureInfo;
@@ -709,17 +700,16 @@ radv_enc_deblocking_filter_hevc(struct radv_cmd_buffer *cmd_buffer, const VkVide
const StdVideoH265SequenceParameterSet *sps =
vk_video_find_h265_enc_std_sps(&cmd_buffer->video.params->vk, pic->pps_seq_parameter_set_id);
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.deblocking_filter_hevc);
radeon_emit(cs, slice->flags.slice_loop_filter_across_slices_enabled_flag);
radeon_emit(cs, slice->flags.slice_deblocking_filter_disabled_flag);
radeon_emit(cs, slice->slice_beta_offset_div2);
radeon_emit(cs, slice->slice_tc_offset_div2);
radeon_emit(cs, slice->slice_cb_qp_offset);
radeon_emit(cs, slice->slice_cr_qp_offset);
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.deblocking_filter_hevc);
RADEON_ENC_CS(slice->flags.slice_loop_filter_across_slices_enabled_flag);
RADEON_ENC_CS(slice->flags.slice_deblocking_filter_disabled_flag);
RADEON_ENC_CS(slice->slice_beta_offset_div2);
RADEON_ENC_CS(slice->slice_tc_offset_div2);
RADEON_ENC_CS(slice->slice_cb_qp_offset);
RADEON_ENC_CS(slice->slice_cr_qp_offset);
if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_2)
radeon_emit(cs, !sps->flags.sample_adaptive_offset_enabled_flag);
ENC_END;
RADEON_ENC_CS(!sps->flags.sample_adaptive_offset_enabled_flag);
RADEON_ENC_END();
}
static void
@@ -727,16 +717,15 @@ radv_enc_quality_params(struct radv_cmd_buffer *cmd_buffer)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.quality_params);
radeon_emit(cs, 0);
radeon_emit(cs, 0);
radeon_emit(cs, 0);
radeon_emit(cs, 0);
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.quality_params);
RADEON_ENC_CS(0);
RADEON_ENC_CS(0);
RADEON_ENC_CS(0);
RADEON_ENC_CS(0);
if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_2)
radeon_emit(cs, 0);
ENC_END;
RADEON_ENC_CS(0);
RADEON_ENC_END();
}
static void
@@ -744,14 +733,12 @@ radv_enc_latency(struct radv_cmd_buffer *cmd_buffer, VkVideoEncodeTuningModeKHR
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
if (tuning_mode == VK_VIDEO_ENCODE_TUNING_MODE_LOW_LATENCY_KHR
|| tuning_mode == VK_VIDEO_ENCODE_TUNING_MODE_ULTRA_LOW_LATENCY_KHR)
{
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.enc_latency);
radeon_emit(cs, 1000);
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.enc_latency);
RADEON_ENC_CS(1000);
RADEON_ENC_END();
}
}
@@ -781,8 +768,8 @@ radv_enc_slice_header(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInf
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.slice_header);
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.slice_header);
radv_enc_reset(cmd_buffer);
radv_enc_set_emulation_prevention(cmd_buffer, false);
@@ -948,12 +935,12 @@ radv_enc_slice_header(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInf
cdw_filled = cs->cdw - cdw_start;
for (int i = 0; i < RENCODE_SLICE_HEADER_TEMPLATE_MAX_TEMPLATE_SIZE_IN_DWORDS - cdw_filled; i++)
radeon_emit(cs, 0x00000000);
RADEON_ENC_CS(0x00000000);
for (int j = 0; j < RENCODE_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS; j++) {
radeon_emit(cs, instruction[j]);
radeon_emit(cs, num_bits[j]);
RADEON_ENC_CS(instruction[j]);
RADEON_ENC_CS(num_bits[j]);
}
ENC_END;
RADEON_ENC_END();
}
static void
@@ -980,8 +967,7 @@ radv_enc_slice_header_hevc(struct radv_cmd_buffer *cmd_buffer, const VkVideoEnco
struct radeon_cmdbuf *cs = cmd_buffer->cs;
unsigned nal_unit_type = vk_video_get_h265_nal_unit(pic);
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.slice_header);
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.slice_header);
radv_enc_reset(cmd_buffer);
radv_enc_set_emulation_prevention(cmd_buffer, false);
@@ -1164,12 +1150,12 @@ radv_enc_slice_header_hevc(struct radv_cmd_buffer *cmd_buffer, const VkVideoEnco
cdw_filled = cs->cdw - cdw_start;
for (int i = 0; i < RENCODE_SLICE_HEADER_TEMPLATE_MAX_TEMPLATE_SIZE_IN_DWORDS - cdw_filled; i++)
radeon_emit(cs, 0x00000000);
RADEON_ENC_CS(0x00000000);
for (int j = 0; j < RENCODE_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS; j++) {
radeon_emit(cs, instruction[j]);
radeon_emit(cs, num_bits[j]);
RADEON_ENC_CS(instruction[j]);
RADEON_ENC_CS(num_bits[j]);
}
ENC_END;
RADEON_ENC_END();
}
static void
@@ -1240,14 +1226,14 @@ radv_enc_ctx(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInfoKHR *inf
swizzle_mode = RENCODE_REC_SWIZZLE_MODE_256B_D;
else if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_2)
swizzle_mode = RENCODE_REC_SWIZZLE_MODE_256B_S;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.ctx);
radeon_emit(cs, va >> 32);
radeon_emit(cs, va & 0xffffffff);
radeon_emit(cs, swizzle_mode);
radeon_emit(cs, luma_pitch); // rec_luma_pitch
radeon_emit(cs, luma_pitch); // rec_luma_pitch0); //rec_chromma_pitch
radeon_emit(cs, max_ref_slot_idx + 1); // num_reconstructed_pictures
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.ctx);
RADEON_ENC_CS(va >> 32);
RADEON_ENC_CS(va & 0xffffffff);
RADEON_ENC_CS(swizzle_mode);
RADEON_ENC_CS(luma_pitch); // rec_luma_pitch
RADEON_ENC_CS(luma_pitch); // rec_luma_pitch0); //rec_chromma_pitch
RADEON_ENC_CS(max_ref_slot_idx + 1); // num_reconstructed_pictures
int i;
unsigned offset = 0;
@@ -1259,66 +1245,66 @@ radv_enc_ctx(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInfoKHR *inf
offset += colloc_bytes;
}
for (i = 0; i < max_ref_slot_idx + 1; i++) {
radeon_emit(cs, offset);
RADEON_ENC_CS(offset);
offset += luma_size;
radeon_emit(cs, offset);
RADEON_ENC_CS(offset);
offset += chroma_size;
if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_4) {
radeon_emit(cs, 0); /* unused offset 1 */
radeon_emit(cs, 0); /* unused offset 2 */
RADEON_ENC_CS(0); /* unused offset 1 */
RADEON_ENC_CS(0); /* unused offset 2 */
}
}
for (; i < RENCODE_MAX_NUM_RECONSTRUCTED_PICTURES; i++) {
radeon_emit(cs, 0);
radeon_emit(cs, 0);
RADEON_ENC_CS(0);
RADEON_ENC_CS(0);
if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_4) {
radeon_emit(cs, 0); /* unused offset 1 */
radeon_emit(cs, 0); /* unused offset 2 */
RADEON_ENC_CS(0); /* unused offset 1 */
RADEON_ENC_CS(0); /* unused offset 2 */
}
}
if (pdev->enc_hw_ver == RADV_VIDEO_ENC_HW_3) {
radeon_emit(cs, colloc_buffer_offset);
RADEON_ENC_CS(colloc_buffer_offset);
}
radeon_emit(cs, 0); // enc pic pre encode luma pitch
radeon_emit(cs, 0); // enc pic pre encode chroma pitch
RADEON_ENC_CS(0); // enc pic pre encode luma pitch
RADEON_ENC_CS(0); // enc pic pre encode chroma pitch
for (i = 0; i < RENCODE_MAX_NUM_RECONSTRUCTED_PICTURES; i++) {
radeon_emit(cs, 0); // pre encode luma offset
radeon_emit(cs, 0); // pre encode chroma offset
RADEON_ENC_CS(0); // pre encode luma offset
RADEON_ENC_CS(0); // pre encode chroma offset
if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_4) {
radeon_emit(cs, 0); /* unused offset 1 */
radeon_emit(cs, 0); /* unused offset 2 */
RADEON_ENC_CS(0); /* unused offset 1 */
RADEON_ENC_CS(0); /* unused offset 2 */
}
}
if (pdev->enc_hw_ver == RADV_VIDEO_ENC_HW_2) {
radeon_emit(cs, 0); // enc pic yuv luma offset
radeon_emit(cs, 0); // enc pic yuv chroma offset
RADEON_ENC_CS(0); // enc pic yuv luma offset
RADEON_ENC_CS(0); // enc pic yuv chroma offset
radeon_emit(cs, 0); // two pass search center map offset
RADEON_ENC_CS(0); // two pass search center map offset
// rgboffsets
radeon_emit(cs, 0); // red
radeon_emit(cs, 0); // green
radeon_emit(cs, 0); // blue
RADEON_ENC_CS(0); // red
RADEON_ENC_CS(0); // green
RADEON_ENC_CS(0); // blue
} else if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_3) {
radeon_emit(cs, 0); // red
radeon_emit(cs, 0); // green
radeon_emit(cs, 0); // blue
radeon_emit(cs, 0); // v3 two pass search center map offset
RADEON_ENC_CS(0); // red
RADEON_ENC_CS(0); // green
RADEON_ENC_CS(0); // blue
RADEON_ENC_CS(0); // v3 two pass search center map offset
if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_4) {
radeon_emit(cs, colloc_buffer_offset);
RADEON_ENC_CS(colloc_buffer_offset);
} else {
radeon_emit(cs, 0);
RADEON_ENC_CS(0);
}
if (pdev->enc_hw_ver == RADV_VIDEO_ENC_HW_3) {
radeon_emit(cs, 0);
RADEON_ENC_CS(0);
}
}
ENC_END;
RADEON_ENC_END();
}
static void
@@ -1330,14 +1316,13 @@ radv_enc_bitstream(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buffe
uint64_t va = vk_buffer_address(&buffer->vk, offset);
radv_cs_add_buffer(device->ws, cs, buffer->bo);
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.bitstream);
radeon_emit(cs, RENCODE_REC_SWIZZLE_MODE_LINEAR);
radeon_emit(cs, va >> 32);
radeon_emit(cs, va & 0xffffffff);
radeon_emit(cs, buffer->vk.size);
radeon_emit(cs, 0);
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.bitstream);
RADEON_ENC_CS(RENCODE_REC_SWIZZLE_MODE_LINEAR);
RADEON_ENC_CS(va >> 32);
RADEON_ENC_CS(va & 0xffffffff);
RADEON_ENC_CS(buffer->vk.size);
RADEON_ENC_CS(0);
RADEON_ENC_END();
}
static void
@@ -1345,16 +1330,14 @@ radv_enc_feedback(struct radv_cmd_buffer *cmd_buffer, uint64_t feedback_query_va
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.feedback);
radeon_emit(cs, RENCODE_FEEDBACK_BUFFER_MODE_LINEAR);
radeon_emit(cs, feedback_query_va >> 32);
radeon_emit(cs, feedback_query_va & 0xffffffff);
radeon_emit(cs, 16); // buffer_size
radeon_emit(cs, 40); // data_size
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.feedback);
RADEON_ENC_CS(RENCODE_FEEDBACK_BUFFER_MODE_LINEAR);
RADEON_ENC_CS(feedback_query_va >> 32);
RADEON_ENC_CS(feedback_query_va & 0xffffffff);
RADEON_ENC_CS(16); // buffer_size
RADEON_ENC_CS(40); // data_size
RADEON_ENC_END();
}
static void
@@ -1362,13 +1345,12 @@ radv_enc_intra_refresh(struct radv_cmd_buffer *cmd_buffer)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.intra_refresh);
radeon_emit(cs, 0); // intra refresh mode
radeon_emit(cs, 0); // intra ref offset
radeon_emit(cs, 0); // intra region size
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.intra_refresh);
RADEON_ENC_CS(0); // intra refresh mode
RADEON_ENC_CS(0); // intra ref offset
RADEON_ENC_CS(0); // intra region size
RADEON_ENC_END();
}
static void
@@ -1378,7 +1360,6 @@ radv_enc_rc_per_pic(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInfoK
struct radv_video_session *vid = cmd_buffer->video.vid;
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
unsigned qp = per_pic->qp_i;
@@ -1402,25 +1383,25 @@ radv_enc_rc_per_pic(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInfoK
break;
}
}
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.rc_per_pic);
radeon_emit(cs, qp); // qp_i
radeon_emit(cs, qp); // qp_p
radeon_emit(cs, qp); // qp_b
radeon_emit(cs, per_pic->min_qp_i);
radeon_emit(cs, per_pic->max_qp_i);
radeon_emit(cs, per_pic->min_qp_p);
radeon_emit(cs, per_pic->max_qp_p);
radeon_emit(cs, per_pic->min_qp_b);
radeon_emit(cs, per_pic->max_qp_b);
radeon_emit(cs, per_pic->max_au_size_i);
radeon_emit(cs, per_pic->max_au_size_p);
radeon_emit(cs, per_pic->max_au_size_b);
radeon_emit(cs, per_pic->enabled_filler_data);
radeon_emit(cs, per_pic->skip_frame_enable);
radeon_emit(cs, per_pic->enforce_hrd);
radeon_emit(cs, 0xFFFFFFFF); // reserved_0xff
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.rc_per_pic);
RADEON_ENC_CS(qp); // qp_i
RADEON_ENC_CS(qp); // qp_p
RADEON_ENC_CS(qp); // qp_b
RADEON_ENC_CS(per_pic->min_qp_i);
RADEON_ENC_CS(per_pic->max_qp_i);
RADEON_ENC_CS(per_pic->min_qp_p);
RADEON_ENC_CS(per_pic->max_qp_p);
RADEON_ENC_CS(per_pic->min_qp_b);
RADEON_ENC_CS(per_pic->max_qp_b);
RADEON_ENC_CS(per_pic->max_au_size_i);
RADEON_ENC_CS(per_pic->max_au_size_p);
RADEON_ENC_CS(per_pic->max_au_size_b);
RADEON_ENC_CS(per_pic->enabled_filler_data);
RADEON_ENC_CS(per_pic->skip_frame_enable);
RADEON_ENC_CS(per_pic->enforce_hrd);
RADEON_ENC_CS(0xFFFFFFFF); // reserved_0xff
RADEON_ENC_END();
}
static void
@@ -1484,24 +1465,23 @@ radv_enc_params(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInfoKHR *
return;
}
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.enc_params);
radeon_emit(cs, pic_type); // pic type
radeon_emit(cs, enc_info->dstBufferRange); // allowed max bitstream size
radeon_emit(cs, luma_va >> 32);
radeon_emit(cs, luma_va & 0xffffffff);
radeon_emit(cs, chroma_va >> 32);
radeon_emit(cs, chroma_va & 0xffffffff);
radeon_emit(cs, src_img->planes[0].surface.u.gfx9.surf_pitch); // luma pitch
radeon_emit(cs, src_img->planes[1].surface.u.gfx9.surf_pitch); // chroma pitch
radeon_emit(cs, src_img->planes[0].surface.u.gfx9.swizzle_mode); // swizzle mode
radeon_emit(cs, slot_idx); // ref0_idx
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.enc_params);
RADEON_ENC_CS(pic_type); // pic type
RADEON_ENC_CS(enc_info->dstBufferRange); // allowed max bitstream size
RADEON_ENC_CS(luma_va >> 32);
RADEON_ENC_CS(luma_va & 0xffffffff);
RADEON_ENC_CS(chroma_va >> 32);
RADEON_ENC_CS(chroma_va & 0xffffffff);
RADEON_ENC_CS(src_img->planes[0].surface.u.gfx9.surf_pitch); // luma pitch
RADEON_ENC_CS(src_img->planes[1].surface.u.gfx9.surf_pitch); // chroma pitch
RADEON_ENC_CS(src_img->planes[0].surface.u.gfx9.swizzle_mode); // swizzle mode
RADEON_ENC_CS(slot_idx); // ref0_idx
if (enc_info->pSetupReferenceSlot)
radeon_emit(cs, enc_info->pSetupReferenceSlot->slotIndex); // reconstructed picture index
RADEON_ENC_CS(enc_info->pSetupReferenceSlot->slotIndex); // reconstructed picture index
else
radeon_emit(cs, 0);
ENC_END;
RADEON_ENC_CS(0);
RADEON_ENC_END();
}
static void
@@ -1510,7 +1490,6 @@ radv_enc_params_h264(struct radv_cmd_buffer *cmd_buffer,
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
const struct VkVideoEncodeH264PictureInfoKHR *h264_picture_info =
vk_find_struct_const(enc_info->pNext, VIDEO_ENCODE_H264_PICTURE_INFO_KHR);
@@ -1526,78 +1505,69 @@ radv_enc_params_h264(struct radv_cmd_buffer *cmd_buffer,
default:
break;
}
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.enc_params_h264);
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.enc_params_h264);
if (pdev->enc_hw_ver < RADV_VIDEO_ENC_HW_3) {
radeon_emit(cs, RENCODE_H264_PICTURE_STRUCTURE_FRAME);
radeon_emit(cs, RENCODE_H264_INTERLACING_MODE_PROGRESSIVE);
radeon_emit(cs, RENCODE_H264_PICTURE_STRUCTURE_FRAME);
radeon_emit(cs, 0xffffffff); // reference_picture1_index
RADEON_ENC_CS(RENCODE_H264_PICTURE_STRUCTURE_FRAME);
RADEON_ENC_CS(RENCODE_H264_INTERLACING_MODE_PROGRESSIVE);
RADEON_ENC_CS(RENCODE_H264_PICTURE_STRUCTURE_FRAME);
RADEON_ENC_CS(0xffffffff); // reference_picture1_index
} else {
// V3
radeon_emit(cs, RENCODE_H264_PICTURE_STRUCTURE_FRAME);
radeon_emit(cs, 0); // input pic order cnt
radeon_emit(cs, RENCODE_H264_INTERLACING_MODE_PROGRESSIVE);
radeon_emit(cs, 0); // l0 ref pic0 pic_type
radeon_emit(cs, 0); // l0 ref pic0 is long term
radeon_emit(cs, 0); // l0 ref pic0 picture structure
radeon_emit(cs, 0); // l0 ref pic0 pic order cnt
radeon_emit(cs, 0xffffffff); // l0 ref pic1 index
radeon_emit(cs, 0); // l0 ref pic1 pic_type
radeon_emit(cs, 0); // l0 ref pic1 is long term
radeon_emit(cs, 0); // l0 ref pic1 picture structure
radeon_emit(cs, 0); // l0 ref pic1 pic order cnt
radeon_emit(cs, slot_idx_1); // l1 ref pic0 index
radeon_emit(cs, 0); // l1 ref pic0 pic_type
radeon_emit(cs, 0); // l1 ref pic0 is long term
radeon_emit(cs, 0); // l1 ref pic0 picture structure
radeon_emit(cs, 0); // l1 ref pic0 pic order cnt
radeon_emit(cs, h264_pic->flags.is_reference); // is reference
RADEON_ENC_CS(RENCODE_H264_PICTURE_STRUCTURE_FRAME);
RADEON_ENC_CS(0); // input pic order cnt
RADEON_ENC_CS(RENCODE_H264_INTERLACING_MODE_PROGRESSIVE);
RADEON_ENC_CS(0); // l0 ref pic0 pic_type
RADEON_ENC_CS(0); // l0 ref pic0 is long term
RADEON_ENC_CS(0); // l0 ref pic0 picture structure
RADEON_ENC_CS(0); // l0 ref pic0 pic order cnt
RADEON_ENC_CS(0xffffffff); // l0 ref pic1 index
RADEON_ENC_CS(0); // l0 ref pic1 pic_type
RADEON_ENC_CS(0); // l0 ref pic1 is long term
RADEON_ENC_CS(0); // l0 ref pic1 picture structure
RADEON_ENC_CS(0); // l0 ref pic1 pic order cnt
RADEON_ENC_CS(slot_idx_1); // l1 ref pic0 index
RADEON_ENC_CS(0); // l1 ref pic0 pic_type
RADEON_ENC_CS(0); // l1 ref pic0 is long term
RADEON_ENC_CS(0); // l1 ref pic0 picture structure
RADEON_ENC_CS(0); // l1 ref pic0 pic order cnt
RADEON_ENC_CS(h264_pic->flags.is_reference); // is reference
}
ENC_END;
RADEON_ENC_END();
}
static void
radv_enc_op_init(struct radv_cmd_buffer *cmd_buffer)
{
struct radeon_cmdbuf *cs = cmd_buffer->cs;
ENC_BEGIN;
radeon_emit(cs, RENCODE_IB_OP_INITIALIZE);
ENC_END;
RADEON_ENC_BEGIN(RENCODE_IB_OP_INITIALIZE);
RADEON_ENC_END();
}
static void
radv_enc_op_enc(struct radv_cmd_buffer *cmd_buffer)
{
struct radeon_cmdbuf *cs = cmd_buffer->cs;
ENC_BEGIN;
radeon_emit(cs, RENCODE_IB_OP_ENCODE);
ENC_END;
RADEON_ENC_BEGIN(RENCODE_IB_OP_ENCODE);
RADEON_ENC_END();
}
static void
radv_enc_op_init_rc(struct radv_cmd_buffer *cmd_buffer)
{
struct radeon_cmdbuf *cs = cmd_buffer->cs;
ENC_BEGIN;
radeon_emit(cs, RENCODE_IB_OP_INIT_RC);
ENC_END;
RADEON_ENC_BEGIN(RENCODE_IB_OP_INIT_RC);
RADEON_ENC_END();
}
static void
radv_enc_op_init_rc_vbv(struct radv_cmd_buffer *cmd_buffer)
{
struct radeon_cmdbuf *cs = cmd_buffer->cs;
ENC_BEGIN;
radeon_emit(cs, RENCODE_IB_OP_INIT_RC_VBV_BUFFER_LEVEL);
ENC_END;
RADEON_ENC_BEGIN(RENCODE_IB_OP_INIT_RC_VBV_BUFFER_LEVEL);
RADEON_ENC_END();
}
static void
radv_enc_op_preset(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInfoKHR *enc_info)
{
struct radeon_cmdbuf *cs = cmd_buffer->cs;
struct radv_video_session *vid = cmd_buffer->video.vid;
uint32_t preset_mode;
@@ -1623,9 +1593,8 @@ radv_enc_op_preset(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInfoKH
break;
}
ENC_BEGIN;
radeon_emit(cs, preset_mode);
ENC_END;
RADEON_ENC_BEGIN(preset_mode);
RADEON_ENC_END();
}
static void
@@ -1633,7 +1602,6 @@ radv_enc_input_format(struct radv_cmd_buffer *cmd_buffer)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
struct radv_video_session *vid = cmd_buffer->video.vid;
uint32_t color_bit_depth;
uint32_t color_packing_format;
@@ -1652,16 +1620,15 @@ radv_enc_input_format(struct radv_cmd_buffer *cmd_buffer)
return;
}
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.input_format);
radeon_emit(cs, 0); // input color volume
radeon_emit(cs, 0); // input color space
radeon_emit(cs, RENCODE_COLOR_RANGE_STUDIO); // input color range
radeon_emit(cs, 0); // input chroma subsampling
radeon_emit(cs, 0); // input chroma location
radeon_emit(cs, color_bit_depth); // input color bit depth
radeon_emit(cs, color_packing_format); // input color packing format
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.input_format);
RADEON_ENC_CS(0); // input color volume
RADEON_ENC_CS(0); // input color space
RADEON_ENC_CS(RENCODE_COLOR_RANGE_STUDIO); // input color range
RADEON_ENC_CS(0); // input chroma subsampling
RADEON_ENC_CS(0); // input chroma location
RADEON_ENC_CS(color_bit_depth); // input color bit depth
RADEON_ENC_CS(color_packing_format); // input color packing format
RADEON_ENC_END();
}
static void
@@ -1669,7 +1636,6 @@ radv_enc_output_format(struct radv_cmd_buffer *cmd_buffer)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
struct radv_video_session *vid = cmd_buffer->video.vid;
uint32_t color_bit_depth;
@@ -1688,13 +1654,12 @@ radv_enc_output_format(struct radv_cmd_buffer *cmd_buffer)
return;
}
ENC_BEGIN;
radeon_emit(cs, pdev->vcn_enc_cmds.output_format);
radeon_emit(cs, 0); // output color volume
radeon_emit(cs, RENCODE_COLOR_RANGE_STUDIO); // output color range
radeon_emit(cs, 0); // output chroma location
radeon_emit(cs, color_bit_depth); // output color bit depth
ENC_END;
RADEON_ENC_BEGIN(pdev->vcn_enc_cmds.output_format);
RADEON_ENC_CS(0); // output color volume
RADEON_ENC_CS(RENCODE_COLOR_RANGE_STUDIO); // output color range
RADEON_ENC_CS(0); // output chroma location
RADEON_ENC_CS(color_bit_depth); // output color bit depth
RADEON_ENC_END();
}
static void