summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/GL/internal/dri_interface.h14
-rw-r--r--src/glx/x11/glxclient.h5
-rw-r--r--src/glx/x11/glxcmds.c14
-rw-r--r--src/glx/x11/glxext.c28
-rw-r--r--src/mesa/drivers/dri/common/dri_util.c14
-rw-r--r--src/mesa/drivers/dri/common/dri_util.h5
6 files changed, 27 insertions, 53 deletions
diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index 0f90f49507..98271ad0af 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -184,17 +184,6 @@ struct __DRIinterfaceMethodsRec {
/*@{*/
/**
- * Create the server-side portion of the GL context.
- */
- GLboolean (* createContext)( __DRIscreen *screen,
- int configID, void * contextID, drm_context_t * hw_context );
-
- /**
- * Destroy the server-side portion of the GL context.
- */
- GLboolean (* destroyContext)( __DRIscreen *screen, __DRIid context );
-
- /**
* This function is used to get information about the position, size, and
* clip rects of a drawable.
*/
@@ -345,7 +334,8 @@ struct __DRIscreenRec {
void * (*createNewContext)(__DRIscreen *screen,
const __GLcontextModes *modes,
int render_type,
- void *sharedPrivate, __DRIcontext *pctx);
+ void *sharedPrivate,
+ drm_context_t hwContext, __DRIcontext *pctx);
/**
* Method to override base texture image with a driver specific 'offset'.
diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h
index 7ed4549658..5697325175 100644
--- a/src/glx/x11/glxclient.h
+++ b/src/glx/x11/glxclient.h
@@ -361,6 +361,11 @@ struct __GLXcontextRec {
* Pointer to the mode used to create this context.
*/
const __GLcontextModes * mode;
+
+ /**
+ * XID for the server side drm_context_t
+ */
+ XID hwContextID;
#endif
/**
diff --git a/src/glx/x11/glxcmds.c b/src/glx/x11/glxcmds.c
index 229da5a584..b6c0c763e3 100644
--- a/src/glx/x11/glxcmds.c
+++ b/src/glx/x11/glxcmds.c
@@ -382,6 +382,7 @@ 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;
/* The value of fbconfig cannot change because it is tested
* later in the function.
@@ -402,10 +403,19 @@ CreateContext(Display *dpy, XVisualInfo *vis,
if (psc && psc->driScreen.private) {
void * const shared = (shareList != NULL)
? shareList->driContext.private : NULL;
+
+
+ if (!XF86DRICreateContextWithConfig(dpy, psc->scr,
+ mode->fbconfigID,
+ &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;
@@ -415,6 +425,9 @@ CreateContext(Display *dpy, XVisualInfo *vis,
gc->fbconfigID = mode->fbconfigID;
gc->mode = mode;
}
+ else {
+ XF86DRIDestroyContext(dpy, psc->scr, gc->hwContextID);
+ }
}
}
#endif
@@ -524,6 +537,7 @@ DestroyContext(Display *dpy, GLXContext gc)
if (gc->isDirect) {
if (gc->driContext.private) {
(*gc->driContext.destroyContext)(gc->driContext.private);
+ XF86DRIDestroyContext(dpy, gc->psc->scr, gc->hwContextID);
gc->driContext.private = NULL;
}
GarbageCollectDRIDrawables(dpy, gc->screen);
diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c
index dce01d5528..85c990d4fc 100644
--- a/src/glx/x11/glxext.c
+++ b/src/glx/x11/glxext.c
@@ -774,28 +774,6 @@ static void __glXReportDamage(__DRIdrawable *driDraw,
}
static GLboolean
-__glXDRICreateContext(__DRIscreen *screen, int configID,
- void *pid, drm_context_t *hHWContext)
-{
- __GLXscreenConfigs *psc =
- containerOf(screen, __GLXscreenConfigs, driScreen);
- Display *dpy = psc->dpy;
-
- return XF86DRICreateContextWithConfig(dpy, psc->scr,
- configID, pid, hHWContext);
-}
-
-static GLboolean
-__glXDRIDestroyContext(__DRIscreen *screen, __DRIid context_id)
-{
- __GLXscreenConfigs *psc =
- containerOf(screen, __GLXscreenConfigs, driScreen);
- Display *dpy = psc->dpy;
-
- return XF86DRIDestroyContext(dpy, psc->scr, context_id);
-}
-
-static GLboolean
__glXDRIGetDrawableInfo(__DRIdrawable *drawable,
unsigned int *index, unsigned int *stamp,
int *X, int *Y, int *W, int *H,
@@ -824,9 +802,6 @@ static const __DRIinterfaceMethods interface_methods = {
_gl_context_modes_create,
_gl_context_modes_destroy,
-
- __glXDRICreateContext,
- __glXDRIDestroyContext,
__glXDRIGetDrawableInfo,
@@ -1816,6 +1791,9 @@ USED static Bool MakeContextCurrent(Display *dpy, GLXDrawable draw,
if (oldGC->driContext.private) {
(*oldGC->driContext.destroyContext)
(oldGC->driContext.private);
+ XF86DRIDestroyContext(oldGC->createDpy,
+ oldGC->psc->scr,
+ gc->hwContextID);
oldGC->driContext.private = NULL;
}
}
diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
index dd7068ad10..31438b8271 100644
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -552,8 +552,6 @@ driDestroyContext(void *contextPrivate)
if (pcp) {
(*pcp->driScreenPriv->DriverAPI.DestroyContext)(pcp);
- (void) (*dri_interface->destroyContext)(pcp->driScreenPriv->psc,
- pcp->contextID);
_mesa_free(pcp);
}
}
@@ -582,7 +580,8 @@ driDestroyContext(void *contextPrivate)
*/
static void *
driCreateNewContext(__DRIscreen *screen, const __GLcontextModes *modes,
- int render_type, void *sharedPrivate, __DRIcontext *pctx)
+ int render_type, void *sharedPrivate,
+ drm_context_t hwContext, __DRIcontext *pctx)
{
__DRIcontextPrivate *pcp;
__DRIcontextPrivate *pshare = (__DRIcontextPrivate *) sharedPrivate;
@@ -596,12 +595,7 @@ driCreateNewContext(__DRIscreen *screen, const __GLcontextModes *modes,
return NULL;
}
- if (! (*dri_interface->createContext)(screen, modes->fbconfigID,
- &pcp->contextID, &pcp->hHWContext)) {
- _mesa_free(pcp);
- return NULL;
- }
-
+ pcp->hHWContext = hwContext;
pcp->driScreenPriv = psp;
pcp->driDrawablePriv = NULL;
@@ -610,7 +604,6 @@ driCreateNewContext(__DRIscreen *screen, const __GLcontextModes *modes,
*/
if (!psp->dummyContextPriv.driScreenPriv) {
- psp->dummyContextPriv.contextID = 0;
psp->dummyContextPriv.hHWContext = psp->pSAREA->dummy_context;
psp->dummyContextPriv.driScreenPriv = psp;
psp->dummyContextPriv.driDrawablePriv = NULL;
@@ -623,7 +616,6 @@ driCreateNewContext(__DRIscreen *screen, const __GLcontextModes *modes,
pctx->unbindContext = driUnbindContext;
if ( !(*psp->DriverAPI.CreateContext)(modes, pcp, shareCtx) ) {
- (void) (*dri_interface->destroyContext)(screen, pcp->contextID);
_mesa_free(pcp);
return NULL;
}
diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h
index cb9bb26051..612e24acb2 100644
--- a/src/mesa/drivers/dri/common/dri_util.h
+++ b/src/mesa/drivers/dri/common/dri_util.h
@@ -329,11 +329,6 @@ struct __DRIcontextPrivateRec {
/**
* Kernel context handle used to access the device lock.
*/
- __DRIid contextID;
-
- /**
- * Kernel context handle used to access the device lock.
- */
drm_context_t hHWContext;
/**