summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/glx/x11/dri_glx.c37
-rw-r--r--src/glx/x11/glxclient.h5
-rw-r--r--src/glx/x11/glxcmds.c30
3 files changed, 43 insertions, 29 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.
diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h
index 99dbb597a68..6ac92cf850a 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 d194301dd7a..e8cb7b96f57 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