mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-20 02:38:07 +02:00
st/dri: implement the fence interface
This commit is contained in:
parent
a2557b30d8
commit
7070b0dd66
1 changed files with 80 additions and 0 deletions
|
|
@ -1251,6 +1251,85 @@ static __DRIimageExtension dri2ImageExtension = {
|
|||
.getCapabilities = dri2_get_capabilities,
|
||||
};
|
||||
|
||||
|
||||
struct dri2_fence {
|
||||
struct pipe_fence_handle *pipe_fence;
|
||||
};
|
||||
|
||||
static void *
|
||||
dri2_create_fence(__DRIcontext *_ctx)
|
||||
{
|
||||
struct pipe_context *ctx = dri_context(_ctx)->st->pipe;
|
||||
struct dri2_fence *fence = CALLOC_STRUCT(dri2_fence);
|
||||
|
||||
if (!fence)
|
||||
return NULL;
|
||||
|
||||
ctx->flush(ctx, &fence->pipe_fence, 0);
|
||||
|
||||
if (!fence->pipe_fence) {
|
||||
FREE(fence);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return fence;
|
||||
}
|
||||
|
||||
static void *
|
||||
dri2_get_fence_from_cl_event(__DRIscreen *_screen, intptr_t cl_event)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
dri2_destroy_fence(__DRIscreen *_screen, void *_fence)
|
||||
{
|
||||
struct dri_screen *driscreen = dri_screen(_screen);
|
||||
struct pipe_screen *screen = driscreen->base.screen;
|
||||
struct dri2_fence *fence = (struct dri2_fence*)_fence;
|
||||
|
||||
if (fence->pipe_fence)
|
||||
screen->fence_reference(screen, &fence->pipe_fence, NULL);
|
||||
else
|
||||
assert(0);
|
||||
|
||||
FREE(fence);
|
||||
}
|
||||
|
||||
static GLboolean
|
||||
dri2_client_wait_sync(__DRIcontext *_ctx, void *_fence, unsigned flags,
|
||||
uint64_t timeout)
|
||||
{
|
||||
struct dri_screen *driscreen = dri_screen(_ctx->driScreenPriv);
|
||||
struct pipe_screen *screen = driscreen->base.screen;
|
||||
struct dri2_fence *fence = (struct dri2_fence*)_fence;
|
||||
|
||||
/* No need to flush. The context was flushed when the fence was created. */
|
||||
|
||||
if (fence->pipe_fence)
|
||||
return screen->fence_finish(screen, fence->pipe_fence, timeout);
|
||||
else {
|
||||
assert(0);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
dri2_server_wait_sync(__DRIcontext *_ctx, void *_fence, unsigned flags)
|
||||
{
|
||||
/* AFAIK, no driver currently supports parallel context execution. */
|
||||
}
|
||||
|
||||
static __DRI2fenceExtension dri2FenceExtension = {
|
||||
.base = { __DRI2_FENCE, 1 },
|
||||
|
||||
.create_fence = dri2_create_fence,
|
||||
.get_fence_from_cl_event = dri2_get_fence_from_cl_event,
|
||||
.destroy_fence = dri2_destroy_fence,
|
||||
.client_wait_sync = dri2_client_wait_sync,
|
||||
.server_wait_sync = dri2_server_wait_sync
|
||||
};
|
||||
|
||||
/*
|
||||
* Backend function init_screen.
|
||||
*/
|
||||
|
|
@ -1262,6 +1341,7 @@ static const __DRIextension *dri_screen_extensions[] = {
|
|||
&dri2RendererQueryExtension.base,
|
||||
&dri2ConfigQueryExtension.base,
|
||||
&dri2ThrottleExtension.base,
|
||||
&dri2FenceExtension.base,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue