diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c index 72168d2ed1c..b3dc3a6a308 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c @@ -2340,6 +2340,11 @@ static void radeon_dec_destroy(struct pipe_video_codec *decoder) dec->bs_ptr = NULL; } + if (dec->msg) { + dec->ws->buffer_unmap(dec->ws, dec->msg_fb_it_probs_buffers[dec->cur_buffer].res->buf); + dec->msg = NULL; + } + if (dec->stream_type != RDECODE_CODEC_JPEG) { struct pipe_fence_handle *fence = NULL; map_msg_fb_it_probs_buf(dec); @@ -2400,6 +2405,9 @@ static void radeon_dec_begin_frame(struct pipe_video_codec *decoder, assert(decoder); + if (dec->error) + return; + switch (dec->stream_type) { case RDECODE_CODEC_VP9: { struct pipe_vp9_picture_desc *pic = (struct pipe_vp9_picture_desc *)picture; @@ -2511,7 +2519,7 @@ static void radeon_dec_decode_bitstream(struct pipe_video_codec *decoder, /** * send cmd for vcn dec */ -void send_cmd_dec(struct radeon_decoder *dec, struct pipe_video_buffer *target, +bool send_cmd_dec(struct radeon_decoder *dec, struct pipe_video_buffer *target, struct pipe_picture_desc *picture) { struct pb_buffer_lean *dt; @@ -2526,6 +2534,8 @@ void send_cmd_dec(struct radeon_decoder *dec, struct pipe_video_buffer *target, map_msg_fb_it_probs_buf(dec); dt = rvcn_dec_message_decode(dec, target, picture); + if (!dt) + return false; rvcn_dec_message_feedback(dec); send_msg_buf(dec); @@ -2549,6 +2559,8 @@ void send_cmd_dec(struct radeon_decoder *dec, struct pipe_video_buffer *target, if (dec->vcn_dec_sw_ring == false) set_reg(dec, dec->reg.cntl, 1); + + return true; } /** @@ -2564,7 +2576,9 @@ static int radeon_dec_end_frame(struct pipe_video_codec *decoder, struct pipe_vi if (dec->error) return 1; - dec->send_cmd(dec, target, picture); + if (!dec->send_cmd(dec, target, picture)) + return 1; + flush(dec, picture->flush_flags, picture->fence); next_buffer(dec); diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.h b/src/gallium/drivers/radeonsi/radeon_vcn_dec.h index 23b186c3a5e..4e0a2cc7bcc 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.h +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.h @@ -135,7 +135,7 @@ struct radeon_decoder { struct list_head dpb_ref_list; struct list_head dpb_unref_list; - void (*send_cmd)(struct radeon_decoder *dec, struct pipe_video_buffer *target, + bool (*send_cmd)(struct radeon_decoder *dec, struct pipe_video_buffer *target, struct pipe_picture_desc *picture); /* Additional contexts for mJPEG */ struct radeon_cmdbuf *jcs; @@ -148,10 +148,10 @@ struct radeon_decoder { struct pipe_context *ectx; }; -void send_cmd_dec(struct radeon_decoder *dec, struct pipe_video_buffer *target, +bool send_cmd_dec(struct radeon_decoder *dec, struct pipe_video_buffer *target, struct pipe_picture_desc *picture); -void send_cmd_jpeg(struct radeon_decoder *dec, struct pipe_video_buffer *target, +bool send_cmd_jpeg(struct radeon_decoder *dec, struct pipe_video_buffer *target, struct pipe_picture_desc *picture); struct pipe_video_codec *radeon_create_decoder(struct pipe_context *context, diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec_jpeg.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec_jpeg.c index 5ea11c14305..5136c1b867a 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec_jpeg.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec_jpeg.c @@ -408,7 +408,7 @@ static void send_cmd_target_direct(struct radeon_decoder *dec, struct pb_buffer_ /** * send cmd for vcn jpeg */ -void send_cmd_jpeg(struct radeon_decoder *dec, struct pipe_video_buffer *target, +bool send_cmd_jpeg(struct radeon_decoder *dec, struct pipe_video_buffer *target, struct pipe_picture_desc *picture) { struct pb_buffer_lean *dt; @@ -429,4 +429,6 @@ void send_cmd_jpeg(struct radeon_decoder *dec, struct pipe_video_buffer *target, send_cmd_bitstream_direct(dec, bs_buf->res->buf, 0, RADEON_USAGE_READ, RADEON_DOMAIN_GTT); send_cmd_target_direct(dec, dt, 0, RADEON_USAGE_WRITE, RADEON_DOMAIN_VRAM, target->buffer_format); } + + return true; }