Mesa (main): mesa: implement import win32 memory and semaphore
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sun May 15 20:23:01 UTC 2022
Module: Mesa
Branch: main
Commit: c709bbde9e4e648d3f02ed1e7bd9c6d150848acd
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c709bbde9e4e648d3f02ed1e7bd9c6d150848acd
Author: Sidney Just <justsid at x-plane.com>
Date: Tue Mar 22 22:55:32 2022 -0700
mesa: implement import win32 memory and semaphore
Acked-by: Marek Olšák <marek.olsak at amd.com>
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15504>
---
src/mesa/main/externalobjects.c | 85 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 84 insertions(+), 1 deletion(-)
diff --git a/src/mesa/main/externalobjects.c b/src/mesa/main/externalobjects.c
index 960db7390a8..4a0894132a0 100644
--- a/src/mesa/main/externalobjects.c
+++ b/src/mesa/main/externalobjects.c
@@ -84,6 +84,30 @@ import_memoryobj_fd(struct gl_context *ctx,
#endif
}
+static void
+import_memoryobj_win32(struct gl_context *ctx,
+ struct gl_memory_object *obj,
+ GLuint64 size,
+ void *handle)
+{
+ struct pipe_screen *screen = ctx->pipe->screen;
+ struct winsys_handle whandle = {
+ .type = WINSYS_HANDLE_TYPE_WIN32_HANDLE,
+#ifdef _WIN32
+ .handle = handle,
+#else
+ .handle = 0,
+#endif
+#ifdef HAVE_LIBDRM
+ .modifier = DRM_FORMAT_MOD_INVALID,
+#endif
+ };
+
+ obj->memory = screen->memobj_create_from_handle(screen,
+ &whandle,
+ obj->Dedicated);
+}
+
/**
* Delete a memory object.
* Not removed from hash table here.
@@ -616,6 +640,16 @@ import_semaphoreobj_fd(struct gl_context *ctx,
#endif
}
+static void
+import_semaphoreobj_win32(struct gl_context *ctx,
+ struct gl_semaphore_object *semObj,
+ void *handle)
+{
+ struct pipe_context *pipe = ctx->pipe;
+
+ pipe->screen->create_fence_win32(pipe->screen, &semObj->fence, handle, PIPE_FD_TYPE_SYNCOBJ);
+}
+
static void
server_wait_semaphore(struct gl_context *ctx,
struct gl_semaphore_object *semObj,
@@ -1001,6 +1035,26 @@ _mesa_ImportMemoryWin32HandleEXT(GLuint memory,
GLenum handleType,
void *handle)
{
+ GET_CURRENT_CONTEXT(ctx);
+
+ const char *func = "glImportMemoryWin32HandleEXT";
+
+ if (!ctx->Extensions.EXT_memory_object_win32) {
+ _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
+ return;
+ }
+
+ if (handleType != GL_HANDLE_TYPE_OPAQUE_WIN32_EXT) {
+ _mesa_error(ctx, GL_INVALID_ENUM, "%s(handleType=%u)", func, handleType);
+ return;
+ }
+
+ struct gl_memory_object *memObj = _mesa_lookup_memory_object(ctx, memory);
+ if (!memObj)
+ return;
+
+ import_memoryobj_win32(ctx, memObj, size, handle);
+ memObj->Immutable = GL_TRUE;
}
void GLAPIENTRY
@@ -1044,4 +1098,33 @@ _mesa_ImportSemaphoreWin32HandleEXT(GLuint semaphore,
GLenum handleType,
void *handle)
{
-}
\ No newline at end of file
+ GET_CURRENT_CONTEXT(ctx);
+
+ const char *func = "glImportSemaphoreWin32HandleEXT";
+
+ if (!ctx->Extensions.EXT_semaphore_win32) {
+ _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
+ return;
+ }
+
+ if (handleType != GL_HANDLE_TYPE_OPAQUE_WIN32_EXT) {
+ _mesa_error(ctx, GL_INVALID_ENUM, "%s(handleType=%u)", func, handleType);
+ return;
+ }
+
+ struct gl_semaphore_object *semObj = _mesa_lookup_semaphore_object(ctx,
+ semaphore);
+ if (!semObj)
+ return;
+
+ if (semObj == &DummySemaphoreObject) {
+ semObj = semaphoreobj_alloc(ctx, semaphore);
+ if (!semObj) {
+ _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func);
+ return;
+ }
+ _mesa_HashInsert(ctx->Shared->SemaphoreObjects, semaphore, semObj, true);
+ }
+
+ import_semaphoreobj_win32(ctx, semObj, handle);
+}
More information about the mesa-commit
mailing list