glx: Only allow one DRI backend per display

This could only have been useful if you had multiple screens, each
needing different DRI backends, and you were trying to talk to them all
from a single process. I am unconvinced that this is a thing to care
about.
This commit is contained in:
Adam Jackson 2020-12-09 12:54:09 -05:00
parent 443b628e6f
commit 5766074894
4 changed files with 25 additions and 60 deletions

View file

@ -157,7 +157,7 @@ dri2_bind_context(struct glx_context *context, struct glx_context *old,
/* 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;
pdp = (struct dri2_display *) dpyPriv->driDisplay;
if (!pdp->invalidateAvailable && pdraw) {
dri2InvalidateBuffers(psc->base.dpy, pdraw->base.xDrawable);
if (pread != pdraw && pread)
@ -306,7 +306,7 @@ dri2DestroyDrawable(__GLXDRIdrawable *base)
struct dri2_screen *psc = (struct dri2_screen *) base->psc;
struct dri2_drawable *pdraw = (struct dri2_drawable *) base;
struct glx_display *dpyPriv = psc->base.display;
struct dri2_display *pdp = (struct dri2_display *)dpyPriv->dri2Display;
struct dri2_display *pdp = (struct dri2_display *)dpyPriv->driDisplay;
__glxHashDelete(pdp->dri2Hash, pdraw->base.xDrawable);
(*psc->core->destroyDrawable) (pdraw->driDrawable);
@ -368,7 +368,7 @@ dri2CreateDrawable(struct glx_screen *base, XID xDrawable,
}
DRI2CreateDrawable(psc->base.dpy, xDrawable);
pdp = (struct dri2_display *)dpyPriv->dri2Display;
pdp = (struct dri2_display *)dpyPriv->driDisplay;
/* Create a new drawable */
pdraw->driDrawable =
(*psc->dri2->createNewDrawable) (psc->driScreen,
@ -651,7 +651,7 @@ dri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate)
if (priv == NULL)
return;
pdp = (struct dri2_display *) priv->dri2Display;
pdp = (struct dri2_display *) priv->driDisplay;
gc = __glXGetCurrentContext();
dri2Throttle(psc, pdraw, __DRI2_THROTTLE_FLUSHFRONT);
@ -796,7 +796,7 @@ dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor,
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;
(struct dri2_display *)dpyPriv->driDisplay;
int64_t ret = 0;
/* Check we have the right attachments */
@ -995,7 +995,7 @@ dri2_bind_tex_image(Display * dpy,
if (dpyPriv == NULL)
return;
pdp = (struct dri2_display *) dpyPriv->dri2Display;
pdp = (struct dri2_display *) dpyPriv->driDisplay;
if (pdraw != NULL) {
psc = (struct dri2_screen *) base->psc;
@ -1060,7 +1060,7 @@ dri2BindExtensions(struct dri2_screen *psc, struct glx_display * priv,
const char *driverName)
{
const struct dri2_display *const pdp = (struct dri2_display *)
priv->dri2Display;
priv->driDisplay;
const __DRIextension **extensions;
int i;
@ -1181,7 +1181,7 @@ dri2CreateScreen(int screen, struct glx_display * priv)
const __DRIconfig **driver_configs;
const __DRIextension **extensions;
const struct dri2_display *const pdp = (struct dri2_display *)
priv->dri2Display;
priv->driDisplay;
struct dri2_screen *psc;
__GLXDRIscreen *psp;
struct glx_config *configs = NULL, *visuals = NULL;
@ -1376,7 +1376,7 @@ _X_HIDDEN __GLXDRIdrawable *
dri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id)
{
struct glx_display *d = __glXInitialize(dpy);
struct dri2_display *pdp = (struct dri2_display *) d->dri2Display;
struct dri2_display *pdp = (struct dri2_display *) d->driDisplay;
__GLXDRIdrawable *pdraw;
if (__glxHashLookup(pdp->dri2Hash, id, (void *) &pdraw) == 0)

View file

@ -363,7 +363,7 @@ dri3_create_drawable(struct glx_screen *base, XID xDrawable,
bool has_multibuffer = false;
#ifdef HAVE_DRI3_MODIFIERS
const struct dri3_display *const pdp = (struct dri3_display *)
base->display->dri3Display;
base->display->driDisplay;
#endif
pdraw = calloc(1, sizeof(*pdraw));
@ -836,7 +836,7 @@ dri3_create_screen(int screen, struct glx_display * priv)
const __DRIconfig **driver_configs;
const __DRIextension **extensions;
const struct dri3_display *const pdp = (struct dri3_display *)
priv->dri3Display;
priv->driDisplay;
struct dri3_screen *psc;
__GLXDRIscreen *psp;
struct glx_config *configs = NULL, *visuals = NULL;

View file

@ -602,16 +602,12 @@ struct glx_display
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
__glxHashTable *drawHash;
#endif
#if defined(GLX_DIRECT_RENDERING) || defined(GLX_USE_WINDOWSGL)
/**
* Per display direct rendering interface functions and data.
*/
__GLXDRIdisplay *driswDisplay;
__GLXDRIdisplay *dri2Display;
__GLXDRIdisplay *dri3Display;
#endif
#ifdef GLX_USE_WINDOWSGL
__GLXDRIdisplay *windowsdriDisplay;
__GLXDRIdisplay *driDisplay;
#endif
};

View file

@ -256,26 +256,9 @@ glx_display_free(struct glx_display *priv)
__glxHashDestroy(priv->drawHash);
/* Free the direct rendering per display data */
if (priv->driswDisplay)
(*priv->driswDisplay->destroyDisplay) (priv->driswDisplay);
priv->driswDisplay = NULL;
#if defined (GLX_USE_DRM)
if (priv->dri2Display)
(*priv->dri2Display->destroyDisplay) (priv->dri2Display);
priv->dri2Display = NULL;
if (priv->dri3Display)
(*priv->dri3Display->destroyDisplay) (priv->dri3Display);
priv->dri3Display = NULL;
#endif /* GLX_USE_DRM */
#if defined(GLX_USE_WINDOWSGL)
if (priv->windowsdriDisplay)
(*priv->windowsdriDisplay->destroyDisplay) (priv->windowsdriDisplay);
priv->windowsdriDisplay = NULL;
#endif /* GLX_USE_WINDOWSGL */
if (priv->driDisplay)
priv->driDisplay->destroyDisplay(priv->driDisplay);
priv->driDisplay = NULL;
#endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */
free((char *) priv);
@ -808,22 +791,8 @@ AllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv)
for (i = 0; i < screens; i++, psc++) {
psc = NULL;
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
#if defined(GLX_USE_DRM)
#if defined(HAVE_DRI3)
if (priv->dri3Display)
psc = (*priv->dri3Display->createScreen) (i, priv);
#endif /* HAVE_DRI3 */
if (psc == NULL && priv->dri2Display)
psc = (*priv->dri2Display->createScreen) (i, priv);
#endif /* GLX_USE_DRM */
#ifdef GLX_USE_WINDOWSGL
if (psc == NULL && priv->windowsdriDisplay)
psc = (*priv->windowsdriDisplay->createScreen) (i, priv);
#endif
if (psc == NULL && priv->driswDisplay)
psc = (*priv->driswDisplay->createScreen) (i, priv);
if (priv->driDisplay)
psc = priv->driDisplay->createScreen(i, priv);
#endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */
#if defined(GLX_USE_APPLEGL)
@ -918,14 +887,14 @@ __glXInitialize(Display * dpy)
if (glx_direct && glx_accel) {
#if defined(HAVE_DRI3)
if (!env_var_as_boolean("LIBGL_DRI3_DISABLE", false))
dpyPriv->dri3Display = dri3_create_display(dpy);
dpyPriv->driDisplay = dri3_create_display(dpy);
#endif /* HAVE_DRI3 */
if (!env_var_as_boolean("LIBGL_DRI2_DISABLE", false))
dpyPriv->dri2Display = dri2CreateDisplay(dpy);
dpyPriv->driDisplay = dri2CreateDisplay(dpy);
}
#endif /* GLX_USE_DRM */
if (glx_direct)
dpyPriv->driswDisplay = driswCreateDisplay(dpy);
if (glx_direct && !dpyPriv->driDisplay)
dpyPriv->driDisplay = driswCreateDisplay(dpy);
#endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */
#ifdef GLX_USE_APPLEGL
@ -936,8 +905,8 @@ __glXInitialize(Display * dpy)
#endif
#ifdef GLX_USE_WINDOWSGL
if (glx_direct && glx_accel)
dpyPriv->windowsdriDisplay = driwindowsCreateDisplay(dpy);
if (glx_direct && glx_accel && !dpyPriv->driDisplay)
dpyPriv->driDisplay = driwindowsCreateDisplay(dpy);
#endif
if (!AllocAndFetchScreenConfigs(dpy, dpyPriv)) {