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
parent 8a42af6a93
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 */

View File

@ -53,6 +53,7 @@ typedef struct _DRIDrawablePrivRec
int drawableIndex;
ScreenPtr pScreen;
int refCount;
int nrects;
} DRIDrawablePrivRec, *DRIDrawablePrivPtr;
struct _DRIContextPrivRec
@ -87,6 +88,7 @@ typedef struct _DRIScreenPrivRec
void** partial3DContextStore; /* parital 3D context */
DRIInfoPtr pDriverInfo;
int nrWindows;
int nrWindowsVisible;
drm_clip_rect_t private_buffer_rect; /* management of private buffers */
DrawablePtr fullscreen; /* pointer to fullscreen drawable */
drm_clip_rect_t fullscreen_rect; /* fake rect for fullscreen mode */