From 62f07b8c63285f4e1410f15f4e12f04f3981ef2e Mon Sep 17 00:00:00 2001 From: David Rosca Date: Tue, 20 Jan 2026 15:26:52 +0100 Subject: [PATCH] radeonsi/vcn: Add low latency decode debug option Similar to the low latency option for encode, this reduces latency of decoding at the cost of increased power usage. Can be enabled with AMD_DEBUG=lowlatencydec Reviewed-by: Boyuan Zhang Part-of: --- docs/envvars.rst | 2 ++ src/amd/common/ac_vcn_dec.h | 1 + src/gallium/drivers/radeonsi/radeon_vcn_dec.c | 5 ++++- src/gallium/drivers/radeonsi/si_pipe.c | 1 + src/gallium/drivers/radeonsi/si_pipe.h | 1 + 5 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/envvars.rst b/docs/envvars.rst index 29471405e5c..39e3c1be2aa 100644 --- a/docs/envvars.rst +++ b/docs/envvars.rst @@ -1743,6 +1743,8 @@ RadeonSI driver environment variables Disable DPBB. Overrules the dpbb enable option. ``noefc`` Disable hardware based encoder color format conversion + ``lowlatencydec`` + Enable low latency decoding ``lowlatencyenc`` Enable low latency encoding ``notiling`` diff --git a/src/amd/common/ac_vcn_dec.h b/src/amd/common/ac_vcn_dec.h index b6f5285517a..f8f92b74843 100644 --- a/src/amd/common/ac_vcn_dec.h +++ b/src/amd/common/ac_vcn_dec.h @@ -163,6 +163,7 @@ /* *** decode flags *** */ #define RDECODE_FLAGS_USE_DYNAMIC_DPB_MASK 0x00000001 #define RDECODE_FLAGS_USE_PAL_MASK 0x00000008 +#define RDECODE_FLAGS_LOW_LATENCY_MASK 0x00000080 #define RDECODE_FLAGS_DPB_RESIZE_MASK 0x00000100 #define RDECODE_FLAGS_UNIFIED_DT_MASK 0x00000200 diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c index 598ff27b8f6..634242f5cfd 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c @@ -1437,7 +1437,7 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec struct si_texture *luma; struct si_texture *chroma; struct pipe_video_buffer *out_surf = target; - ASSERTED struct si_screen *sscreen = (struct si_screen *)dec->screen; + struct si_screen *sscreen = (struct si_screen *)dec->screen; rvcn_dec_message_header_t *header; rvcn_dec_message_index_t *index_codec; rvcn_dec_message_index_t *index_drm = NULL; @@ -1567,6 +1567,9 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec if (dec->dpb_type == DPB_DYNAMIC_TIER_3) decode->decode_flags |= RDECODE_FLAGS_UNIFIED_DT_MASK; + if (sscreen->multimedia_debug_flags & DBG(LOW_LATENCY_DECODE)) + decode->decode_flags |= RDECODE_FLAGS_LOW_LATENCY_MASK; + decode->bsd_size = align(dec->bs_size, 128); if (dec->dpb_type < DPB_DYNAMIC_TIER_2) { diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 65feb68c8a0..5fee1ace078 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -129,6 +129,7 @@ static const struct debug_named_value radeonsi_shader_debug_options[] = { static const struct debug_named_value radeonsi_multimedia_debug_options[] = { /* Multimedia options: */ {"noefc", DBG(NO_EFC), "Disable hardware based encoder colour format conversion."}, + {"lowlatencydec", DBG(LOW_LATENCY_DECODE), "Enable low latency decoding."}, {"lowlatencyenc", DBG(LOW_LATENCY_ENCODE), "Enable low latency encoding."}, {"novideotiling", DBG(NO_VIDEO_TILING), "Disable tiling for video."}, {"nodectier1", DBG(NO_DECODE_TIER1), "Disable tier1 for video decode."}, diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index cbb4a0d275a..901ebcca9b9 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -264,6 +264,7 @@ enum enum { DBG_NO_EFC, + DBG_LOW_LATENCY_DECODE, DBG_LOW_LATENCY_ENCODE, DBG_NO_VIDEO_TILING, DBG_NO_DECODE_TIER1,