wgl: Implement interop methods
authorJesse Natalie <jenatali@microsoft.com>
Fri, 21 Oct 2022 21:48:27 +0000 (14:48 -0700)
committerMarge Bot <emma+marge@anholt.net>
Wed, 2 Nov 2022 18:11:41 +0000 (18:11 +0000)
Reviewed-by: Adam Jackson <ajax@redhat.com>
Acked-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19242>

src/gallium/frontends/wgl/meson.build
src/gallium/frontends/wgl/stw_ext_context.c
src/gallium/frontends/wgl/stw_ext_interop.c [new file with mode: 0644]
src/gallium/frontends/wgl/stw_ext_interop.h [new file with mode: 0644]
src/gallium/frontends/wgl/stw_getprocaddress.c
src/gallium/targets/wgl/gallium_wgl.def.in

index 40a93ad..c41e97f 100644 (file)
@@ -32,6 +32,7 @@ libwgl = static_library(
     'stw_device.c',
     'stw_ext_context.c',
     'stw_ext_extensionsstring.c',
+    'stw_ext_interop.c',
     'stw_ext_pbuffer.c',
     'stw_ext_pixelformat.c',
     'stw_ext_rendertexture.c',
index 0bc5b03..2792790 100644 (file)
@@ -249,6 +249,9 @@ wglMakeContextCurrentARB(HDC hDrawDC, HDC hReadDC, HGLRC hglrc)
    if (stw_dev && stw_dev->callbacks.pfnGetDhglrc) {
       /* Convert HGLRC to DHGLRC */
       dhglrc = stw_dev->callbacks.pfnGetDhglrc(hglrc);
+   } else {
+      /* not using ICD */
+      dhglrc = (DHGLRC)(INT_PTR)hglrc;
    }
 
    return stw_make_current_by_handles(hDrawDC, hReadDC, dhglrc);
diff --git a/src/gallium/frontends/wgl/stw_ext_interop.c b/src/gallium/frontends/wgl/stw_ext_interop.c
new file mode 100644 (file)
index 0000000..27d0ba2
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+* Copyright © Microsoft Corporation
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice (including the next
+* paragraph) shall be included in all copies or substantial portions of the
+* Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+* IN THE SOFTWARE.
+*/
+
+#include "stw_ext_interop.h"
+
+#include "stw_context.h"
+#include "stw_device.h"
+
+#include "state_tracker/st_interop.h"
+
+int
+wglMesaGLInteropQueryDeviceInfo(HDC dpy, HGLRC context,
+                                struct mesa_glinterop_device_info *out)
+{
+   DHGLRC dhglrc = 0;
+
+   if (stw_dev && stw_dev->callbacks.pfnGetDhglrc) {
+      /* Convert HGLRC to DHGLRC */
+      dhglrc = stw_dev->callbacks.pfnGetDhglrc(context);
+   } else {
+      /* not using ICD */
+      dhglrc = (DHGLRC)(INT_PTR)context;
+   }
+
+   struct stw_context *ctx = stw_lookup_context(dhglrc);
+   if (!ctx)
+      return MESA_GLINTEROP_INVALID_CONTEXT;
+
+   return stw_interop_query_device_info(ctx, out);
+}
+
+int
+stw_interop_query_device_info(struct stw_context *ctx,
+                              struct mesa_glinterop_device_info *out)
+{
+   return st_interop_query_device_info(ctx->st, out);
+}
+
+int
+wglMesaGLInteropExportObject(HDC dpy, HGLRC context,
+                             struct mesa_glinterop_export_in *in,
+                             struct mesa_glinterop_export_out *out)
+{
+   DHGLRC dhglrc = 0;
+
+   if (stw_dev && stw_dev->callbacks.pfnGetDhglrc) {
+      /* Convert HGLRC to DHGLRC */
+      dhglrc = stw_dev->callbacks.pfnGetDhglrc(context);
+   } else {
+      /* not using ICD */
+      dhglrc = (DHGLRC)(INT_PTR)context;
+   }
+
+   struct stw_context *ctx = stw_lookup_context(dhglrc);
+   if (!ctx)
+      return MESA_GLINTEROP_INVALID_CONTEXT;
+
+   return stw_interop_export_object(ctx, in, out);
+}
+
+int
+stw_interop_export_object(struct stw_context *ctx,
+                          struct mesa_glinterop_export_in *in,
+                          struct mesa_glinterop_export_out *out)
+{
+   return st_interop_export_object(ctx->st, in, out);
+}
+
+int
+wglMesaGLInteropFlushObjects(HDC dpy, HGLRC context,
+                             unsigned count, struct mesa_glinterop_export_in *resources,
+                             GLsync *sync)
+{
+   DHGLRC dhglrc = 0;
+
+   if (stw_dev && stw_dev->callbacks.pfnGetDhglrc) {
+      /* Convert HGLRC to DHGLRC */
+      dhglrc = stw_dev->callbacks.pfnGetDhglrc(context);
+   } else {
+      /* not using ICD */
+      dhglrc = (DHGLRC)(INT_PTR)context;
+   }
+
+   struct stw_context *ctx = stw_lookup_context(dhglrc);
+   if (!ctx)
+      return MESA_GLINTEROP_INVALID_CONTEXT;
+
+   return stw_interop_flush_objects(ctx, count, resources, sync);
+}
+
+int
+stw_interop_flush_objects(struct stw_context *ctx,
+                          unsigned count, struct mesa_glinterop_export_in *objects,
+                          GLsync *sync)
+{
+   return st_interop_flush_objects(ctx->st, count, objects, sync);
+}
+
diff --git a/src/gallium/frontends/wgl/stw_ext_interop.h b/src/gallium/frontends/wgl/stw_ext_interop.h
new file mode 100644 (file)
index 0000000..1167d2c
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+* Copyright © Microsoft Corporation
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice (including the next
+* paragraph) shall be included in all copies or substantial portions of the
+* Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+* IN THE SOFTWARE.
+*/
+
+#ifndef STW_EXT_INTEROP_H
+#define STW_EXT_INTEROP_H
+
+#include "GL/mesa_glinterop.h"
+
+struct stw_context;
+
+int
+stw_interop_query_device_info(struct stw_context *ctx,
+                              struct mesa_glinterop_device_info *out);
+
+int
+stw_interop_export_object(struct stw_context *ctx,
+                          struct mesa_glinterop_export_in *in,
+                          struct mesa_glinterop_export_out *out);
+
+int
+stw_interop_flush_objects(struct stw_context *ctx,
+                          unsigned count, struct mesa_glinterop_export_in *objects,
+                          GLsync *sync);
+
+#endif /* STW_EXT_INTEROP_H */
index f062cd3..d77b352 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <GL/gl.h>
 #include <GL/wglext.h>
+#include <GL/mesa_glinterop.h>
 
 #include "glapi/glapi.h"
 #include "stw_device.h"
@@ -82,6 +83,11 @@ static const struct stw_extension_entry stw_extension_entries[] = {
    /*  WGL_ARB_make_current_read */
    STW_EXTENSION_ENTRY( wglMakeContextCurrentARB ),
    STW_EXTENSION_ENTRY( wglGetCurrentReadDCARB ),
+
+   /* Unnamed */
+   STW_EXTENSION_ENTRY( wglMesaGLInteropQueryDeviceInfo ),
+   STW_EXTENSION_ENTRY( wglMesaGLInteropExportObject ),
+   STW_EXTENSION_ENTRY( wglMesaGLInteropFlushObjects ),
    { NULL, NULL }
 };
 
index b4c719f..aa778a8 100644 (file)
@@ -44,3 +44,6 @@ stw_create_image_from_renderbuffer
 stw_destroy_image
 stw_translate_image
 stw_get_config_xml
+stw_interop_query_device_info
+stw_interop_export_object
+stw_interop_flush_objects