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:
@@ -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
|
||||||
|
@@ -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)){
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user