X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglx%2Fx11%2Fdri_glx.c;h=a6581465bc20c3479c40148e424d45e990bc8d1d;hb=fe23dc5ecae87de73f7b5a581868065a4c4ac09b;hp=2e883c62cb79a6c463b9ae22854a950c2ad4b9c7;hpb=20b9230ce1b96ca246850a8088caeffc3f391a0c;p=mesa.git diff --git a/src/glx/x11/dri_glx.c b/src/glx/x11/dri_glx.c index 2e883c62cb7..a6581465bc2 100644 --- a/src/glx/x11/dri_glx.c +++ b/src/glx/x11/dri_glx.c @@ -59,6 +59,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif typedef struct __GLXDRIdisplayPrivateRec __GLXDRIdisplayPrivate; +typedef struct __GLXDRIcontextPrivateRec __GLXDRIcontextPrivate; + struct __GLXDRIdisplayPrivateRec { __GLXDRIdisplay base; @@ -70,6 +72,12 @@ struct __GLXDRIdisplayPrivateRec { int driPatch; }; +struct __GLXDRIcontextPrivateRec { + __GLXDRIcontext base; + __DRIcontext driContext; + XID hwContextID; +}; + #ifndef DEFAULT_DRIVER_DIR /* this is normally defined in Mesa/configs/default with DRI_DRIVER_SEARCH_PATH */ #define DEFAULT_DRIVER_DIR "/usr/X11R6/lib/modules/dri" @@ -137,13 +145,15 @@ static void *OpenDriver(const char *driverName) /* Attempt to make sure libGL symbols will be visible to the driver */ glhandle = dlopen("libGL.so.1", RTLD_NOW | RTLD_GLOBAL); - libPaths = DEFAULT_DRIVER_DIR; + libPaths = NULL; if (geteuid() == getuid()) { /* don't allow setuid apps to use LIBGL_DRIVERS_PATH */ libPaths = getenv("LIBGL_DRIVERS_PATH"); if (!libPaths) libPaths = getenv("LIBGL_DRIVERS_DIR"); /* deprecated */ } + if (libPaths == NULL) + libPaths = DEFAULT_DRIVER_DIR; handle = NULL; for (p = libPaths; *p; p = next) { @@ -657,40 +667,79 @@ CallCreateNewScreen(Display *dpy, int scrn, __GLXscreenConfigs *psc, return psp; } +static void driDestroyContext(__GLXDRIcontext *context, + __GLXscreenConfigs *psc, Display *dpy) +{ + __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; + + (*pcp->driContext.destroyContext)(&pcp->driContext); + + XF86DRIDestroyContext(psc->dpy, psc->scr, pcp->hwContextID); +} -static void driCreateContext(__GLXscreenConfigs *psc, - const __GLcontextModes *mode, - GLXContext gc, - GLXContext shareList, int renderType) +static Bool driBindContext(__GLXDRIcontext *context, + __GLXDRIdrawable *draw, __GLXDRIdrawable *read) { + __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; + + return (*pcp->driContext.bindContext)(&pcp->driContext, + &draw->driDrawable, + &read->driDrawable); +} + +static void driUnbindContext(__GLXDRIcontext *context) +{ + __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; + + (*pcp->driContext.unbindContext)(&pcp->driContext); +} + +static __GLXDRIcontext *driCreateContext(__GLXscreenConfigs *psc, + const __GLcontextModes *mode, + GLXContext gc, + GLXContext shareList, int renderType) +{ + __GLXDRIcontextPrivate *pcp, *pcp_shared; drm_context_t hwContext; - __DRIcontext *shared; + __DRIcontext *shared = NULL; if (psc && psc->driScreen) { - shared = (shareList != NULL) ? &shareList->driContext : NULL; + if (shareList) { + pcp_shared = (__GLXDRIcontextPrivate *) shareList->driContext; + shared = &pcp_shared->driContext; + } + + pcp = Xmalloc(sizeof *pcp); + if (pcp == NULL) + return NULL; if (!XF86DRICreateContextWithConfig(psc->dpy, psc->scr, mode->visualID, - &gc->hwContextID, &hwContext)) - /* gah, handle this better */ - return; - - gc->driContext.private = - (*psc->__driScreen.createNewContext)( &psc->__driScreen, - mode, renderType, - shared, - hwContext, - &gc->driContext ); - if (gc->driContext.private) { - gc->isDirect = GL_TRUE; - gc->screen = mode->screen; - gc->psc = psc; - gc->mode = mode; + &pcp->hwContextID, &hwContext)) { + Xfree(pcp); + return NULL; } - else { - XF86DRIDestroyContext(psc->dpy, psc->scr, gc->hwContextID); + + pcp->driContext.private = + (*psc->__driScreen.createNewContext)(&psc->__driScreen, + mode, renderType, + shared, + hwContext, + &pcp->driContext); + if (pcp->driContext.private == NULL) { + XF86DRIDestroyContext(psc->dpy, psc->scr, pcp->hwContextID); + Xfree(pcp); + return NULL; } + + pcp->base.destroyContext = driDestroyContext; + pcp->base.bindContext = driBindContext; + pcp->base.unbindContext = driUnbindContext; + + return &pcp->base; } + + return NULL; } @@ -719,6 +768,7 @@ static __GLXDRIdrawable *driCreateDrawable(__GLXscreenConfigs *psc, &pdraw->driDrawable, hwDrawable, GLX_WINDOW_BIT, + 0, empty_attribute_list); if (!pdraw->driDrawable.private) { @@ -798,7 +848,7 @@ static void driDestroyDisplay(__GLXDRIdisplay *dpy) * This is called from __glXInitialize() when we are given a new * display pointer. */ -__GLXDRIdisplay *driCreateDisplay(Display *dpy) +_X_HIDDEN __GLXDRIdisplay *driCreateDisplay(Display *dpy) { __GLXDRIdisplayPrivate *pdpyp; int eventBase, errorBase; @@ -824,7 +874,7 @@ __GLXDRIdisplay *driCreateDisplay(Display *dpy) pdpyp->base.destroyDisplay = driDestroyDisplay; pdpyp->base.createScreen = driCreateScreen; - return (void *)pdpyp; + return &pdpyp->base; } #endif /* GLX_DIRECT_RENDERING */