From f4b61e90617f19ca1b8a3cfe046bac5801081057 Mon Sep 17 00:00:00 2001 From: Leo Liu Date: Sun, 29 Aug 2021 13:28:51 -0400 Subject: radeon/vcn: add a handling of error for incorrect reference lists Use the first dpb buffer instead of the NULL pointer sent to hardware. Signed-off-by: Leo Liu Reviewed-by: James Zhu Reviewed-by: Boyuan Zhang Part-of: --- src/gallium/drivers/radeon/radeon_vcn_dec.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src/gallium/drivers/radeon') diff --git a/src/gallium/drivers/radeon/radeon_vcn_dec.c b/src/gallium/drivers/radeon/radeon_vcn_dec.c index 66169faadf2..dbe600ee0d4 100644 --- a/src/gallium/drivers/radeon/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeon/radeon_vcn_dec.c @@ -1336,7 +1336,7 @@ static void rvcn_dec_message_create(struct radeon_decoder *dec) static unsigned rvcn_dec_dynamic_dpb_t2_message(struct radeon_decoder *dec, rvcn_dec_message_decode_t *decode, rvcn_dec_message_dynamic_dpb_t2_t *dynamic_dpb_t2) { - struct rvcn_dec_dynamic_dpb_t2 *dpb = NULL; + struct rvcn_dec_dynamic_dpb_t2 *dpb = NULL, *dummy = NULL; unsigned width, height, size; uint64_t addr; int i; @@ -1350,7 +1350,14 @@ static unsigned rvcn_dec_dynamic_dpb_t2_message(struct radeon_decoder *dec, rvcn list_for_each_entry_safe(struct rvcn_dec_dynamic_dpb_t2, d, &dec->dpb_ref_list, list) { for (i = 0; i < dec->ref_codec.ref_size; ++i) { if ((dec->ref_codec.ref_list[i] != 0x7f) && (d->index == (dec->ref_codec.ref_list[i] & 0x7f))) { + if (!dummy) + dummy = d; + addr = dec->ws->buffer_get_virtual_address(d->dpb.res->buf); + if (!addr && dummy) { + RVID_ERR("Ref list from application is incorrect, using dummy buffer instead.\n"); + addr = dec->ws->buffer_get_virtual_address(dummy->dpb.res->buf); + } dynamic_dpb_t2->dpbAddrLo[i] = addr; dynamic_dpb_t2->dpbAddrHi[i] = addr >> 32; ++dynamic_dpb_t2->dpbArraySize; -- cgit v1.2.3