[Mesa-dev] [PATCH 2/2] radeon/uvd: add and manage render picture list
boyuan.zhang at amd.com
boyuan.zhang at amd.com
Mon Dec 11 16:47:33 UTC 2017
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.
Signed-off-by: Boyuan Zhang <boyuan.zhang at amd.com>
Reviewed-by: Christian König <christian.koenig at amd.com>
---
src/gallium/drivers/radeon/radeon_uvd.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/src/gallium/drivers/radeon/radeon_uvd.c b/src/gallium/drivers/radeon/radeon_uvd.c
index bf7a2ae..a5392df 100644
--- a/src/gallium/drivers/radeon/radeon_uvd.c
+++ b/src/gallium/drivers/radeon/radeon_uvd.c
@@ -91,6 +91,8 @@ struct ruvd_decoder {
unsigned cmd;
unsigned cntl;
} reg;
+
+ void *render_pic_list[16];
};
/* flush IB to the hardware */
@@ -670,11 +672,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 < 15 ; i++) {
+ for (j = 0; (pic->ref[j] != NULL) && (j < 15) ; 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 < 15 ; 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) {
@@ -1401,6 +1420,8 @@ struct pipe_video_codec *si_common_uvd_create_decoder(struct pipe_context *conte
goto error;
}
+ for (i = 0; i < 15; 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
More information about the mesa-dev
mailing list