From 95d15406c4aa4ec46a132b53639ad340a7b57c5a Mon Sep 17 00:00:00 2001 From: David Rosca Date: Sun, 8 Sep 2024 07:06:56 +0200 Subject: [PATCH] radv/video: Don't use multiple tasks for one encode operation The begin op was sent as one task and encode op as another one. This doesn't work on VCN2 and older, so just send both ops in same task. Reviewed-by: Dave Airlie Part-of: --- src/amd/vulkan/radv_video_enc.c | 35 +++++++++++++++------------------ 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/amd/vulkan/radv_video_enc.c b/src/amd/vulkan/radv_video_enc.c index e18c67bd184..d2c35ba1e47 100644 --- a/src/amd/vulkan/radv_video_enc.c +++ b/src/amd/vulkan/radv_video_enc.c @@ -1610,12 +1610,8 @@ radv_enc_headers_hevc(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInf static void begin(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInfoKHR *enc_info) { - struct radv_enc_state *enc = &cmd_buffer->video.enc; struct radv_video_session *vid = cmd_buffer->video.vid; - radv_enc_session_info(cmd_buffer); - cmd_buffer->video.enc.total_task_size = 0; - radv_enc_task_info(cmd_buffer, false); radv_enc_op_init(cmd_buffer); radv_enc_session_init(cmd_buffer, enc_info); if (vid->vk.op == VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR) { @@ -1640,7 +1636,6 @@ begin(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInfoKHR *enc_info) } while (++i < vid->rc_layer_control.num_temporal_layers); radv_enc_op_init_rc(cmd_buffer); radv_enc_op_init_rc_vbv(cmd_buffer); - radeon_emit_direct(cmd_buffer->cs, enc->task_size_offset, enc->total_task_size); } static void @@ -1675,29 +1670,31 @@ radv_vcn_encode_video(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInf if (!inline_queries) feedback_query_va = cmd_buffer->video.feedback_query_va; - if (vid->enc_need_begin) { - begin(cmd_buffer, enc_info); - vid->enc_need_begin = false; - } // before encode // session info radv_enc_session_info(cmd_buffer); cmd_buffer->video.enc.total_task_size = 0; + // task info radv_enc_task_info(cmd_buffer, true); - // temporal layers init - unsigned i = 0; - do { - if (vid->enc_need_rate_control) { + if (vid->enc_need_begin) { + begin(cmd_buffer, enc_info); + vid->enc_need_begin = false; + } else { + // temporal layers init + unsigned i = 0; + do { + if (vid->enc_need_rate_control) { + radv_enc_layer_select(cmd_buffer, i); + radv_enc_rc_layer_init(cmd_buffer, &vid->rc_layer_init[i]); + vid->enc_need_rate_control = false; + } radv_enc_layer_select(cmd_buffer, i); - radv_enc_rc_layer_init(cmd_buffer, &vid->rc_layer_init[i]); - vid->enc_need_rate_control = false; - } - radv_enc_layer_select(cmd_buffer, i); - radv_enc_rc_per_pic(cmd_buffer, enc_info, &vid->rc_per_pic[i]); - } while (++i < vid->rc_layer_control.num_temporal_layers); + radv_enc_rc_per_pic(cmd_buffer, enc_info, &vid->rc_per_pic[i]); + } while (++i < vid->rc_layer_control.num_temporal_layers); + } // encode headers // ctx