mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-28 22:57:37 +00:00
96 lines
3.2 KiB
Diff
96 lines
3.2 KiB
Diff
From: Boyuan Zhang <boyuan.zhang at amd.com>
|
|
|
|
Create a list in decoder to store all render picture buffer pointers that
|
|
currently being used in reference picture lists.
|
|
|
|
During get message buffer call, check each pointer in render_pic_list[]
|
|
within given pic->ref[] list, remove pointer that no longer being used by
|
|
pic->ref[]. Then add current render surface pointer to the render_pic_list[]
|
|
and assign the associated index to result.curr_idx.
|
|
|
|
As a result, result.curr_idx will have the correct index to represent the
|
|
current render picture, instead of the previous increamenting values.
|
|
|
|
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104745
|
|
|
|
Signed-off-by: Boyuan Zhang <boyuan.zhang at amd.com>
|
|
Reviewed-by: Christian König <christian.koenig at amd.com>
|
|
Cc: mesa-stable at lists.freedesktop.org
|
|
(cherry picked from commit 2ec48039b8aa1f6a5e16f3f12483b88981d0f5d3)
|
|
---
|
|
src/gallium/drivers/radeon/radeon_uvd.c | 29 +++++++++++++++++++++++++----
|
|
1 file changed, 25 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/src/gallium/drivers/radeon/radeon_uvd.c b/src/gallium/drivers/radeon/radeon_uvd.c
|
|
index 032ed7c..87e7858 100644
|
|
--- a/src/gallium/drivers/radeon/radeon_uvd.c
|
|
+++ b/src/gallium/drivers/radeon/radeon_uvd.c
|
|
@@ -97,6 +97,8 @@ struct ruvd_decoder {
|
|
unsigned cmd;
|
|
unsigned cntl;
|
|
} reg;
|
|
+
|
|
+ void *render_pic_list[16];
|
|
};
|
|
|
|
/* flush IB to the hardware */
|
|
@@ -596,7 +598,7 @@ static struct ruvd_h265 get_h265_msg(struct ruvd_decoder *dec, struct pipe_video
|
|
struct pipe_h265_picture_desc *pic)
|
|
{
|
|
struct ruvd_h265 result;
|
|
- unsigned i;
|
|
+ unsigned i, j;
|
|
|
|
memset(&result, 0, sizeof(result));
|
|
|
|
@@ -676,11 +678,28 @@ static struct ruvd_h265 get_h265_msg(struct ruvd_decoder *dec, struct pipe_video
|
|
result.row_height_minus1[i] = pic->pps->row_height_minus1[i];
|
|
|
|
result.num_delta_pocs_ref_rps_idx = pic->NumDeltaPocsOfRefRpsIdx;
|
|
- result.curr_idx = pic->CurrPicOrderCntVal;
|
|
result.curr_poc = pic->CurrPicOrderCntVal;
|
|
|
|
+ for (i = 0 ; i < 16 ; i++) {
|
|
+ for (j = 0; (pic->ref[j] != NULL) && (j < 16) ; j++) {
|
|
+ if (dec->render_pic_list[i] == pic->ref[j])
|
|
+ break;
|
|
+ if (j == 15)
|
|
+ dec->render_pic_list[i] = NULL;
|
|
+ else if (pic->ref[j+1] == NULL)
|
|
+ dec->render_pic_list[i] = NULL;
|
|
+ }
|
|
+ }
|
|
+ for (i = 0 ; i < 16 ; i++) {
|
|
+ if (dec->render_pic_list[i] == NULL) {
|
|
+ dec->render_pic_list[i] = target;
|
|
+ result.curr_idx = i;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
vl_video_buffer_set_associated_data(target, &dec->base,
|
|
- (void *)(uintptr_t)pic->CurrPicOrderCntVal,
|
|
+ (void *)(uintptr_t)result.curr_idx,
|
|
&ruvd_destroy_associated_data);
|
|
|
|
for (i = 0; i < 16; ++i) {
|
|
@@ -723,7 +742,7 @@ static struct ruvd_h265 get_h265_msg(struct ruvd_decoder *dec, struct pipe_video
|
|
memcpy(dec->it + 864, pic->pps->sps->ScalingList32x32, 2 * 64);
|
|
|
|
for (i = 0 ; i < 2 ; i++) {
|
|
- for (int j = 0 ; j < 15 ; j++)
|
|
+ for (j = 0 ; j < 15 ; j++)
|
|
result.direct_reflist[i][j] = pic->RefPicList[i][j];
|
|
}
|
|
|
|
@@ -1407,6 +1426,8 @@ struct pipe_video_codec *si_common_uvd_create_decoder(struct pipe_context *conte
|
|
goto error;
|
|
}
|
|
|
|
+ for (i = 0; i < 16; i++)
|
|
+ dec->render_pic_list[i] = NULL;
|
|
dec->fb_size = (info.family == CHIP_TONGA) ? FB_BUFFER_SIZE_TONGA :
|
|
FB_BUFFER_SIZE;
|
|
bs_buf_size = width * height * (512 / (16 * 16));
|
|
--
|
|
2.7.4
|