diff --git a/src/glx/g_glxglvnddispatchfuncs.c b/src/glx/g_glxglvnddispatchfuncs.c index c2defc77d3d..bafe41cc337 100644 --- a/src/glx/g_glxglvnddispatchfuncs.c +++ b/src/glx/g_glxglvnddispatchfuncs.c @@ -5,6 +5,8 @@ #include "glxglvnddispatchfuncs.h" #include "g_glxglvnddispatchindices.h" +#include "GL/mesa_glinterop.h" + const int DI_FUNCTION_COUNT = DI_LAST_INDEX; /* Allocate an extra 'dummy' to ease lookup. See FindGLXFunction() */ int __glXDispatchTableIndices[DI_LAST_INDEX + 1]; @@ -39,6 +41,9 @@ const char * const __glXDispatchTableStrings[DI_LAST_INDEX] = { // glXDestroyPixmap implemented by libglvnd // glXDestroyWindow implemented by libglvnd // glXFreeContextEXT implemented by libglvnd + __ATTRIB(GLInteropExportObjectMESA), + __ATTRIB(GLInteropFlushObjectsMESA), + __ATTRIB(GLInteropQueryDeviceInfoMESA), // glXGetClientString implemented by libglvnd // glXGetConfig implemented by libglvnd __ATTRIB(GetContextIDEXT), @@ -306,6 +311,63 @@ static void dispatch_DestroyGLXPbufferSGIX(Display *dpy, GLXPbuffer pbuf) +static int dispatch_GLInteropExportObjectMESA(Display *dpy, GLXContext ctx, + struct mesa_glinterop_export_in *in, + struct mesa_glinterop_export_out *out) +{ + PFNMESAGLINTEROPGLXEXPORTOBJECTPROC pGLInteropExportObjectMESA; + __GLXvendorInfo *dd; + + dd = GetDispatchFromContext(ctx); + if (dd == NULL) + return 0; + + __FETCH_FUNCTION_PTR(GLInteropExportObjectMESA); + if (pGLInteropExportObjectMESA == NULL) + return 0; + + return pGLInteropExportObjectMESA(dpy, ctx, in, out); +} + + +static int dispatch_GLInteropFlushObjectsMESA(Display *dpy, GLXContext ctx, + unsigned count, + struct mesa_glinterop_export_in *resources, + GLsync *sync) +{ + PFNMESAGLINTEROPGLXFLUSHOBJECTSPROC pGLInteropFlushObjectsMESA; + __GLXvendorInfo *dd; + + dd = GetDispatchFromContext(ctx); + if (dd == NULL) + return 0; + + __FETCH_FUNCTION_PTR(GLInteropFlushObjectsMESA); + if (pGLInteropFlushObjectsMESA == NULL) + return 0; + + return pGLInteropFlushObjectsMESA(dpy, ctx, count, resources, sync); +} + + +static int dispatch_GLInteropQueryDeviceInfoMESA(Display *dpy, GLXContext ctx, + struct mesa_glinterop_device_info *out) +{ + PFNMESAGLINTEROPGLXQUERYDEVICEINFOPROC pGLInteropQueryDeviceInfoMESA; + __GLXvendorInfo *dd; + + dd = GetDispatchFromContext(ctx); + if (dd == NULL) + return 0; + + __FETCH_FUNCTION_PTR(GLInteropQueryDeviceInfoMESA); + if (pGLInteropQueryDeviceInfoMESA == NULL) + return 0; + + return pGLInteropQueryDeviceInfoMESA(dpy, ctx, out); +} + + static GLXContextID dispatch_GetContextIDEXT(const GLXContext ctx) { PFNGLXGETCONTEXTIDEXTPROC pGetContextIDEXT; @@ -981,6 +1043,9 @@ const void * const __glXDispatchFunctions[DI_LAST_INDEX + 1] = { __ATTRIB(CreateGLXPixmapMESA), __ATTRIB(CreateGLXPixmapWithConfigSGIX), __ATTRIB(DestroyGLXPbufferSGIX), + __ATTRIB(GLInteropExportObjectMESA), + __ATTRIB(GLInteropFlushObjectsMESA), + __ATTRIB(GLInteropQueryDeviceInfoMESA), __ATTRIB(GetContextIDEXT), __ATTRIB(GetCurrentDisplayEXT), __ATTRIB(GetDriverConfig), diff --git a/src/glx/g_glxglvnddispatchindices.h b/src/glx/g_glxglvnddispatchindices.h index b65d078098f..70047dc6559 100644 --- a/src/glx/g_glxglvnddispatchindices.h +++ b/src/glx/g_glxglvnddispatchindices.h @@ -31,6 +31,9 @@ typedef enum __GLXdispatchIndex { // DestroyPixmap implemented by libglvnd // DestroyWindow implemented by libglvnd // FreeContextEXT implemented by libglvnd + DI_GLInteropExportObjectMESA, + DI_GLInteropFlushObjectsMESA, + DI_GLInteropQueryDeviceInfoMESA, // GetClientString implemented by libglvnd // GetConfig implemented by libglvnd DI_GetContextIDEXT, diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index 293ac742c92..76d3ea307c9 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -2339,6 +2339,13 @@ static const struct name_address_pair GLX_functions[] = { GLX_FUNCTION(glXQueryCurrentRendererIntegerMESA), GLX_FUNCTION(glXQueryCurrentRendererStringMESA), + /*** GLX_MESA_gl_interop ***/ +#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) + GLX_FUNCTION2(glXGLInteropQueryDeviceInfoMESA, MesaGLInteropGLXQueryDeviceInfo), + GLX_FUNCTION2(glXGLInteropExportObjectMESA, MesaGLInteropGLXExportObject), + GLX_FUNCTION2(glXGLInteropFlushObjectsMESA, MesaGLInteropGLXFlushObjects), +#endif + {NULL, NULL} /* end of list */ };