From: Paul Berry <stereotype...@gmail.com> v2: Marek: Add DRI3 support. --- src/glx/dri2_glx.c | 16 +++++++++++++++- src/glx/dri3_glx.c | 13 +++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index d6eb281..8dabcb3 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -67,21 +67,21 @@ struct dri2_display ** XFree86-DRI version information */ int driMajor; int driMinor; int driPatch; int swapAvailable; int invalidateAvailable; __glxHashTable *dri2Hash; - const __DRIextension *loader_extensions[4]; + const __DRIextension *loader_extensions[5]; }; struct dri2_drawable { __GLXDRIdrawable base; __DRIdrawable *driDrawable; __DRIbuffer buffers[5]; int bufferCount; int width, height; int have_back; @@ -939,40 +939,52 @@ dri2SetSwapInterval(__GLXDRIdrawable *pdraw, int interval) } static int dri2GetSwapInterval(__GLXDRIdrawable *pdraw) { struct dri2_drawable *priv = (struct dri2_drawable *) 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 }, .getBuffers = dri2GetBuffers, .flushFrontBuffer = dri2FlushFrontBuffer, .getBuffersWithFormat = dri2GetBuffersWithFormat, }; static const __DRIdri2LoaderExtension dri2LoaderExtension_old = { .base = { __DRI_DRI2_LOADER, 3 }, .getBuffers = dri2GetBuffers, .flushFrontBuffer = dri2FlushFrontBuffer, .getBuffersWithFormat = NULL, }; static const __DRIuseInvalidateExtension dri2UseInvalidate = { .base = { __DRI_USE_INVALIDATE, 1 } }; +static const __DRIbackgroundCallableExtension driBackgroundCallable = { + { __DRI_BACKGROUND_CALLABLE, __DRI_BACKGROUND_CALLABLE_VERSION }, + driSetBackgroundContext, +}; + _X_HIDDEN void dri2InvalidateBuffers(Display *dpy, XID drawable) { __GLXDRIdrawable *pdraw = dri2GetGlxDrawableFromXDrawableId(dpy, drawable); struct dri2_screen *psc; struct dri2_drawable *pdp = (struct dri2_drawable *) pdraw; if (!pdraw) return; @@ -1390,20 +1402,22 @@ dri2CreateDisplay(Display * dpy) i = 0; if (pdp->driMinor < 1) pdp->loader_extensions[i++] = &dri2LoaderExtension_old.base; 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(); if (pdp->dri2Hash == NULL) { free(pdp); return NULL; } return &pdp->base; } diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index 42a94f9..688b457 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -489,37 +489,50 @@ dri3_flush_front_buffer(__DRIdrawable *driDrawable, void *loaderPrivate) psc = (struct dri3_screen *) pdraw->base.psc; (void) __glXInitialize(psc->base.dpy); loader_dri3_flush(draw, __DRI2_FLUSH_DRAWABLE, __DRI2_THROTTLE_FLUSHFRONT); loader_dri3_wait_gl(draw); } +static void +dri_set_background_context(void *loaderPrivate) +{ + struct dri3_context *pcp = (struct dri3_context *)loaderPrivate; + __glXSetCurrentContext(&pcp->base); +} + /* The image loader extension record for DRI3 */ static const __DRIimageLoaderExtension imageLoaderExtension = { .base = { __DRI_IMAGE_LOADER, 1 }, .getBuffers = loader_dri3_get_buffers, .flushFrontBuffer = dri3_flush_front_buffer, }; const __DRIuseInvalidateExtension dri3UseInvalidate = { .base = { __DRI_USE_INVALIDATE, 1 } }; +static const __DRIbackgroundCallableExtension driBackgroundCallable = { + { __DRI_BACKGROUND_CALLABLE, 1 }, + dri_set_background_context, +}; + static const __DRIextension *loader_extensions[] = { &imageLoaderExtension.base, &systemTimeExtension.base, &dri3UseInvalidate.base, + &driBackgroundCallable.base, NULL }; /** dri3_swap_buffers * * Make the current back buffer visible using the present extension */ static int64_t dri3_swap_buffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, int64_t remainder, Bool flush) -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev