diff options
Diffstat (limited to 'src/glx/x11/dri_glx.c')
-rw-r--r-- | src/glx/x11/dri_glx.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/glx/x11/dri_glx.c b/src/glx/x11/dri_glx.c index 194517a6577..2b43a74e66a 100644 --- a/src/glx/x11/dri_glx.c +++ b/src/glx/x11/dri_glx.c @@ -657,6 +657,42 @@ CallCreateNewScreen(Display *dpy, int scrn, __GLXscreenConfigs *psc, return psp; } + +static void driCreateContext(__GLXscreenConfigs *psc, + const __GLcontextModes *mode, + GLXContext gc, + GLXContext shareList, int renderType) +{ + drm_context_t hwContext; + __DRIcontext *shared; + + if (psc && psc->driScreen.private) { + shared = (shareList != NULL) ? &shareList->driContext : 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; + } + else { + XF86DRIDestroyContext(psc->dpy, psc->scr, gc->hwContextID); + } + } +} + static void driDestroyScreen(__GLXscreenConfigs *psc) { /* Free the direct rendering per screen data */ @@ -698,6 +734,7 @@ static void driCreateScreen(__GLXscreenConfigs *psc, int screen, __glXScrEnableDRIExtension(psc); psc->driDestroyScreen = driDestroyScreen; + psc->driCreateContext = driCreateContext; } /* Called from __glXFreeDisplayPrivate. |