X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglx%2Fdri2_glx.c;h=145f44d6e8cffee23f3fffa5cbee31852cb480b4;hb=dabd0499a6ba4032f2cf24103a7ca044061a3b98;hp=27ea9521e50a68df780c047ad3ec9178089f05ea;hpb=324ee9b391ea2db4b74709d30a131e79055bf071;p=mesa.git diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 27ea9521e50..145f44d6e8c 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -74,13 +74,7 @@ struct dri2_display __glxHashTable *dri2Hash; - const __DRIextension *loader_extensions[4]; -}; - -struct dri2_context -{ - struct glx_context base; - __DRIcontext *driContext; + const __DRIextension *loader_extensions[5]; }; struct dri2_drawable @@ -405,7 +399,7 @@ dri2CreateDrawable(struct glx_screen *base, XID xDrawable, } DRI2CreateDrawable(psc->base.dpy, xDrawable); - pdp = (struct dri2_display *)dpyPriv->dri2Display;; + pdp = (struct dri2_display *)dpyPriv->dri2Display; /* Create a new drawable */ pdraw->driDrawable = (*psc->dri2->createNewDrawable) (psc->driScreen, @@ -520,7 +514,7 @@ dri2GetCurrentContext() struct glx_context *gc = __glXGetCurrentContext(); struct dri2_context *dri2Ctx = (struct dri2_context *)gc; - return dri2Ctx ? dri2Ctx->driContext : NULL; + return (gc != &dummyContext) ? dri2Ctx->driContext : NULL; } /** @@ -952,6 +946,13 @@ dri2GetSwapInterval(__GLXDRIdrawable *pdraw) return priv->swap_interval; } +static void +driSetBackgroundContext(void *loaderPrivate) +{ + struct dri2_context *pcp = (struct dri2_context *) loaderPrivate; + __glXSetCurrentContext(&pcp->base); +} + static const __DRIdri2LoaderExtension dri2LoaderExtension = { .base = { __DRI_DRI2_LOADER, 3 }, @@ -972,6 +973,12 @@ static const __DRIuseInvalidateExtension dri2UseInvalidate = { .base = { __DRI_USE_INVALIDATE, 1 } }; +static const __DRIbackgroundCallableExtension driBackgroundCallable = { + .base = { __DRI_BACKGROUND_CALLABLE, 1 }, + + .setBackgroundContext = driSetBackgroundContext, +}; + _X_HIDDEN void dri2InvalidateBuffers(Display *dpy, XID drawable) { @@ -1061,6 +1068,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 @@ -1102,9 +1111,14 @@ dri2BindExtensions(struct dri2_screen *psc, struct glx_display * priv, __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context"); __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context_profile"); - if ((mask & (1 << __DRI_API_GLES2)) != 0) - __glXEnableDirectExtension(&psc->base, - "GLX_EXT_create_context_es2_profile"); + if ((mask & ((1 << __DRI_API_GLES) | + (1 << __DRI_API_GLES2) | + (1 << __DRI_API_GLES3))) != 0) { + __glXEnableDirectExtension(&psc->base, + "GLX_EXT_create_context_es_profile"); + __glXEnableDirectExtension(&psc->base, + "GLX_EXT_create_context_es2_profile"); + } } for (i = 0; extensions[i]; i++) { @@ -1140,6 +1154,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]; } } @@ -1202,7 +1219,7 @@ dri2CreateScreen(int screen, struct glx_display * priv) /* If Mesa knows about the appropriate driver for this fd, then trust it. * Otherwise, default to the server's value. */ - loader_driverName = loader_get_driver_for_fd(psc->fd, 0); + loader_driverName = loader_get_driver_for_fd(psc->fd); if (loader_driverName) { free(driverName); driverName = loader_driverName; @@ -1289,7 +1306,7 @@ dri2CreateScreen(int screen, struct glx_display * priv) __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control"); } - /* DRI2 suports SubBuffer through DRI2CopyRegion, so it's always + /* DRI2 supports SubBuffer through DRI2CopyRegion, so it's always * available.*/ psp->copySubBuffer = dri2CopySubBuffer; __glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer"); @@ -1389,10 +1406,10 @@ dri2CreateDisplay(Display * dpy) else pdp->loader_extensions[i++] = &dri2LoaderExtension.base; - pdp->loader_extensions[i++] = &systemTimeExtension.base; - pdp->loader_extensions[i++] = &dri2UseInvalidate.base; + pdp->loader_extensions[i++] = &driBackgroundCallable.base; + pdp->loader_extensions[i++] = NULL; pdp->dri2Hash = __glxHashCreate();