From 37d3a26bd620703f63673101f4093d13fb97ddef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 3 Mar 2016 18:43:53 +0100 Subject: [PATCH] glx: implement GLX part of interop interface (v2) v2: - use const --- src/glx/Makefile.am | 1 + src/glx/dri2_glx.c | 11 ++--- src/glx/dri2_priv.h | 16 +++++++ src/glx/dri3_glx.c | 5 ++ src/glx/dri3_priv.h | 10 ++++ src/glx/dri_common_interop.c | 92 ++++++++++++++++++++++++++++++++++++ src/glx/glxclient.h | 9 ++++ src/glx/glxcmds.c | 54 +++++++++++++++++++++ 8 files changed, 192 insertions(+), 6 deletions(-) create mode 100644 src/glx/dri_common_interop.c diff --git a/src/glx/Makefile.am b/src/glx/Makefile.am index 00925455b07..d65fb816256 100644 --- a/src/glx/Makefile.am +++ b/src/glx/Makefile.am @@ -113,6 +113,7 @@ libglx_la_SOURCES += \ dri_common.c \ dri_common.h \ dri_common_query_renderer.c \ + dri_common_interop.c \ xfont.c endif diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 77103492a4f..cc162f2d1ee 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -77,12 +77,6 @@ struct dri2_display const __DRIextension *loader_extensions[4]; }; -struct dri2_context -{ - struct glx_context base; - __DRIcontext *driContext; -}; - struct dri2_drawable { __GLXDRIdrawable base; @@ -1061,6 +1055,8 @@ static const struct glx_context_vtable dri2_context_vtable = { .bind_tex_image = dri2_bind_tex_image, .release_tex_image = dri2_release_tex_image, .get_proc_address = NULL, + .interop_query_device_info = dri2_interop_query_device_info, + .interop_export_object = dri2_interop_export_object }; static void @@ -1145,6 +1141,9 @@ dri2BindExtensions(struct dri2_screen *psc, struct glx_display * priv, psc->rendererQuery = (__DRI2rendererQueryExtension *) extensions[i]; __glXEnableDirectExtension(&psc->base, "GLX_MESA_query_renderer"); } + + if (strcmp(extensions[i]->name, __DRI2_INTEROP) == 0) + psc->interop = (__DRI2interopExtension*)extensions[i]; } } diff --git a/src/glx/dri2_priv.h b/src/glx/dri2_priv.h index b93d1587aae..e81b1bf416d 100644 --- a/src/glx/dri2_priv.h +++ b/src/glx/dri2_priv.h @@ -43,6 +43,7 @@ struct dri2_screen { const __DRItexBufferExtension *texBuffer; const __DRI2throttleExtension *throttle; const __DRI2rendererQueryExtension *rendererQuery; + const __DRI2interopExtension *interop; const __DRIconfig **driver_configs; void *driver; @@ -51,6 +52,12 @@ struct dri2_screen { int show_fps_interval; }; +struct dri2_context +{ + struct glx_context base; + __DRIcontext *driContext; +}; + _X_HIDDEN int dri2_query_renderer_integer(struct glx_screen *base, int attribute, unsigned int *value); @@ -58,3 +65,12 @@ dri2_query_renderer_integer(struct glx_screen *base, int attribute, _X_HIDDEN int dri2_query_renderer_string(struct glx_screen *base, int attribute, const char **value); + +_X_HIDDEN int +dri2_interop_query_device_info(struct glx_context *ctx, + mesa_glinterop_device_info *out); + +_X_HIDDEN int +dri2_interop_export_object(struct glx_context *ctx, + const mesa_glinterop_export_in *in, + mesa_glinterop_export_out *out); diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index 6054ffc3dc1..6729357bb3c 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -638,6 +638,8 @@ static const struct glx_context_vtable dri3_context_vtable = { .bind_tex_image = dri3_bind_tex_image, .release_tex_image = dri3_release_tex_image, .get_proc_address = NULL, + .interop_query_device_info = dri3_interop_query_device_info, + .interop_export_object = dri3_interop_export_object }; /** dri3_bind_extensions @@ -704,6 +706,9 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv, psc->rendererQuery = (__DRI2rendererQueryExtension *) extensions[i]; __glXEnableDirectExtension(&psc->base, "GLX_MESA_query_renderer"); } + + if (strcmp(extensions[i]->name, __DRI2_INTEROP) == 0) + psc->interop = (__DRI2interopExtension*)extensions[i]; } } diff --git a/src/glx/dri3_priv.h b/src/glx/dri3_priv.h index 56a63309f36..d4ecdf7a58e 100644 --- a/src/glx/dri3_priv.h +++ b/src/glx/dri3_priv.h @@ -96,6 +96,7 @@ struct dri3_screen { const __DRI2configQueryExtension *config; const __DRItexBufferExtension *texBuffer; const __DRI2rendererQueryExtension *rendererQuery; + const __DRI2interopExtension *interop; const __DRIconfig **driver_configs; void *driver; @@ -131,3 +132,12 @@ dri3_query_renderer_integer(struct glx_screen *base, int attribute, _X_HIDDEN int dri3_query_renderer_string(struct glx_screen *base, int attribute, const char **value); + +_X_HIDDEN int +dri3_interop_query_device_info(struct glx_context *ctx, + mesa_glinterop_device_info *out); + +_X_HIDDEN int +dri3_interop_export_object(struct glx_context *ctx, + const mesa_glinterop_export_in *in, + mesa_glinterop_export_out *out); diff --git a/src/glx/dri_common_interop.c b/src/glx/dri_common_interop.c new file mode 100644 index 00000000000..4733f3caab3 --- /dev/null +++ b/src/glx/dri_common_interop.c @@ -0,0 +1,92 @@ +/* + * Copyright © 2013 Intel 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. + */ + +#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) + +#include "glxclient.h" +#include "glx_error.h" +#include "dri_interface.h" +#include "dri2_priv.h" +#if defined(HAVE_DRI3) +#include "dri3_priv.h" +#endif +#include "GL/mesa_glinterop.h" + +_X_HIDDEN int +dri2_interop_query_device_info(struct glx_context *ctx, + mesa_glinterop_device_info *out) +{ + struct dri2_screen *psc = (struct dri2_screen*)ctx->psc; + struct dri2_context *drictx = (struct dri2_context*)ctx; + + if (!psc->interop) + return MESA_GLINTEROP_UNSUPPORTED; + + return psc->interop->query_device_info(drictx->driContext, out); +} + +_X_HIDDEN int +dri2_interop_export_object(struct glx_context *ctx, + const mesa_glinterop_export_in *in, + mesa_glinterop_export_out *out) +{ + struct dri2_screen *psc = (struct dri2_screen*)ctx->psc; + struct dri2_context *drictx = (struct dri2_context*)ctx; + + if (!psc->interop) + return MESA_GLINTEROP_UNSUPPORTED; + + return psc->interop->export_object(drictx->driContext, in, out); +} + +#if defined(HAVE_DRI3) + +_X_HIDDEN int +dri3_interop_query_device_info(struct glx_context *ctx, + mesa_glinterop_device_info *out) +{ + struct dri3_screen *psc = (struct dri3_screen*)ctx->psc; + struct dri3_context *drictx = (struct dri3_context*)ctx; + + if (!psc->interop) + return MESA_GLINTEROP_UNSUPPORTED; + + return psc->interop->query_device_info(drictx->driContext, out); +} + +_X_HIDDEN int +dri3_interop_export_object(struct glx_context *ctx, + const mesa_glinterop_export_in *in, + mesa_glinterop_export_out *out) +{ + struct dri3_screen *psc = (struct dri3_screen*)ctx->psc; + struct dri3_context *drictx = (struct dri3_context*)ctx; + + if (!psc->interop) + return MESA_GLINTEROP_UNSUPPORTED; + + return psc->interop->export_object(drictx->driContext, in, out); +} + +#endif /* HAVE_DRI3 */ +#endif /* defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) */ diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index 2776b44a9e5..7a249281081 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -208,6 +208,10 @@ typedef struct __GLXattributeMachineRec __GLXattribute **stackPointer; } __GLXattributeMachine; +typedef struct _mesa_glinterop_device_info mesa_glinterop_device_info; +typedef struct _mesa_glinterop_export_in mesa_glinterop_export_in; +typedef struct _mesa_glinterop_export_out mesa_glinterop_export_out; + struct glx_context_vtable { void (*destroy)(struct glx_context *ctx); int (*bind)(struct glx_context *context, struct glx_context *old, @@ -222,6 +226,11 @@ struct glx_context_vtable { int buffer, const int *attrib_list); void (*release_tex_image)(Display * dpy, GLXDrawable drawable, int buffer); void * (*get_proc_address)(const char *symbol); + int (*interop_query_device_info)(struct glx_context *ctx, + mesa_glinterop_device_info *out); + int (*interop_export_object)(struct glx_context *ctx, + const mesa_glinterop_export_in *in, + mesa_glinterop_export_out *out); }; /** diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index 93e8db5a367..63f492128bc 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -54,6 +54,7 @@ #include #include #include +#include "GL/mesa_glinterop.h" static const char __glXGLXClientVendorName[] = "Mesa Project and SGI"; static const char __glXGLXClientVersion[] = "1.4"; @@ -2691,3 +2692,56 @@ __glXGetUST(int64_t * ust) } } #endif /* GLX_DIRECT_RENDERING */ + +#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) + +GLAPI int GLAPIENTRY +MesaGLInteropGLXQueryDeviceInfo(Display *dpy, GLXContext context, + mesa_glinterop_device_info *out) +{ + struct glx_context *gc = (struct glx_context*)context; + int ret; + + __glXLock(); + + if (!gc || gc->xid == None || !gc->isDirect) { + __glXUnlock(); + return MESA_GLINTEROP_INVALID_CONTEXT; + } + + if (!gc->vtable->interop_query_device_info) { + __glXUnlock(); + return MESA_GLINTEROP_UNSUPPORTED; + } + + ret = gc->vtable->interop_query_device_info(gc, out); + __glXUnlock(); + return ret; +} + +GLAPI int GLAPIENTRY +MesaGLInteropGLXExportObject(Display *dpy, GLXContext context, + const mesa_glinterop_export_in *in, + mesa_glinterop_export_out *out) +{ + struct glx_context *gc = (struct glx_context*)context; + int ret; + + __glXLock(); + + if (!gc || gc->xid == None || !gc->isDirect) { + __glXUnlock(); + return MESA_GLINTEROP_INVALID_CONTEXT; + } + + if (!gc->vtable->interop_export_object) { + __glXUnlock(); + return MESA_GLINTEROP_UNSUPPORTED; + } + + ret = gc->vtable->interop_export_object(gc, in, out); + __glXUnlock(); + return ret; +} + +#endif /* defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) */