virgl: push uint64_t fence_id down into each context's fence_retire
uint64_t fence_id is now the standard for the virglrenderer abstraction,
forcing each context to decide what to do with it on their own. For now
each context casts their void* back to uintptr_t. There shouldn't be any
functional change from this, since contexts previously got a void*
directly from the VMM.
Signed-off-by: Ryan Neph <ryanneph@google.com>
Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/806>
diff --git a/src/drm/drm_fence.c b/src/drm/drm_fence.c
index edde328..d6be03b 100644
--- a/src/drm/drm_fence.c
+++ b/src/drm/drm_fence.c
@@ -81,7 +81,7 @@
if (ret == 1) {
drm_dbg("fence signaled: %p (%p)", fence, fence->fence_cookie);
timeline->vctx->fence_retire(timeline->vctx, timeline->ring_idx,
- fence->fence_cookie);
+ (uintptr_t)fence->fence_cookie);
write_eventfd(timeline->eventfd, 1);
drm_fence_destroy(fence);
} else if (ret != 0) {
diff --git a/src/drm/msm/msm_renderer.c b/src/drm/msm/msm_renderer.c
index 8de7d50..2bc3466 100644
--- a/src/drm/msm/msm_renderer.c
+++ b/src/drm/msm/msm_renderer.c
@@ -1201,7 +1201,7 @@
* already passed.. so just immediate signal:
*/
if (queue_id == 0) {
- vctx->fence_retire(vctx, queue_id, fence_cookie);
+ vctx->fence_retire(vctx, queue_id, fence_id);
return 0;
}
diff --git a/src/proxy/proxy_context.c b/src/proxy/proxy_context.c
index cce5a1d..95ca798 100644
--- a/src/proxy/proxy_context.c
+++ b/src/proxy/proxy_context.c
@@ -128,7 +128,7 @@
if (!proxy_fence_is_signaled(fence, timeline->cur_seqno) && !force_retire_all)
return false;
- ctx->base.fence_retire(&ctx->base, ring_idx, fence->cookie);
+ ctx->base.fence_retire(&ctx->base, ring_idx, (uintptr_t)fence->cookie);
list_del(&fence->head);
proxy_context_free_fence(ctx, fence);
diff --git a/src/venus/vkr_context.c b/src/venus/vkr_context.c
index 7d6b27b..28cef51 100644
--- a/src/venus/vkr_context.c
+++ b/src/venus/vkr_context.c
@@ -193,7 +193,8 @@
/* retire syncs from destroyed devices */
LIST_FOR_EACH_ENTRY_SAFE (sync, sync_tmp, &ctx->signaled_syncs, head) {
/* queue_id might have already get reused but is opaque to the clients */
- ctx->base.fence_retire(&ctx->base, sync->queue_id, sync->fence_cookie);
+ ctx->base.fence_retire(&ctx->base, sync->queue_id,
+ (uintptr_t)sync->fence_cookie);
free(sync);
}
list_inithead(&ctx->signaled_syncs);
@@ -212,7 +213,8 @@
vkr_queue_get_signaled_syncs(queue, &retired_syncs, &queue_empty);
LIST_FOR_EACH_ENTRY_SAFE (sync, sync_tmp, &retired_syncs, head) {
- ctx->base.fence_retire(&ctx->base, sync->queue_id, sync->fence_cookie);
+ ctx->base.fence_retire(&ctx->base, sync->queue_id,
+ (uintptr_t)sync->fence_cookie);
vkr_device_free_queue_sync(dev, sync);
}
diff --git a/src/venus/vkr_queue.c b/src/venus/vkr_queue.c
index 9309d7b..fb83a44 100644
--- a/src/venus/vkr_queue.c
+++ b/src/venus/vkr_queue.c
@@ -131,7 +131,8 @@
struct vn_device_proc_table *vk = &dev->proc_table;
if (vkr_renderer_flags & VKR_RENDERER_ASYNC_FENCE_CB) {
- ctx->base.fence_retire(&ctx->base, sync->queue_id, sync->fence_cookie);
+ ctx->base.fence_retire(&ctx->base, sync->queue_id,
+ (uintptr_t)sync->fence_cookie);
vkr_device_free_queue_sync(dev, sync);
} else {
vk->DestroyFence(dev->base.handle.device, sync->fence, NULL);
@@ -225,7 +226,8 @@
list_del(&sync->head);
if (vkr_renderer_flags & VKR_RENDERER_ASYNC_FENCE_CB) {
- ctx->base.fence_retire(&ctx->base, sync->queue_id, sync->fence_cookie);
+ ctx->base.fence_retire(&ctx->base, sync->queue_id,
+ (uintptr_t)sync->fence_cookie);
vkr_device_free_queue_sync(queue->device, sync);
} else {
list_addtail(&sync->head, &queue->signaled_syncs);
diff --git a/src/virgl_context.h b/src/virgl_context.h
index e347b52..4bf1370 100644
--- a/src/virgl_context.h
+++ b/src/virgl_context.h
@@ -53,7 +53,7 @@
typedef void (*virgl_context_fence_retire)(struct virgl_context *ctx,
uint64_t queue_id,
- void *fence_cookie);
+ uint64_t fence_id);
/**
* Base class for renderer contexts. For example, vrend_decode_ctx is a
diff --git a/src/virglrenderer.c b/src/virglrenderer.c
index ca89e4e..d2bd8f4 100644
--- a/src/virglrenderer.c
+++ b/src/virglrenderer.c
@@ -186,12 +186,12 @@
static void per_context_fence_retire(struct virgl_context *ctx,
uint64_t queue_id,
- void *fence_cookie)
+ uint64_t fence_id)
{
state.cbs->write_context_fence(state.cookie,
ctx->ctx_id,
queue_id,
- (uint64_t)(uintptr_t)fence_cookie);
+ fence_id);
}
int virgl_renderer_context_create_with_flags(uint32_t ctx_id,
diff --git a/src/vrend_decode.c b/src/vrend_decode.c
index 6c447d7..9b4d5ce 100644
--- a/src/vrend_decode.c
+++ b/src/vrend_decode.c
@@ -1510,7 +1510,7 @@
void *retire_data)
{
struct vrend_decode_ctx *dctx = retire_data;
- dctx->base.fence_retire(&dctx->base, 0, fence_cookie);
+ dctx->base.fence_retire(&dctx->base, 0, (uintptr_t)fence_cookie);
}
struct virgl_context *vrend_renderer_context_create(uint32_t handle,