diff options
author | Michel Dänzer <michel@tungstengraphics.com> | 2006-10-15 17:03:13 +0200 |
---|---|---|
committer | Michel Dänzer <michel@tungstengraphics.com> | 2006-10-15 17:03:13 +0200 |
commit | 4edbfb9eb952f9b3f5f597749192c17baf15cdce (patch) | |
tree | 2471b8bfa1eaf9c0ed945066117a5a9f850eaea9 | |
parent | c9c2ac2b42398f5bfad909f3289e2545bb7b3888 (diff) |
radeon: Track screen damage all the time for page flipping.
This way we don't ever have to forcedly synchronize the pages so we hopefully
never clobber one page's contents when we shouldn't.
-rw-r--r-- | src/radeon_dri.c | 49 | ||||
-rw-r--r-- | src/radeon_driver.c | 10 |
2 files changed, 27 insertions, 32 deletions
diff --git a/src/radeon_dri.c b/src/radeon_dri.c index 4f39e5c7..be8e74f1 100644 --- a/src/radeon_dri.c +++ b/src/radeon_dri.c @@ -402,7 +402,24 @@ static void RADEONEnterServer(ScreenPtr pScreen) if (info->ChipFamily>=CHIP_FAMILY_R300) drmCommandNone(info->drmFD, DRM_RADEON_CP_IDLE); +#ifdef DAMAGE + if (!info->pDamage && info->allowPageFlip) { + PixmapPtr pPix = pScreen->GetScreenPixmap(pScreen); + info->pDamage = DamageCreate(NULL, NULL, DamageReportNone, TRUE, + pScreen, pPix); + + if (info->pDamage == NULL) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "No screen damage record, page flipping disabled\n"); + info->allowPageFlip = 0; + } else { + DamageRegister(&pPix->drawable, info->pDamage); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Damage tracking initialized for page flipping\n"); + } + } +#endif } /* Called when the X server goes to sleep to allow the X server's @@ -1890,30 +1907,9 @@ static void RADEONEnablePageFlip(ScreenPtr pScreen) RADEONInfoPtr info = RADEONPTR(pScrn); if (info->allowPageFlip) { - BoxRec box = { .x1 = 0, .y1 = 0, .x2 = pScrn->virtualX - 1, - .y2 = pScrn->virtualY - 1 }; RADEONSAREAPrivPtr pSAREAPriv = DRIGetSAREAPrivate(pScreen); - if (!info->pDamage) { - PixmapPtr pPix = pScreen->GetScreenPixmap(pScreen); - - /* Have damage run only while there is 3d active. - */ - info->pDamage = DamageCreate(NULL, NULL, DamageReportNone, TRUE, - pScreen, pPix); - - if (info->pDamage == NULL) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "No screen damage record, page flipping disabled\n"); - info->allowPageFlip = 0; - return; - } - - DamageRegister(&pPix->drawable, info->pDamage); - } - pSAREAPriv->pfAllowPageFlip = 1; - RADEONDRIRefreshArea(pScrn, 1, &box); } #endif } @@ -1925,17 +1921,6 @@ static void RADEONDisablePageFlip(ScreenPtr pScreen) * -- DRM needs to cope with Front-to-Back swapbuffers. */ RADEONSAREAPrivPtr pSAREAPriv = DRIGetSAREAPrivate(pScreen); -#ifdef DAMAGE - RADEONInfoPtr info = RADEONPTR(xf86Screens[pScreen->myNum]); - - if (info->pDamage) { - PixmapPtr pPix = pScreen->GetScreenPixmap(pScreen); - - DamageUnregister(&pPix->drawable, info->pDamage); - DamageDestroy(info->pDamage); - info->pDamage = NULL; - } -#endif pSAREAPriv->pfAllowPageFlip = 0; } diff --git a/src/radeon_driver.c b/src/radeon_driver.c index 07a93496..0a0d382a 100644 --- a/src/radeon_driver.c +++ b/src/radeon_driver.c @@ -7563,6 +7563,16 @@ static Bool RADEONCloseScreen(int scrnIndex, ScreenPtr pScreen) info->accelOn = FALSE; #ifdef XF86DRI +#ifdef DAMAGE + if (info->pDamage) { + PixmapPtr pPix = pScreen->GetScreenPixmap(pScreen); + + DamageUnregister(&pPix->drawable, info->pDamage); + DamageDestroy(info->pDamage); + info->pDamage = NULL; + } +#endif + RADEONDRIStop(pScreen); #endif |