diff options
-rw-r--r-- | src/glx/x11/dri_glx.c | 37 | ||||
-rw-r--r-- | src/glx/x11/glxclient.h | 5 | ||||
-rw-r--r-- | src/glx/x11/glxcmds.c | 30 |
3 files changed, 43 insertions, 29 deletions
diff --git a/src/glx/x11/dri_glx.c b/src/glx/x11/dri_glx.c index 194517a657..2b43a74e66 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. diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h index 99dbb597a6..6ac92cf850 100644 --- a/src/glx/x11/glxclient.h +++ b/src/glx/x11/glxclient.h @@ -438,6 +438,11 @@ struct __GLXscreenConfigsRec { void (*driDestroyScreen)(__GLXscreenConfigs *psc); + void (*driCreateContext)(__GLXscreenConfigs *psc, + const __GLcontextModes *mode, + GLXContext gc, + GLXContext shareList, int renderType); + #ifdef __DRI_COPY_SUB_BUFFER __DRIcopySubBufferExtension *copySubBuffer; #endif diff --git a/src/glx/x11/glxcmds.c b/src/glx/x11/glxcmds.c index d194301dd7..e8cb7b96f5 100644 --- a/src/glx/x11/glxcmds.c +++ b/src/glx/x11/glxcmds.c @@ -378,8 +378,6 @@ CreateContext(Display *dpy, XVisualInfo *vis, int screen = (fbconfig == NULL) ? vis->screen : fbconfig->screen; __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen); const __GLcontextModes * mode; - drm_context_t hwContext; - if (fbconfig == NULL) { mode = _gl_context_modes_find_visual(psc->visuals, vis->visualid); @@ -400,33 +398,7 @@ CreateContext(Display *dpy, XVisualInfo *vis, mode = fbconfig; } - if (psc && psc->driScreen.private) { - __DRIcontext *shared = (shareList != NULL) - ? &shareList->driContext : NULL; - - - if (!XF86DRICreateContextWithConfig(dpy, psc->scr, - mode->visualID, - &gc->hwContextID, &hwContext)) - /* gah, handle this better */ - return NULL; - - 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(dpy, psc->scr, gc->hwContextID); - } - } + psc->driCreateContext(psc, mode, gc, shareList, renderType); } #endif |