From 7b1ff326071658d5bd6e7feb2ad78d0e0209211d Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Mon, 16 Oct 2006 20:59:53 +0000 Subject: Track the currently bound read drawable and make sure its info is up to date. --- src/mesa/drivers/dri/common/dri_util.c | 10 +++++++++- src/mesa/drivers/dri/common/dri_util.h | 7 ++++++- 2 files changed, 15 insertions(+), 2 deletions(-) (limited to 'src/mesa/drivers/dri/common') diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index b5c20a066a..1ca2756e01 100644 --- a/src/mesa/drivers/dri/common/dri_util.c +++ b/src/mesa/drivers/dri/common/dri_util.c @@ -323,6 +323,7 @@ static GLboolean DoBindContext(__DRInativeDisplay *dpy, /* Bind the drawable to the context */ pcp->driDrawablePriv = pdp; + pcp->driReadablePriv = prp; pdp->driContextPriv = pcp; pdp->refcount++; if ( pdp != prp ) { @@ -339,6 +340,12 @@ static GLboolean DoBindContext(__DRInativeDisplay *dpy, 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 */ (*psp->DriverAPI.MakeCurrent)(pcp, pdp, prp); @@ -402,7 +409,8 @@ __driUtilUpdateDrawableInfo(__DRIdrawablePrivate *pdp) __DRIscreenPrivate *psp; __DRIcontextPrivate *pcp = pdp->driContextPriv; - if (!pcp || (pdp != pcp->driDrawablePriv)) { + if (!pcp + || ((pdp != pcp->driDrawablePriv) && (pdp != pcp->driReadablePriv))) { /* ERROR!!! */ return; } diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h index 14c24a0efa..885d5899e0 100644 --- a/src/mesa/drivers/dri/common/dri_util.h +++ b/src/mesa/drivers/dri/common/dri_util.h @@ -355,10 +355,15 @@ struct __DRIcontextPrivateRec { __DRInativeDisplay *display; /** - * Pointer to drawable currently bound to this context. + * Pointer to drawable currently bound to this context for drawing. */ __DRIdrawablePrivate *driDrawablePriv; + /** + * Pointer to drawable currently bound to this context for reading. + */ + __DRIdrawablePrivate *driReadablePriv; + /** * Pointer to screen on which this context was created. */ -- cgit v1.2.3