mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 06:50:11 +01:00
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:
parent
443b628e6f
commit
5766074894
4 changed files with 25 additions and 60 deletions
|
|
@ -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
|
/* If the server doesn't send invalidate events, we may miss a
|
||||||
* resize before the rendering starts. Invalidate the buffers now
|
* resize before the rendering starts. Invalidate the buffers now
|
||||||
* so the driver will recheck before rendering starts. */
|
* so the driver will recheck before rendering starts. */
|
||||||
pdp = (struct dri2_display *) dpyPriv->dri2Display;
|
pdp = (struct dri2_display *) dpyPriv->driDisplay;
|
||||||
if (!pdp->invalidateAvailable && pdraw) {
|
if (!pdp->invalidateAvailable && pdraw) {
|
||||||
dri2InvalidateBuffers(psc->base.dpy, pdraw->base.xDrawable);
|
dri2InvalidateBuffers(psc->base.dpy, pdraw->base.xDrawable);
|
||||||
if (pread != pdraw && pread)
|
if (pread != pdraw && pread)
|
||||||
|
|
@ -306,7 +306,7 @@ dri2DestroyDrawable(__GLXDRIdrawable *base)
|
||||||
struct dri2_screen *psc = (struct dri2_screen *) base->psc;
|
struct dri2_screen *psc = (struct dri2_screen *) base->psc;
|
||||||
struct dri2_drawable *pdraw = (struct dri2_drawable *) base;
|
struct dri2_drawable *pdraw = (struct dri2_drawable *) base;
|
||||||
struct glx_display *dpyPriv = psc->base.display;
|
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);
|
__glxHashDelete(pdp->dri2Hash, pdraw->base.xDrawable);
|
||||||
(*psc->core->destroyDrawable) (pdraw->driDrawable);
|
(*psc->core->destroyDrawable) (pdraw->driDrawable);
|
||||||
|
|
@ -368,7 +368,7 @@ dri2CreateDrawable(struct glx_screen *base, XID xDrawable,
|
||||||
}
|
}
|
||||||
|
|
||||||
DRI2CreateDrawable(psc->base.dpy, xDrawable);
|
DRI2CreateDrawable(psc->base.dpy, xDrawable);
|
||||||
pdp = (struct dri2_display *)dpyPriv->dri2Display;
|
pdp = (struct dri2_display *)dpyPriv->driDisplay;
|
||||||
/* Create a new drawable */
|
/* Create a new drawable */
|
||||||
pdraw->driDrawable =
|
pdraw->driDrawable =
|
||||||
(*psc->dri2->createNewDrawable) (psc->driScreen,
|
(*psc->dri2->createNewDrawable) (psc->driScreen,
|
||||||
|
|
@ -651,7 +651,7 @@ dri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate)
|
||||||
if (priv == NULL)
|
if (priv == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pdp = (struct dri2_display *) priv->dri2Display;
|
pdp = (struct dri2_display *) priv->driDisplay;
|
||||||
gc = __glXGetCurrentContext();
|
gc = __glXGetCurrentContext();
|
||||||
|
|
||||||
dri2Throttle(psc, pdraw, __DRI2_THROTTLE_FLUSHFRONT);
|
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 glx_display *dpyPriv = __glXInitialize(priv->base.psc->dpy);
|
||||||
struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc;
|
struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc;
|
||||||
struct dri2_display *pdp =
|
struct dri2_display *pdp =
|
||||||
(struct dri2_display *)dpyPriv->dri2Display;
|
(struct dri2_display *)dpyPriv->driDisplay;
|
||||||
int64_t ret = 0;
|
int64_t ret = 0;
|
||||||
|
|
||||||
/* Check we have the right attachments */
|
/* Check we have the right attachments */
|
||||||
|
|
@ -995,7 +995,7 @@ dri2_bind_tex_image(Display * dpy,
|
||||||
if (dpyPriv == NULL)
|
if (dpyPriv == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pdp = (struct dri2_display *) dpyPriv->dri2Display;
|
pdp = (struct dri2_display *) dpyPriv->driDisplay;
|
||||||
|
|
||||||
if (pdraw != NULL) {
|
if (pdraw != NULL) {
|
||||||
psc = (struct dri2_screen *) base->psc;
|
psc = (struct dri2_screen *) base->psc;
|
||||||
|
|
@ -1060,7 +1060,7 @@ dri2BindExtensions(struct dri2_screen *psc, struct glx_display * priv,
|
||||||
const char *driverName)
|
const char *driverName)
|
||||||
{
|
{
|
||||||
const struct dri2_display *const pdp = (struct dri2_display *)
|
const struct dri2_display *const pdp = (struct dri2_display *)
|
||||||
priv->dri2Display;
|
priv->driDisplay;
|
||||||
const __DRIextension **extensions;
|
const __DRIextension **extensions;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
@ -1181,7 +1181,7 @@ dri2CreateScreen(int screen, struct glx_display * priv)
|
||||||
const __DRIconfig **driver_configs;
|
const __DRIconfig **driver_configs;
|
||||||
const __DRIextension **extensions;
|
const __DRIextension **extensions;
|
||||||
const struct dri2_display *const pdp = (struct dri2_display *)
|
const struct dri2_display *const pdp = (struct dri2_display *)
|
||||||
priv->dri2Display;
|
priv->driDisplay;
|
||||||
struct dri2_screen *psc;
|
struct dri2_screen *psc;
|
||||||
__GLXDRIscreen *psp;
|
__GLXDRIscreen *psp;
|
||||||
struct glx_config *configs = NULL, *visuals = NULL;
|
struct glx_config *configs = NULL, *visuals = NULL;
|
||||||
|
|
@ -1376,7 +1376,7 @@ _X_HIDDEN __GLXDRIdrawable *
|
||||||
dri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id)
|
dri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id)
|
||||||
{
|
{
|
||||||
struct glx_display *d = __glXInitialize(dpy);
|
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;
|
__GLXDRIdrawable *pdraw;
|
||||||
|
|
||||||
if (__glxHashLookup(pdp->dri2Hash, id, (void *) &pdraw) == 0)
|
if (__glxHashLookup(pdp->dri2Hash, id, (void *) &pdraw) == 0)
|
||||||
|
|
|
||||||
|
|
@ -363,7 +363,7 @@ dri3_create_drawable(struct glx_screen *base, XID xDrawable,
|
||||||
bool has_multibuffer = false;
|
bool has_multibuffer = false;
|
||||||
#ifdef HAVE_DRI3_MODIFIERS
|
#ifdef HAVE_DRI3_MODIFIERS
|
||||||
const struct dri3_display *const pdp = (struct dri3_display *)
|
const struct dri3_display *const pdp = (struct dri3_display *)
|
||||||
base->display->dri3Display;
|
base->display->driDisplay;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pdraw = calloc(1, sizeof(*pdraw));
|
pdraw = calloc(1, sizeof(*pdraw));
|
||||||
|
|
@ -836,7 +836,7 @@ dri3_create_screen(int screen, struct glx_display * priv)
|
||||||
const __DRIconfig **driver_configs;
|
const __DRIconfig **driver_configs;
|
||||||
const __DRIextension **extensions;
|
const __DRIextension **extensions;
|
||||||
const struct dri3_display *const pdp = (struct dri3_display *)
|
const struct dri3_display *const pdp = (struct dri3_display *)
|
||||||
priv->dri3Display;
|
priv->driDisplay;
|
||||||
struct dri3_screen *psc;
|
struct dri3_screen *psc;
|
||||||
__GLXDRIscreen *psp;
|
__GLXDRIscreen *psp;
|
||||||
struct glx_config *configs = NULL, *visuals = NULL;
|
struct glx_config *configs = NULL, *visuals = NULL;
|
||||||
|
|
|
||||||
|
|
@ -602,16 +602,12 @@ struct glx_display
|
||||||
|
|
||||||
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
|
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
|
||||||
__glxHashTable *drawHash;
|
__glxHashTable *drawHash;
|
||||||
|
#endif
|
||||||
|
#if defined(GLX_DIRECT_RENDERING) || defined(GLX_USE_WINDOWSGL)
|
||||||
/**
|
/**
|
||||||
* Per display direct rendering interface functions and data.
|
* Per display direct rendering interface functions and data.
|
||||||
*/
|
*/
|
||||||
__GLXDRIdisplay *driswDisplay;
|
__GLXDRIdisplay *driDisplay;
|
||||||
__GLXDRIdisplay *dri2Display;
|
|
||||||
__GLXDRIdisplay *dri3Display;
|
|
||||||
#endif
|
|
||||||
#ifdef GLX_USE_WINDOWSGL
|
|
||||||
__GLXDRIdisplay *windowsdriDisplay;
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -256,26 +256,9 @@ glx_display_free(struct glx_display *priv)
|
||||||
__glxHashDestroy(priv->drawHash);
|
__glxHashDestroy(priv->drawHash);
|
||||||
|
|
||||||
/* Free the direct rendering per display data */
|
/* Free the direct rendering per display data */
|
||||||
if (priv->driswDisplay)
|
if (priv->driDisplay)
|
||||||
(*priv->driswDisplay->destroyDisplay) (priv->driswDisplay);
|
priv->driDisplay->destroyDisplay(priv->driDisplay);
|
||||||
priv->driswDisplay = NULL;
|
priv->driDisplay = 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 */
|
|
||||||
|
|
||||||
#endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */
|
#endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */
|
||||||
|
|
||||||
free((char *) priv);
|
free((char *) priv);
|
||||||
|
|
@ -808,22 +791,8 @@ AllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv)
|
||||||
for (i = 0; i < screens; i++, psc++) {
|
for (i = 0; i < screens; i++, psc++) {
|
||||||
psc = NULL;
|
psc = NULL;
|
||||||
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
|
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
|
||||||
#if defined(GLX_USE_DRM)
|
if (priv->driDisplay)
|
||||||
#if defined(HAVE_DRI3)
|
psc = priv->driDisplay->createScreen(i, priv);
|
||||||
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);
|
|
||||||
#endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */
|
#endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */
|
||||||
|
|
||||||
#if defined(GLX_USE_APPLEGL)
|
#if defined(GLX_USE_APPLEGL)
|
||||||
|
|
@ -918,14 +887,14 @@ __glXInitialize(Display * dpy)
|
||||||
if (glx_direct && glx_accel) {
|
if (glx_direct && glx_accel) {
|
||||||
#if defined(HAVE_DRI3)
|
#if defined(HAVE_DRI3)
|
||||||
if (!env_var_as_boolean("LIBGL_DRI3_DISABLE", false))
|
if (!env_var_as_boolean("LIBGL_DRI3_DISABLE", false))
|
||||||
dpyPriv->dri3Display = dri3_create_display(dpy);
|
dpyPriv->driDisplay = dri3_create_display(dpy);
|
||||||
#endif /* HAVE_DRI3 */
|
#endif /* HAVE_DRI3 */
|
||||||
if (!env_var_as_boolean("LIBGL_DRI2_DISABLE", false))
|
if (!env_var_as_boolean("LIBGL_DRI2_DISABLE", false))
|
||||||
dpyPriv->dri2Display = dri2CreateDisplay(dpy);
|
dpyPriv->driDisplay = dri2CreateDisplay(dpy);
|
||||||
}
|
}
|
||||||
#endif /* GLX_USE_DRM */
|
#endif /* GLX_USE_DRM */
|
||||||
if (glx_direct)
|
if (glx_direct && !dpyPriv->driDisplay)
|
||||||
dpyPriv->driswDisplay = driswCreateDisplay(dpy);
|
dpyPriv->driDisplay = driswCreateDisplay(dpy);
|
||||||
#endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */
|
#endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */
|
||||||
|
|
||||||
#ifdef GLX_USE_APPLEGL
|
#ifdef GLX_USE_APPLEGL
|
||||||
|
|
@ -936,8 +905,8 @@ __glXInitialize(Display * dpy)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef GLX_USE_WINDOWSGL
|
#ifdef GLX_USE_WINDOWSGL
|
||||||
if (glx_direct && glx_accel)
|
if (glx_direct && glx_accel && !dpyPriv->driDisplay)
|
||||||
dpyPriv->windowsdriDisplay = driwindowsCreateDisplay(dpy);
|
dpyPriv->driDisplay = driwindowsCreateDisplay(dpy);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!AllocAndFetchScreenConfigs(dpy, dpyPriv)) {
|
if (!AllocAndFetchScreenConfigs(dpy, dpyPriv)) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue