Mesa (main): radeonsi/vcn: support unified queue in vcn4
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jun 16 04:03:04 UTC 2022
Module: Mesa
Branch: main
Commit: 365bf2a3b0215c19e805fddb1d90cb801387e069
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=365bf2a3b0215c19e805fddb1d90cb801387e069
Author: Ruijing Dong <ruijing.dong at amd.com>
Date: Fri Jun 10 20:21:58 2022 -0400
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 <Boyuan.Zhang at amd.com>
Reviewed-by: Mihai Preda <mhpreda at gmail.com>
Signed-off-by: Ruijing Dong <ruijing.dong at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16911>
---
src/gallium/drivers/radeonsi/radeon_vcn_dec.c | 20 +++++++++++++---
src/gallium/drivers/radeonsi/radeon_vcn_enc.h | 4 ++++
src/gallium/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) |
More information about the mesa-commit
mailing list