Track the currently bound read drawable and make sure its info is up

to date.
This commit is contained in:
Ian Romanick
2006-10-16 20:59:53 +00:00
parent 8c5ae80916
commit 7b1ff32607
2 changed files with 15 additions and 2 deletions

View File

@@ -323,6 +323,7 @@ static GLboolean DoBindContext(__DRInativeDisplay *dpy,
/* Bind the drawable to the context */ /* Bind the drawable to the context */
pcp->driDrawablePriv = pdp; pcp->driDrawablePriv = pdp;
pcp->driReadablePriv = prp;
pdp->driContextPriv = pcp; pdp->driContextPriv = pcp;
pdp->refcount++; pdp->refcount++;
if ( pdp != prp ) { if ( pdp != prp ) {
@@ -339,6 +340,12 @@ static GLboolean DoBindContext(__DRInativeDisplay *dpy,
DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);
} }
if ((pdp != prp) && (!pdp->pStamp || *pdp->pStamp != pdp->lastStamp)) {
DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);
__driUtilUpdateDrawableInfo(prp);
DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);
}
/* Call device-specific MakeCurrent */ /* Call device-specific MakeCurrent */
(*psp->DriverAPI.MakeCurrent)(pcp, pdp, prp); (*psp->DriverAPI.MakeCurrent)(pcp, pdp, prp);
@@ -402,7 +409,8 @@ __driUtilUpdateDrawableInfo(__DRIdrawablePrivate *pdp)
__DRIscreenPrivate *psp; __DRIscreenPrivate *psp;
__DRIcontextPrivate *pcp = pdp->driContextPriv; __DRIcontextPrivate *pcp = pdp->driContextPriv;
if (!pcp || (pdp != pcp->driDrawablePriv)) { if (!pcp
|| ((pdp != pcp->driDrawablePriv) && (pdp != pcp->driReadablePriv))) {
/* ERROR!!! */ /* ERROR!!! */
return; return;
} }

View File

@@ -355,10 +355,15 @@ struct __DRIcontextPrivateRec {
__DRInativeDisplay *display; __DRInativeDisplay *display;
/** /**
* Pointer to drawable currently bound to this context. * Pointer to drawable currently bound to this context for drawing.
*/ */
__DRIdrawablePrivate *driDrawablePriv; __DRIdrawablePrivate *driDrawablePriv;
/**
* Pointer to drawable currently bound to this context for reading.
*/
__DRIdrawablePrivate *driReadablePriv;
/** /**
* Pointer to screen on which this context was created. * Pointer to screen on which this context was created.
*/ */