radeonsi/vpe: add destroy_fence function

implement destroy_fence() for better fence control

Signed-off-by: Peyton Lee <peytolee@amd.com>
Reviewed-by: David Rosca <david.rosca@amd.com>
Cc: mesa-stable
(cherry picked from commit ad0dbea49d)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32852>
This commit is contained in:
Peyton Lee
2024-12-16 16:16:16 +08:00
committed by Dylan Baker
parent 68143c7b65
commit e4276eca9b
3 changed files with 12 additions and 17 deletions

View File

@@ -2574,7 +2574,7 @@
"description": "radeonsi/vpe: add destroy_fence function", "description": "radeonsi/vpe: add destroy_fence function",
"nominated": true, "nominated": true,
"nomination_type": 1, "nomination_type": 1,
"resolution": 0, "resolution": 3,
"main_sha": null, "main_sha": null,
"because_sha": null, "because_sha": null,
"notes": null "notes": null

View File

@@ -662,11 +662,6 @@ si_vpe_processor_destroy(struct pipe_video_codec *codec)
unsigned int i; unsigned int i;
assert(codec); assert(codec);
if (vpeproc->process_fence) {
SIVPE_INFO(vpeproc->log_level, "Wait fence\n");
vpeproc->ws->fence_wait(vpeproc->ws, vpeproc->process_fence, PIPE_DEFAULT_DECODER_FEEDBACK_TIMEOUT_NS);
}
if (vpeproc->vpe_build_bufs) if (vpeproc->vpe_build_bufs)
si_vpe_free_buffer(vpeproc->vpe_build_bufs); si_vpe_free_buffer(vpeproc->vpe_build_bufs);
@@ -1004,19 +999,11 @@ si_vpe_processor_end_frame(struct pipe_video_codec *codec,
struct pipe_picture_desc *picture) struct pipe_picture_desc *picture)
{ {
struct vpe_video_processor *vpeproc = (struct vpe_video_processor *)codec; struct vpe_video_processor *vpeproc = (struct vpe_video_processor *)codec;
struct pipe_fence_handle *process_fence = NULL;
assert(codec); assert(codec);
vpeproc->ws->cs_flush(&vpeproc->cs, picture->flush_flags, &process_fence); vpeproc->ws->cs_flush(&vpeproc->cs, picture->flush_flags, picture->fence);
next_buffer(vpeproc); next_buffer(vpeproc);
if (picture->fence && process_fence) {
*picture->fence = process_fence;
SIVPE_INFO(vpeproc->log_level, "Assign process fence\n");
} else
SIVPE_WARN(vpeproc->log_level, "Fence may have problem!\n");
SIVPE_INFO(vpeproc->log_level, "Success\n");
return 0; return 0;
} }
@@ -1046,6 +1033,15 @@ static int si_vpe_processor_fence_wait(struct pipe_video_codec *codec,
return 1; return 1;
} }
static void si_vpe_processor_destroy_fence(struct pipe_video_codec *codec,
struct pipe_fence_handle *fence)
{
struct vpe_video_processor *vpeproc = (struct vpe_video_processor *)codec;
assert(codec);
vpeproc->ws->fence_reference(vpeproc->ws, &fence, NULL);
}
struct pipe_video_codec* struct pipe_video_codec*
si_vpe_create_processor(struct pipe_context *context, const struct pipe_video_codec *templ) si_vpe_create_processor(struct pipe_context *context, const struct pipe_video_codec *templ)
{ {
@@ -1079,13 +1075,13 @@ si_vpe_create_processor(struct pipe_context *context, const struct pipe_video_co
vpeproc->base.end_frame = si_vpe_processor_end_frame; vpeproc->base.end_frame = si_vpe_processor_end_frame;
vpeproc->base.flush = si_vpe_processor_flush; vpeproc->base.flush = si_vpe_processor_flush;
vpeproc->base.fence_wait = si_vpe_processor_fence_wait; vpeproc->base.fence_wait = si_vpe_processor_fence_wait;
vpeproc->base.destroy_fence = si_vpe_processor_destroy_fence;
vpeproc->ver_major = sctx->screen->info.ip[AMD_IP_VPE].ver_major; vpeproc->ver_major = sctx->screen->info.ip[AMD_IP_VPE].ver_major;
vpeproc->ver_minor = sctx->screen->info.ip[AMD_IP_VPE].ver_minor; vpeproc->ver_minor = sctx->screen->info.ip[AMD_IP_VPE].ver_minor;
vpeproc->screen = context->screen; vpeproc->screen = context->screen;
vpeproc->ws = ws; vpeproc->ws = ws;
vpeproc->process_fence = NULL;
init_data = &vpeproc->vpe_data; init_data = &vpeproc->vpe_data;
if (VPE_STATUS_OK != si_vpe_populate_init_data(sctx, init_data, vpeproc->log_level)){ if (VPE_STATUS_OK != si_vpe_populate_init_data(sctx, init_data, vpeproc->log_level)){

View File

@@ -56,7 +56,6 @@ struct vpe_video_processor {
uint8_t bufs_num; uint8_t bufs_num;
uint8_t cur_buf; uint8_t cur_buf;
struct rvid_buffer *emb_buffers; struct rvid_buffer *emb_buffers;
struct pipe_fence_handle *process_fence;
/* VPE HW version */ /* VPE HW version */
uint8_t ver_major; uint8_t ver_major;