diff options
author | Adam Jackson <ajax@redhat.com> | 2021-06-02 14:39:33 -0400 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2022-05-17 20:31:50 +0000 |
commit | 4d0179af3212b57fa8a34b9a9fa593d514a23bec (patch) | |
tree | 20a9b0ed27d5d9a197d991239c1a3532be66b048 /src/glx | |
parent | dc73de630e8ab2d44bb540ff51a66a405ae19b1d (diff) |
glx/dri2: Require DRI2 >= 1.3 for working buffer invalidation
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10808>
Diffstat (limited to 'src/glx')
-rw-r--r-- | src/glx/dri2_glx.c | 109 |
1 files changed, 25 insertions, 84 deletions
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index fd090bf374f..216064c27ad 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -69,8 +69,6 @@ struct dri2_display int driMajor; int driMinor; int driPatch; - int swapAvailable; - int invalidateAvailable; __glxHashTable *dri2Hash; @@ -133,8 +131,6 @@ dri2_bind_context(struct glx_context *context, struct glx_context *old, struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc; struct dri2_drawable *pdraw, *pread; __DRIdrawable *dri_draw = NULL, *dri_read = NULL; - struct glx_display *dpyPriv = psc->base.display; - struct dri2_display *pdp; pdraw = (struct dri2_drawable *) driFetchDrawable(context, draw); pread = (struct dri2_drawable *) driFetchDrawable(context, read); @@ -154,16 +150,6 @@ dri2_bind_context(struct glx_context *context, struct glx_context *old, if (!(*psc->core->bindContext) (pcp->driContext, dri_draw, dri_read)) return GLXBadContext; - /* If the server doesn't send invalidate events, we may miss a - * resize before the rendering starts. Invalidate the buffers now - * so the driver will recheck before rendering starts. */ - pdp = (struct dri2_display *) dpyPriv->dri2Display; - if (!pdp->invalidateAvailable && pdraw) { - dri2InvalidateBuffers(psc->base.dpy, pdraw->base.xDrawable); - if (pread != pdraw && pread) - dri2InvalidateBuffers(psc->base.dpy, pread->base.xDrawable); - } - return Success; } @@ -623,7 +609,6 @@ static void dri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate) { struct glx_display *priv; - struct dri2_display *pdp; struct glx_context *gc; struct dri2_drawable *pdraw = loaderPrivate; struct dri2_screen *psc; @@ -641,15 +626,10 @@ dri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate) if (priv == NULL) return; - pdp = (struct dri2_display *) priv->dri2Display; gc = __glXGetCurrentContext(); dri2Throttle(psc, pdraw, __DRI2_THROTTLE_FLUSHFRONT); - /* Old servers don't send invalidate events */ - if (!pdp->invalidateAvailable) - dri2InvalidateBuffers(priv->dpy, pdraw->base.xDrawable); - dri2_wait_gl(gc); } @@ -783,39 +763,26 @@ dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, int64_t remainder, Bool flush) { struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; - struct glx_display *dpyPriv = __glXInitialize(priv->base.psc->dpy); struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; - struct dri2_display *pdp = - (struct dri2_display *)dpyPriv->dri2Display; int64_t ret = 0; /* Check we have the right attachments */ if (!priv->have_back) return ret; - /* Old servers can't handle swapbuffers */ - if (!pdp->swapAvailable) { - __dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height, - __DRI2_THROTTLE_SWAPBUFFER, flush); - } else { - __DRIcontext *ctx = dri2GetCurrentContext(); - unsigned flags = __DRI2_FLUSH_DRAWABLE; - if (flush) - flags |= __DRI2_FLUSH_CONTEXT; - dri2Flush(psc, ctx, priv, flags, __DRI2_THROTTLE_SWAPBUFFER); - - ret = dri2XcbSwapBuffers(pdraw->psc->dpy, pdraw, - target_msc, divisor, remainder); - } + __DRIcontext *ctx = dri2GetCurrentContext(); + unsigned flags = __DRI2_FLUSH_DRAWABLE; + if (flush) + flags |= __DRI2_FLUSH_CONTEXT; + dri2Flush(psc, ctx, priv, flags, __DRI2_THROTTLE_SWAPBUFFER); + + ret = dri2XcbSwapBuffers(pdraw->psc->dpy, pdraw, + target_msc, divisor, remainder); if (psc->show_fps_interval) { show_fps(priv); } - /* Old servers don't send invalidate events */ - if (!pdp->invalidateAvailable) - dri2InvalidateBuffers(dpyPriv->dpy, pdraw->xDrawable); - return ret; } @@ -933,14 +900,6 @@ static const __DRIdri2LoaderExtension dri2LoaderExtension = { .getBuffersWithFormat = dri2GetBuffersWithFormat, }; -static const __DRIdri2LoaderExtension dri2LoaderExtension_old = { - .base = { __DRI_DRI2_LOADER, 3 }, - - .getBuffers = dri2GetBuffers, - .flushFrontBuffer = dri2FlushFrontBuffer, - .getBuffersWithFormat = NULL, -}; - const __DRIuseInvalidateExtension dri2UseInvalidate = { .base = { __DRI_USE_INVALIDATE, 1 } }; @@ -975,20 +934,12 @@ dri2_bind_tex_image(__GLXDRIdrawable *base, { struct glx_context *gc = __glXGetCurrentContext(); struct dri2_context *pcp = (struct dri2_context *) gc; - struct glx_display *dpyPriv = __glXInitialize(gc->currentDpy); struct dri2_drawable *pdraw = (struct dri2_drawable *) base; - struct dri2_display *pdp; struct dri2_screen *psc; - pdp = (struct dri2_display *) dpyPriv->dri2Display; - if (pdraw != NULL) { psc = (struct dri2_screen *) base->psc; - if (!pdp->invalidateAvailable && psc->f && - psc->f->base.version >= 3 && psc->f->invalidate) - psc->f->invalidate(pdraw->driDrawable); - if (psc->texBuffer->base.version >= 2 && psc->texBuffer->setTexBuffer2 != NULL) { (*psc->texBuffer->setTexBuffer2) (pcp->driContext, @@ -1038,8 +989,6 @@ static void dri2BindExtensions(struct dri2_screen *psc, struct glx_display * priv, const char *driverName) { - const struct dri2_display *const pdp = (struct dri2_display *) - priv->dri2Display; const unsigned mask = psc->dri2->getAPIMask(psc->driScreen); const __DRIextension **extensions; int i; @@ -1057,14 +1006,12 @@ dri2BindExtensions(struct dri2_screen *psc, struct glx_display * priv, * systems running on drivers which don't support that extension. * There's no way to test for its presence on this side, so instead * of disabling it unconditionally, just disable it for drivers - * which are known to not support it, or for DDX drivers supporting - * only an older (pre-ScheduleSwap) version of DRI2. + * which are known to not support it. * - * This is a hack which is required until: - * http://lists.x.org/archives/xorg-devel/2013-February/035449.html - * is merged and updated xserver makes it's way into distros: + * This was fixed in xserver 1.15.0 (190b03215), so now we only + * disable the broken driver. */ - if (pdp->swapAvailable && strcmp(driverName, "vmwgfx") != 0) { + if (strcmp(driverName, "vmwgfx") != 0) { __glXEnableDirectExtension(&psc->base, "GLX_INTEL_swap_event"); } @@ -1266,17 +1213,14 @@ dri2CreateScreen(int screen, struct glx_display * priv) psp->bindTexImage = dri2_bind_tex_image; psp->releaseTexImage = dri2_release_tex_image; - if (pdp->driMinor >= 2) { - psp->getDrawableMSC = dri2DrawableGetMSC; - psp->waitForMSC = dri2WaitForMSC; - psp->waitForSBC = dri2WaitForSBC; - psp->setSwapInterval = dri2SetSwapInterval; - psp->getSwapInterval = dri2GetSwapInterval; - psp->maxSwapInterval = INT_MAX; - - __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control"); - } + psp->getDrawableMSC = dri2DrawableGetMSC; + psp->waitForMSC = dri2WaitForMSC; + psp->waitForSBC = dri2WaitForSBC; + psp->setSwapInterval = dri2SetSwapInterval; + psp->getSwapInterval = dri2GetSwapInterval; + psp->maxSwapInterval = INT_MAX; + __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control"); __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync"); if (psc->config->base.version > 1 && @@ -1390,23 +1334,20 @@ dri2CreateDisplay(Display * dpy) return NULL; } + if (pdp->driMinor < 3) { + free(pdp); + return NULL; + } + pdp->driPatch = 0; - pdp->swapAvailable = (pdp->driMinor >= 2); - pdp->invalidateAvailable = (pdp->driMinor >= 3); pdp->base.destroyDisplay = dri2DestroyDisplay; pdp->base.createScreen = dri2CreateScreen; i = 0; - if (pdp->driMinor < 1) - pdp->loader_extensions[i++] = &dri2LoaderExtension_old.base; - else - pdp->loader_extensions[i++] = &dri2LoaderExtension.base; - + pdp->loader_extensions[i++] = &dri2LoaderExtension.base; pdp->loader_extensions[i++] = &dri2UseInvalidate.base; - pdp->loader_extensions[i++] = &driBackgroundCallable.base; - pdp->loader_extensions[i++] = NULL; pdp->dri2Hash = __glxHashCreate(); |