gallium: support for native fence fd's
This enables gallium support for EGL_ANDROID_native_fence_sync, for drivers which support PIPE_CAP_NATIVE_FENCE_FD. Signed-off-by: Rob Clark <robclark@freedesktop.org>
This commit is contained in:
parent
72cc1ca58d
commit
026a7223a6
|
@ -379,6 +379,8 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||
return 10;
|
||||
case PIPE_CAP_UMA:
|
||||
return 1;
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
}
|
||||
debug_printf("unknown param %d\n", param);
|
||||
return 0;
|
||||
|
|
|
@ -295,6 +295,7 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
|
|||
case PIPE_CAP_SAMPLER_VIEW_TARGET:
|
||||
case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
|
||||
case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
|
||||
case PIPE_CAP_MAX_VIEWPORTS:
|
||||
|
|
|
@ -518,6 +518,7 @@ ilo_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||
case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
|
||||
case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
|
||||
case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
|
||||
case PIPE_CAP_VENDOR_ID:
|
||||
|
|
|
@ -339,6 +339,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||
case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED:
|
||||
case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
|
||||
case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
}
|
||||
/* should only get here on unhandled cases */
|
||||
|
|
|
@ -204,6 +204,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||
case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
|
||||
case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
|
||||
case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
|
||||
case PIPE_CAP_VENDOR_ID:
|
||||
|
|
|
@ -256,6 +256,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||
case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
|
||||
case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
|
||||
case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
|
||||
case PIPE_CAP_VENDOR_ID:
|
||||
|
|
|
@ -275,6 +275,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||
case PIPE_CAP_PCI_FUNCTION:
|
||||
case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
|
||||
case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
|
||||
case PIPE_CAP_VENDOR_ID:
|
||||
|
|
|
@ -226,6 +226,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
|
|||
case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
|
||||
case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
|
||||
case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
|
||||
/* SWTCL-only features. */
|
||||
|
|
|
@ -375,6 +375,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
|
|||
case PIPE_CAP_MAX_WINDOW_RECTANGLES:
|
||||
case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
|
||||
case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
|
||||
case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
|
||||
|
|
|
@ -459,6 +459,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
|
|||
case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
|
||||
case PIPE_CAP_TGSI_VOTE:
|
||||
case PIPE_CAP_MAX_WINDOW_RECTANGLES:
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
|
||||
case PIPE_CAP_QUERY_BUFFER_OBJECT:
|
||||
|
|
|
@ -289,6 +289,7 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||
case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED:
|
||||
case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
|
||||
case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
|
||||
return 4;
|
||||
|
|
|
@ -369,6 +369,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||
case PIPE_CAP_PCI_DEVICE:
|
||||
case PIPE_CAP_PCI_FUNCTION:
|
||||
case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
|
||||
return 64;
|
||||
|
|
|
@ -240,6 +240,7 @@ vc4_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||
case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
|
||||
case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
|
||||
case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
|
||||
/* Stream output. */
|
||||
|
|
|
@ -261,6 +261,8 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||
case PIPE_CAP_UMA:
|
||||
case PIPE_CAP_VIDEO_MEMORY:
|
||||
return 0;
|
||||
case PIPE_CAP_NATIVE_FENCE_FD:
|
||||
return 0;
|
||||
}
|
||||
/* should only get here on unhandled cases */
|
||||
debug_printf("Unexpected PIPE_CAP %d query\n", param);
|
||||
|
|
|
@ -474,6 +474,19 @@ struct pipe_context {
|
|||
struct pipe_fence_handle **fence,
|
||||
unsigned flags);
|
||||
|
||||
/**
|
||||
* Create a fence from a native sync fd.
|
||||
*
|
||||
* This is used for importing a foreign/external fence fd.
|
||||
*
|
||||
* \param fence if not NULL, an old fence to unref and transfer a
|
||||
* new fence reference to
|
||||
* \param fd native fence fd
|
||||
*/
|
||||
void (*create_fence_fd)(struct pipe_context *pipe,
|
||||
struct pipe_fence_handle **fence,
|
||||
int fd);
|
||||
|
||||
/**
|
||||
* Insert commands to have GPU wait for fence to be signaled.
|
||||
*/
|
||||
|
|
|
@ -350,6 +350,7 @@ enum pipe_flush_flags
|
|||
{
|
||||
PIPE_FLUSH_END_OF_FRAME = (1 << 0),
|
||||
PIPE_FLUSH_DEFERRED = (1 << 1),
|
||||
PIPE_FLUSH_FENCE_FD = (1 << 2),
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -741,6 +742,7 @@ enum pipe_cap
|
|||
PIPE_CAP_TGSI_ARRAY_COMPONENTS,
|
||||
PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS,
|
||||
PIPE_CAP_TGSI_CAN_READ_OUTPUTS,
|
||||
PIPE_CAP_NATIVE_FENCE_FD,
|
||||
};
|
||||
|
||||
#define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
|
||||
|
|
|
@ -264,6 +264,16 @@ struct pipe_screen {
|
|||
struct pipe_fence_handle *fence,
|
||||
uint64_t timeout);
|
||||
|
||||
/**
|
||||
* For fences created with PIPE_FLUSH_FENCE_FD (exported fd) or
|
||||
* by create_fence_fd() (imported fd), return the native fence fd
|
||||
* associated with the fence. This may return -1 for fences
|
||||
* created with PIPE_FLUSH_DEFERRED if the fence command has not
|
||||
* been flushed yet.
|
||||
*/
|
||||
int (*fence_get_fd)(struct pipe_screen *screen,
|
||||
struct pipe_fence_handle *fence);
|
||||
|
||||
/**
|
||||
* Returns a driver-specific query.
|
||||
*
|
||||
|
|
|
@ -1457,6 +1457,18 @@ struct dri2_fence {
|
|||
void *cl_event;
|
||||
};
|
||||
|
||||
static unsigned dri2_fence_get_caps(__DRIscreen *_screen)
|
||||
{
|
||||
struct dri_screen *driscreen = dri_screen(_screen);
|
||||
struct pipe_screen *screen = driscreen->base.screen;
|
||||
unsigned caps = 0;
|
||||
|
||||
if (screen->get_param(screen, PIPE_CAP_NATIVE_FENCE_FD))
|
||||
caps |= __DRI_FENCE_CAP_NATIVE_FD;
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
static void *
|
||||
dri2_create_fence(__DRIcontext *_ctx)
|
||||
{
|
||||
|
@ -1477,6 +1489,39 @@ dri2_create_fence(__DRIcontext *_ctx)
|
|||
return fence;
|
||||
}
|
||||
|
||||
static void *
|
||||
dri2_create_fence_fd(__DRIcontext *_ctx, int fd)
|
||||
{
|
||||
struct pipe_context *ctx = dri_context(_ctx)->st->pipe;
|
||||
struct dri2_fence *fence = CALLOC_STRUCT(dri2_fence);
|
||||
|
||||
if (fd == -1) {
|
||||
/* exporting driver created fence, flush: */
|
||||
ctx->flush(ctx, &fence->pipe_fence,
|
||||
PIPE_FLUSH_DEFERRED | PIPE_FLUSH_FENCE_FD);
|
||||
} else {
|
||||
/* importing a foreign fence fd: */
|
||||
ctx->create_fence_fd(ctx, &fence->pipe_fence, fd);
|
||||
}
|
||||
if (!fence->pipe_fence) {
|
||||
FREE(fence);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fence->driscreen = dri_screen(_ctx->driScreenPriv);
|
||||
return fence;
|
||||
}
|
||||
|
||||
static int
|
||||
dri2_get_fence_fd(__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;
|
||||
|
||||
return screen->fence_get_fd(screen, fence->pipe_fence);
|
||||
}
|
||||
|
||||
static void *
|
||||
dri2_get_fence_from_cl_event(__DRIscreen *_screen, intptr_t cl_event)
|
||||
{
|
||||
|
@ -1556,13 +1601,16 @@ dri2_server_wait_sync(__DRIcontext *_ctx, void *_fence, unsigned flags)
|
|||
}
|
||||
|
||||
static __DRI2fenceExtension dri2FenceExtension = {
|
||||
.base = { __DRI2_FENCE, 1 },
|
||||
.base = { __DRI2_FENCE, 2 },
|
||||
|
||||
.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
|
||||
.server_wait_sync = dri2_server_wait_sync,
|
||||
.get_capabilities = dri2_fence_get_caps,
|
||||
.create_fence_fd = dri2_create_fence_fd,
|
||||
.get_fence_fd = dri2_get_fence_fd,
|
||||
};
|
||||
|
||||
static const __DRIrobustnessExtension dri2Robustness = {
|
||||
|
|
Loading…
Reference in New Issue