radeonsi/vcn: Fix crash when failing to allocate internal buffers

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/11725
Reviewed-by: Leo Liu <leo.liu@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32901>
This commit is contained in:
David Rosca 2025-01-06 16:45:06 +01:00 committed by Marge Bot
parent c9e667b7ad
commit 42595eb52e
3 changed files with 22 additions and 6 deletions

View file

@ -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);

View file

@ -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,

View file

@ -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;
}