diff --git a/.pick_status.json b/.pick_status.json index e4048b430ab..62978218054 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1237,7 +1237,7 @@ "description": "radeonsi/vcn: apply update_decoder_target logic", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c index ca75b58c9b8..4002b5bb969 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c @@ -92,7 +92,6 @@ static rvcn_dec_message_avc_t get_h264_msg(struct radeon_decoder *dec, struct pipe_h264_picture_desc *pic) { rvcn_dec_message_avc_t result; - struct h264_private *private; unsigned i, j, k; memset(&result, 0, sizeof(result)); @@ -189,25 +188,6 @@ static rvcn_dec_message_avc_t get_h264_msg(struct radeon_decoder *dec, goto end; } - private = pic->priv; - for (i = 0; i < ARRAY_SIZE(private->past_ref); i++) { - for (k = 0; private->past_ref[i] && (k < ARRAY_SIZE(pic->ref)); k++) - if (pic->ref[k] && (private->past_ref[i] == pic->ref[k])) - break; - - for (j = 0; private->past_ref[i] - && (k == ARRAY_SIZE(pic->ref)) - && (j < ARRAY_SIZE(dec->render_pic_list)); j++) { - if (dec->render_pic_list[j] - && (dec->render_pic_list[j] == private->past_ref[i])) { - dec->render_pic_list[j] = pic->ref[i]; - vl_video_buffer_set_associated_data(pic->ref[i], &dec->base, - (void *)(uintptr_t)j, &radeon_dec_destroy_associated_data); - break; - } - } - } - for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++) { for (j = 0; (pic->ref[j] != NULL) && (j < ARRAY_SIZE(dec->render_pic_list)); j++) { if (dec->render_pic_list[i] == pic->ref[j]) @@ -3000,6 +2980,26 @@ static int radeon_dec_get_decoder_fence(struct pipe_video_codec *decoder, return dec->ws->fence_wait(dec->ws, fence, timeout); } +/** + * update render list when target buffer got updated, use the existing + * index and update the new buffer to associate with it. + */ +static void radeon_dec_update_render_list(struct pipe_video_codec *decoder, + struct pipe_video_buffer *old, + struct pipe_video_buffer *updated) +{ + struct radeon_decoder *dec = (struct radeon_decoder *)decoder; + void *index = vl_video_buffer_get_associated_data(old, decoder); + + vl_video_buffer_set_associated_data(updated, decoder, index, + old->destroy_associated_data); + for (int i = 0; i < ARRAY_SIZE(dec->render_pic_list); ++i) { + if (dec->render_pic_list[i] == old) { + dec->render_pic_list[i] = updated; + break; + } + } +} /** * create and HW decoder */ @@ -3068,6 +3068,7 @@ struct pipe_video_codec *radeon_create_decoder(struct pipe_context *context, dec->base.end_frame = radeon_dec_end_frame; dec->base.flush = radeon_dec_flush; dec->base.get_decoder_fence = radeon_dec_get_decoder_fence; + dec->base.update_decoder_target = radeon_dec_update_render_list; dec->stream_type = stream_type; dec->stream_handle = si_vid_alloc_stream_handle();