mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 17:30:12 +01:00
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:
parent
c9e667b7ad
commit
42595eb52e
3 changed files with 22 additions and 6 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue