Track number of visible DRI windows separately for transitions.

This allows e.g. doing page flipping with multiple DRI windows as long as
only one of them is visible.
This commit is contained in:
Michel Dänzer 2007-02-02 18:27:40 +01:00
commit eedf148e5a
2 changed files with 58 additions and 24 deletions

View file

@ -204,6 +204,7 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
pDRIPriv->directRenderingSupport = TRUE;
pDRIPriv->pDriverInfo = pDRIInfo;
pDRIPriv->nrWindows = 0;
pDRIPriv->nrWindowsVisible = 0;
pDRIPriv->fullscreen = NULL;
pDRIPriv->createDummyCtx = pDRIInfo->createDummyCtx;
@ -1006,6 +1007,40 @@ DRITransitionTo2d(ScreenPtr pScreen)
}
static void
DRIIncreaseNumberVisible(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
switch (++pDRIPriv->nrWindowsVisible) {
case 1:
DRITransitionTo3d( pScreen );
break;
case 2:
DRITransitionToSharedBuffers( pScreen );
break;
default:
break;
}
}
static void
DRIDecreaseNumberVisible(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
switch (--pDRIPriv->nrWindowsVisible) {
case 0:
DRITransitionTo2d( pScreen );
break;
case 1:
DRITransitionToPrivateBuffers( pScreen );
break;
default:
break;
}
}
Bool
DRICreateDrawable(ScreenPtr pScreen, Drawable id,
DrawablePtr pDrawable, drm_drawable_t * hHWDrawable)
@ -1040,21 +1075,16 @@ DRICreateDrawable(ScreenPtr pScreen, Drawable id,
pDRIDrawablePriv->pScreen = pScreen;
pDRIDrawablePriv->refCount = 1;
pDRIDrawablePriv->drawableIndex = -1;
pDRIDrawablePriv->nrects = REGION_NUM_RECTS(&pWin->clipList);
/* save private off of preallocated index */
pWin->devPrivates[DRIWindowPrivIndex].ptr =
(pointer)pDRIDrawablePriv;
switch (++pDRIPriv->nrWindows) {
case 1:
DRITransitionTo3d( pScreen );
break;
case 2:
DRITransitionToSharedBuffers( pScreen );
break;
default:
break;
}
if (pDRIDrawablePriv->nrects)
DRIIncreaseNumberVisible(pScreen);
pDRIPriv->nrWindows++;
/* track this in case this window is destroyed */
AddResource(id, DRIDrawablePrivResType, (pointer)pWin);
@ -1126,19 +1156,14 @@ DRIDrawablePrivDelete(pointer pResource, XID id)
pDRIDrawablePriv->hwDrawable)) {
return FALSE;
}
if (pDRIDrawablePriv->nrects)
DRIDecreaseNumberVisible(pDrawable->pScreen);
xfree(pDRIDrawablePriv);
pWin->devPrivates[DRIWindowPrivIndex].ptr = NULL;
switch (--pDRIPriv->nrWindows) {
case 0:
DRITransitionTo2d( pDrawable->pScreen );
break;
case 1:
DRITransitionToPrivateBuffers( pDrawable->pScreen );
break;
default:
break;
}
pDRIPriv->nrWindows--;
}
else { /* pixmap (or for GLX 1.3, a PBuffer) */
/* NOT_DONE */
@ -1276,7 +1301,7 @@ DRIGetDrawableInfo(ScreenPtr pScreen,
*backX = *X;
*backY = *Y;
if (pDRIPriv->nrWindows == 1 && *numClipRects) {
if (pDRIPriv->nrWindowsVisible == 1 && *numClipRects) {
/* Use a single cliprect. */
int x0 = *X;
@ -1652,7 +1677,7 @@ DRICopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
if(!pDRIPriv) return;
if(pDRIPriv->nrWindows > 0) {
if(pDRIPriv->nrWindowsVisible > 0) {
RegionRec reg;
REGION_NULL(pScreen, &reg);
@ -1844,19 +1869,26 @@ DRIClipNotify(WindowPtr pWin, int dx, int dy)
if(!pDRIPriv) return;
if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
int nrects = REGION_NUM_RECTS(&pWin->clipList);
if(!pDRIPriv->windowsTouched) {
DRILockTree(pScreen);
pDRIPriv->windowsTouched = TRUE;
}
if (nrects && !pDRIDrawablePriv->nrects)
DRIIncreaseNumberVisible(pScreen);
else if (!nrects && pDRIDrawablePriv->nrects)
DRIDecreaseNumberVisible(pScreen);
pDRIDrawablePriv->nrects = nrects;
pDRIPriv->pSAREA->drawableTable[pDRIDrawablePriv->drawableIndex].stamp
= DRIDrawableValidationStamp++;
drmUpdateDrawableInfo(pDRIPriv->drmFD, pDRIDrawablePriv->hwDrawable,
DRM_DRAWABLE_CLIPRECTS,
REGION_NUM_RECTS(&pWin->clipList),
REGION_RECTS(&pWin->clipList));
nrects, REGION_RECTS(&pWin->clipList));
}
/* call lower wrapped functions */