As for createDrawable and destroyDrawable, these functions immediately upon entry to driCreateNewContext and immediately before exit from driDestroyContext. Instead of passing function pointers back and forth just obtain the drm_context_t prior to calling DRIscreen::createNewContext and pass it as a parameter. This change also lets us keep the DRI context XID in the libGL loader only.tags/mesa_7_1_rc1
| @@ -183,17 +183,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'. | |||
| @@ -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 | |||
| /** | |||
| @@ -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); | |||
| @@ -773,28 +773,6 @@ static void __glXReportDamage(__DRIdrawable *driDraw, | |||
| #endif | |||
| } | |||
| 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, | |||
| @@ -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; | |||
| } | |||
| } | |||
| @@ -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; | |||
| } | |||
| @@ -326,11 +326,6 @@ struct __DRIdrawablePrivateRec { | |||
| * Per-context private driver information. | |||
| */ | |||
| struct __DRIcontextPrivateRec { | |||
| /** | |||
| * Kernel context handle used to access the device lock. | |||
| */ | |||
| __DRIid contextID; | |||
| /** | |||
| * Kernel context handle used to access the device lock. | |||
| */ | |||