From 365bf2a3b0215c19e805fddb1d90cb801387e069 Mon Sep 17 00:00:00 2001 From: Ruijing Dong Date: Fri, 10 Jun 2022 20:21:58 -0400 Subject: [PATCH] radeonsi/vcn: support unified queue in vcn4 - use unified queue only in vcn4 - implement signature and engine-info ib headers in vcn4 - implemented unified queue functions Reviewed-by: Boyuan Zhang Reviewed-by: Mihai Preda Signed-off-by: Ruijing Dong Part-of: --- src/gallium/drivers/radeonsi/radeon_vcn_dec.c | 20 +++++++++++-- src/gallium/drivers/radeonsi/radeon_vcn_enc.h | 4 +++ .../drivers/radeonsi/radeon_vcn_enc_4_0.c | 28 ++++++++++++++++++- 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c index 3f132325a76..1645247dfe5 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c @@ -28,7 +28,6 @@ #include "radeon_vcn_dec.h" #include "pipe/p_video_codec.h" -#include "radeon_video.h" #include "radeonsi/si_pipe.h" #include "util/u_memory.h" #include "util/u_video.h" @@ -385,7 +384,7 @@ static rvcn_dec_message_hevc_t get_h265_msg(struct radeon_decoder *dec, result.curr_poc = pic->CurrPicOrderCntVal; for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++) { - for (j = 0; + for (j = 0; (pic->ref[j] != NULL) && (j < ARRAY_SIZE(dec->render_pic_list)); j++) { if (dec->render_pic_list[i] == pic->ref[j]) @@ -2124,9 +2123,18 @@ static void rvcn_dec_message_feedback(struct radeon_decoder *dec) header->num_buffers = 0; } +static void rvcn_dec_sq_tail(struct radeon_decoder *dec) +{ + if (dec->vcn_dec_sw_ring == false) + return; + + rvcn_sq_tail(&dec->cs, &dec->sq); +} /* flush IB to the hardware */ static int flush(struct radeon_decoder *dec, unsigned flags) { + rvcn_dec_sq_tail(dec); + return dec->ws->cs_flush(&dec->cs, flags, NULL); } @@ -2155,6 +2163,7 @@ static void send_cmd(struct radeon_decoder *dec, unsigned cmd, struct pb_buffer } if (!dec->cs.current.cdw) { + rvcn_sq_header(&dec->cs, &dec->sq, false); rvcn_decode_ib_package_t *ib_header = (rvcn_decode_ib_package_t *)&(dec->cs.current.buf[dec->cs.current.cdw]); @@ -2770,8 +2779,13 @@ struct pipe_video_codec *radeon_create_decoder(struct pipe_context *context, dec->ws = ws; if (u_reduce_video_profile(templ->profile) != PIPE_VIDEO_FORMAT_JPEG && - sctx->gfx_level >= GFX11) + sctx->gfx_level >= GFX11) { dec->vcn_dec_sw_ring = true; + ring = AMD_IP_VCN_UNIFIED; + } + + dec->sq.ib_total_size_in_dw = NULL; + dec->sq.ib_checksum = NULL; if (!ws->cs_create(&dec->cs, sctx->ctx, ring, NULL, NULL, false)) { RVID_ERR("Can't get command submission context.\n"); diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc.h b/src/gallium/drivers/radeonsi/radeon_vcn_enc.h index 7944dd92c89..9efccad1c80 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc.h +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc.h @@ -595,6 +595,10 @@ struct radeon_encoder { void (*input_format)(struct radeon_encoder *enc); void (*output_format)(struct radeon_encoder *enc); void (*efc_params)(struct radeon_encoder *enc); + /* mq is used for preversing multiple queue ibs */ + void (*mq_begin)(struct radeon_encoder *enc); + void (*mq_encode)(struct radeon_encoder *enc); + void (*mq_destroy)(struct radeon_encoder *enc); unsigned stream_handle; diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c index 0c349863483..a8e1abc43d1 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c @@ -32,12 +32,32 @@ #include "util/u_video.h" #include "si_pipe.h" -#include "radeon_video.h" #include "radeon_vcn_enc.h" #define RENCODE_FW_INTERFACE_MAJOR_VERSION 1 #define RENCODE_FW_INTERFACE_MINOR_VERSION 0 +static void radeon_enc_sq_begin(struct radeon_encoder *enc) +{ + rvcn_sq_header(&enc->cs, &enc->sq, true); + enc->mq_begin(enc); + rvcn_sq_tail(&enc->cs, &enc->sq); +} + +static void radeon_enc_sq_encode(struct radeon_encoder *enc) +{ + rvcn_sq_header(&enc->cs, &enc->sq, true); + enc->mq_encode(enc); + rvcn_sq_tail(&enc->cs, &enc->sq); +} + +static void radeon_enc_sq_destroy(struct radeon_encoder *enc) +{ + rvcn_sq_header(&enc->cs, &enc->sq, true); + enc->mq_destroy(enc); + rvcn_sq_tail(&enc->cs, &enc->sq); +} + static void radeon_enc_session_init(struct radeon_encoder *enc) { if (u_reduce_video_profile(enc->base.profile) == PIPE_VIDEO_FORMAT_MPEG4_AVC) { @@ -129,6 +149,12 @@ void radeon_enc_4_0_init(struct radeon_encoder *enc) enc->session_init = radeon_enc_session_init; enc->ctx = radeon_enc_ctx; + enc->mq_begin = enc->begin; + enc->mq_encode = enc->encode; + enc->mq_destroy = enc->destroy; + enc->begin = radeon_enc_sq_begin; + enc->encode = radeon_enc_sq_encode; + enc->destroy = radeon_enc_sq_destroy; enc->enc_pic.session_info.interface_version = ((RENCODE_FW_INTERFACE_MAJOR_VERSION << RENCODE_IF_MAJOR_VERSION_SHIFT) |