summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/dri/dri2.c
diff options
context:
space:
mode:
authorGurchetan Singh <[email protected]>2017-05-22 17:33:22 -0700
committerChad Versace <[email protected]>2017-06-02 12:33:21 -0700
commit59dc23bba909978b80f8420e240eee765bff2435 (patch)
treea73dc4747ebc536dcc038d899bdbaf8352d6db23 /src/gallium/state_trackers/dri/dri2.c
parent3ba5b8a560d34db9f0c035d025641da537215efd (diff)
st/dri: move fence implemention into separate file
Since the fence implementation is not dri2.c specific, put it in a separate file. This way SW implementations can use this extension too. v2: Don't depend on dri2.c for extensions (Emil) v3: Make this patch only move extension into a separate file (Chad). Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers/dri/dri2.c')
-rw-r--r--src/gallium/state_trackers/dri/dri2.c204
1 files changed, 1 insertions, 203 deletions
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
index ed6004f836d..20dee03b8bd 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -29,7 +29,6 @@
*/
#include <xf86drm.h>
-#include <dlfcn.h>
#include <fcntl.h>
#include "GL/mesa_glinterop.h"
#include "util/u_memory.h"
@@ -49,6 +48,7 @@
#include "dri_screen.h"
#include "dri_context.h"
#include "dri_drawable.h"
+#include "dri_extensions.h"
#include "dri_query_renderer.h"
#include "dri2_buffer.h"
@@ -1415,208 +1415,6 @@ static __DRIimageExtension dri2ImageExtension = {
.unmapImage = dri2_unmap_image,
};
-
-static bool
-dri2_is_opencl_interop_loaded_locked(struct dri_screen *screen)
-{
- return screen->opencl_dri_event_add_ref &&
- screen->opencl_dri_event_release &&
- screen->opencl_dri_event_wait &&
- screen->opencl_dri_event_get_fence;
-}
-
-static bool
-dri2_load_opencl_interop(struct dri_screen *screen)
-{
-#if defined(RTLD_DEFAULT)
- bool success;
-
- mtx_lock(&screen->opencl_func_mutex);
-
- if (dri2_is_opencl_interop_loaded_locked(screen)) {
- mtx_unlock(&screen->opencl_func_mutex);
- return true;
- }
-
- screen->opencl_dri_event_add_ref =
- dlsym(RTLD_DEFAULT, "opencl_dri_event_add_ref");
- screen->opencl_dri_event_release =
- dlsym(RTLD_DEFAULT, "opencl_dri_event_release");
- screen->opencl_dri_event_wait =
- dlsym(RTLD_DEFAULT, "opencl_dri_event_wait");
- screen->opencl_dri_event_get_fence =
- dlsym(RTLD_DEFAULT, "opencl_dri_event_get_fence");
-
- success = dri2_is_opencl_interop_loaded_locked(screen);
- mtx_unlock(&screen->opencl_func_mutex);
- return success;
-#else
- return false;
-#endif
-}
-
-struct dri2_fence {
- struct dri_screen *driscreen;
- struct pipe_fence_handle *pipe_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)
-{
- 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;
- }
-
- fence->driscreen = dri_screen(_ctx->driScreenPriv);
- 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)
-{
- struct dri_screen *driscreen = dri_screen(_screen);
- struct dri2_fence *fence;
-
- if (!dri2_load_opencl_interop(driscreen))
- return NULL;
-
- fence = CALLOC_STRUCT(dri2_fence);
- if (!fence)
- return NULL;
-
- fence->cl_event = (void*)cl_event;
-
- if (!driscreen->opencl_dri_event_add_ref(fence->cl_event)) {
- free(fence);
- return NULL;
- }
-
- fence->driscreen = driscreen;
- return fence;
-}
-
-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 if (fence->cl_event)
- driscreen->opencl_dri_event_release(fence->cl_event);
- else
- assert(0);
-
- FREE(fence);
-}
-
-static GLboolean
-dri2_client_wait_sync(__DRIcontext *_ctx, void *_fence, unsigned flags,
- uint64_t timeout)
-{
- struct dri2_fence *fence = (struct dri2_fence*)_fence;
- struct dri_screen *driscreen = fence->driscreen;
- struct pipe_screen *screen = driscreen->base.screen;
-
- /* No need to flush. The context was flushed when the fence was created. */
-
- if (fence->pipe_fence)
- return screen->fence_finish(screen, NULL, fence->pipe_fence, timeout);
- else if (fence->cl_event) {
- struct pipe_fence_handle *pipe_fence =
- driscreen->opencl_dri_event_get_fence(fence->cl_event);
-
- if (pipe_fence)
- return screen->fence_finish(screen, NULL, pipe_fence, timeout);
- else
- return driscreen->opencl_dri_event_wait(fence->cl_event, timeout);
- }
- else {
- assert(0);
- return false;
- }
-}
-
-static void
-dri2_server_wait_sync(__DRIcontext *_ctx, void *_fence, unsigned flags)
-{
- struct pipe_context *ctx = dri_context(_ctx)->st->pipe;
- struct dri2_fence *fence = (struct dri2_fence*)_fence;
-
- if (ctx->fence_server_sync)
- ctx->fence_server_sync(ctx, fence->pipe_fence);
-}
-
-static __DRI2fenceExtension dri2FenceExtension = {
- .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,
- .get_capabilities = dri2_fence_get_caps,
- .create_fence_fd = dri2_create_fence_fd,
- .get_fence_fd = dri2_get_fence_fd,
-};
-
static const __DRIrobustnessExtension dri2Robustness = {
.base = { __DRI2_ROBUSTNESS, 1 }
};