diff options
author | Dave Airlie <airlied@redhat.com> | 2011-08-11 16:27:01 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-08-11 16:27:01 +0100 |
commit | d3a71b98eea41ff254c835a1f4a055cc155c8ce1 (patch) | |
tree | a6d71307d4ee206d5e3ec310a22378824a471191 | |
parent | d06d7c0e7e12fb216f5b98be959ac1a94aa92c80 (diff) |
drv: get ephyr back to rendering by fixing damage
-rw-r--r-- | drv/drv_damage.c | 10 | ||||
-rw-r--r-- | drv/drv_damage.h | 1 | ||||
-rw-r--r-- | drv/drv_screen.c | 14 | ||||
-rw-r--r-- | drv/drv_screenint.h | 3 | ||||
-rw-r--r-- | drv/drv_scrnintstr.h | 5 | ||||
-rw-r--r-- | drv/fb/drvfb.h | 2 | ||||
-rw-r--r-- | drv/impedscrn.c | 27 | ||||
-rw-r--r-- | hw/kdrive/ephyr/ephyr.c | 46 | ||||
-rw-r--r-- | hw/kdrive/ephyr/ephyr.h | 4 |
9 files changed, 83 insertions, 29 deletions
diff --git a/drv/drv_damage.c b/drv/drv_damage.c index e8ab27980..b7f6fad4d 100644 --- a/drv/drv_damage.c +++ b/drv/drv_damage.c @@ -12,7 +12,7 @@ #include "damagestr.h" #include "drv_damage.h" #include "drv_damagestr.h" - +#include "drv_scrnintstr.h" #include "drv_pixmapstr.h" #include "drv_types.h" @@ -46,7 +46,7 @@ DrvDamageCreate (DrvDamageReportFunc damageReport, */ pDamage->pParent = DamageCreate(drv_damage_report, NULL, damageLevel, - isInternal, pScreen, pDamage); + isInternal, pScreen->pScreen, pDamage); return pDamage; } @@ -100,6 +100,12 @@ DrvDamageRegion (DrvDamagePtr pDamage) } void +DrvDamageEmpty (DrvDamagePtr pDamage) +{ + DamageEmpty(pDamage->pParent); +} + +void DrvDamageRegionProcessPending (DrvPixmapPtr pPixmap) { if (pPixmap->protoPixmap) diff --git a/drv/drv_damage.h b/drv/drv_damage.h index b8f043b5b..4f52e477b 100644 --- a/drv/drv_damage.h +++ b/drv/drv_damage.h @@ -22,6 +22,7 @@ DrvDamageCreate (DrvDamageReportFunc damageReport, extern _X_EXPORT RegionPtr DrvDamagePendingRegion (DrvDamagePtr pDamage); extern _X_EXPORT RegionPtr DrvDamageRegion (DrvDamagePtr pDamage); +extern _X_EXPORT void DrvDamageEmpty (DrvDamagePtr pDamage); extern _X_EXPORT void DrvDamageSetReportAfterOp (DrvDamagePtr pDamage, Bool reportAfter); diff --git a/drv/drv_screen.c b/drv/drv_screen.c index ec236991b..739047a1d 100644 --- a/drv/drv_screen.c +++ b/drv/drv_screen.c @@ -4,6 +4,18 @@ Bool drvScreenInit(DrvScreenPtr pDrvScreen) { pDrvScreen->ModifyPixmapHeader = drvModifyPixmapHeader; + pDrvScreen->SetScreenPixmap = drvSetScreenPixmap; } - +void +drvSetScreenPixmap(DrvScreenPtr pDrvScreen, DrvPixmapPtr drvPixmap) +{ + pDrvScreen->screenPixmap = drvPixmap; +} + +Bool +drvCreateScreenResources(DrvScreenPtr pDrvScreen) +{ + + +} diff --git a/drv/drv_screenint.h b/drv/drv_screenint.h index 9afbf4933..489496f8a 100644 --- a/drv/drv_screenint.h +++ b/drv/drv_screenint.h @@ -6,4 +6,7 @@ DrvScreenPtr DrvScreenAllocate(void); Bool drvScreenInit(DrvScreenPtr pDrvScreen); + +void +drvSetScreenPixmap(DrvScreenPtr pDrvScreen, DrvPixmapPtr drvPixmap); #endif diff --git a/drv/drv_scrnintstr.h b/drv/drv_scrnintstr.h index 57067cc31..266614208 100644 --- a/drv/drv_scrnintstr.h +++ b/drv/drv_scrnintstr.h @@ -10,6 +10,8 @@ #include "list.h" +typedef void (* DrvSetScreenPixmapProcPtr)(DrvScreenPtr pScreen, DrvPixmapPtr /*pPix*/); + typedef void (* DrvQueryBestSizeProcPtr)( int /*class*/, unsigned short * /*pwidth*/, @@ -124,6 +126,8 @@ typedef struct _DrvScreen DrvStoreColorsProcPtr StoreColors; ResolveColorProcPtr ResolveColor; + + DrvSetScreenPixmapProcPtr SetScreenPixmap; pointer blockData; pointer wakeupData; @@ -139,6 +143,7 @@ typedef struct _DrvScreen VisualPtr visuals; struct list imped_list; /* list to keep track of all drv screens for private mangling */ + DrvPixmapPtr *screenPixmap; } DrvScreenRec; #endif diff --git a/drv/fb/drvfb.h b/drv/fb/drvfb.h index 601486cba..60cf4f35d 100644 --- a/drv/fb/drvfb.h +++ b/drv/fb/drvfb.h @@ -656,7 +656,7 @@ typedef struct { #define fbGetFreeCompClip(pGC) ((pGC)->freeCompClip) #define fbGetRotatedPixmap(pGC) ((pGC)->pRotatedPixmap) -#define fbGetScreenPixmap(s) ((DrvPixmapPtr) (s)->devPrivate) +#define fbGetScreenPixmap(s) ((DrvPixmapPtr) (s)->screenPixmap) #ifdef ROOTLESS #define __fbPixDrawableX(pPix) ((pPix)->x) diff --git a/drv/impedscrn.c b/drv/impedscrn.c index ce3f02cf5..b3fb3fdef 100644 --- a/drv/impedscrn.c +++ b/drv/impedscrn.c @@ -70,6 +70,32 @@ impedAllocatePrivates(ScreenPtr pScreen, DevPrivateKey *pGCKey) return TRUE; } +Bool +impedCreateScreenResources(ScreenPtr pScreen) +{ + impedScreenPrivPtr imped_screen = impedGetScreen(pScreen); + PixmapPtr pPixmap; + impedPixmapPrivPtr imped_pixmap; + Bool ret; + int i; + + ret = miCreateScreenResources(pScreen); + if (!ret) + return ret; + + pPixmap = pScreen->GetScreenPixmap(pScreen); + imped_pixmap = impedGetPixmap(pPixmap); + + for (i = 0; i < imped_screen->gpu[i]; i++) { + (imped_screen->gpu[i]->SetScreenPixmap)(imped_screen->gpu[i], imped_pixmap->gpu[i]); + } + + for (i = 0; i < imped_screen->gpu[i]; i++) { + (imped_screen->gpu[i]->CreateScreenResources)(imped_screen->gpu[i]); + } + return TRUE; +} + static Bool impedCreateWindow(WindowPtr pWin) { @@ -424,6 +450,7 @@ Bool impedFinishScreenInit(ScreenPtr pScreen, return FALSE; pScreen->ModifyPixmapHeader = impedModifyPixmapHeader; + pScreen->CreateScreenResources = impedCreateScreenResources; } void diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c index 599b1f90d..b369fc542 100644 --- a/hw/kdrive/ephyr/ephyr.c +++ b/hw/kdrive/ephyr/ephyr.c @@ -350,7 +350,7 @@ ephyrInternalDamageRedisplay (DrvScreenPtr pScreen) if (!scrpriv || !scrpriv->pDamage) return; - pRegion = DamageRegion (scrpriv->pDamage); + pRegion = DrvDamageRegion (scrpriv->pDamage); if (RegionNotEmpty(pRegion)) { @@ -369,7 +369,7 @@ ephyrInternalDamageRedisplay (DrvScreenPtr pScreen) pbox->y2 - pbox->y1); pbox++; } - DamageEmpty (scrpriv->pDamage); + DrvDamageEmpty (scrpriv->pDamage); } } @@ -378,7 +378,7 @@ ephyrInternalDamageBlockHandler (pointer data, OSTimePtr pTimeout, pointer pRead) { - ScreenPtr pScreen = (ScreenPtr) data; + DrvScreenPtr pScreen = (DrvScreenPtr) data; ephyrInternalDamageRedisplay (pScreen); } @@ -389,21 +389,20 @@ ephyrInternalDamageWakeupHandler (pointer data, int i, pointer LastSelectMask) /* FIXME: Not needed ? */ } -#if 0 Bool ephyrSetInternalDamage (DrvScreenPtr pScreen) { KdScreenPriv(pScreen); - KdScreenInfo *screen = pScreenPriv->screen; + KdDrvScreenInfo *screen = pScreenPriv->screen; EphyrScrPriv *scrpriv = screen->driver; - PixmapPtr pPixmap = NULL; + DrvPixmapPtr pPixmap = NULL; - scrpriv->pDamage = DamageCreate ((DamageReportFunc) 0, - (DamageDestroyFunc) 0, - DamageReportNone, - TRUE, - pScreen, - pScreen); + scrpriv->pDamage = DrvDamageCreate ((DrvDamageReportFunc) 0, + (DrvDamageDestroyFunc) 0, + DamageReportNone, + TRUE, + pScreen, + pScreen); if (!RegisterBlockAndWakeupHandlers (ephyrInternalDamageBlockHandler, ephyrInternalDamageWakeupHandler, @@ -411,8 +410,8 @@ ephyrSetInternalDamage (DrvScreenPtr pScreen) return FALSE; // pPixmap = (*pScreen->GetScreenPixmap) (pScreen); - - DamageRegister (&pPixmap->drawable, scrpriv->pDamage); + pPixmap = fbGetScreenPixmap(pScreen); + DrvDamageRegister (pPixmap, scrpriv->pDamage); return TRUE; } @@ -423,17 +422,18 @@ ephyrUnsetInternalDamage (DrvScreenPtr pScreen) KdScreenPriv(pScreen); KdDrvScreenInfo *screen = pScreenPriv->screen; EphyrScrPriv *scrpriv = screen->driver; - PixmapPtr pPixmap = NULL; + DrvPixmapPtr pPixmap = NULL; - pPixmap = (*pScreen->GetScreenPixmap) (pScreen); - DamageUnregister (&pPixmap->drawable, scrpriv->pDamage); - DamageDestroy (scrpriv->pDamage); + pPixmap = fbGetScreenPixmap(pScreen); + // pPixmap = (*pScreen->GetScreenPixmap) (pScreen); + DrvDamageUnregister (pPixmap, scrpriv->pDamage); + DrvDamageDestroy (scrpriv->pDamage); RemoveBlockAndWakeupHandlers (ephyrInternalDamageBlockHandler, ephyrInternalDamageWakeupHandler, (pointer) pScreen); } -#endif + #ifdef RANDR #if 0 Bool @@ -579,8 +579,8 @@ ephyrRandRSetConfig (ScreenPtr pScreen, * to use damage to efficiently update display * via signal regions what to copy from 'fb'. */ - // if (!ephyrSetInternalDamage(screen->pScreen)) - // goto bail4; + if (!ephyrSetInternalDamage(screen->pScreen)) + goto bail4; } // ephyrSetScreenSizes (screen->pScreen); @@ -720,8 +720,8 @@ ephyrCreateResources (DrvScreenPtr pScreen) scrpriv->randr, ephyrShadowUpdate, ephyrWindowLinear); - // else - // return ephyrSetInternalDamage(pScreen); + else + return ephyrSetInternalDamage(pScreen); } void diff --git a/hw/kdrive/ephyr/ephyr.h b/hw/kdrive/ephyr/ephyr.h index 3ebd95754..9f05d3deb 100644 --- a/hw/kdrive/ephyr/ephyr.h +++ b/hw/kdrive/ephyr/ephyr.h @@ -39,7 +39,7 @@ #include "randrstr.h" #endif -#include "damage.h" +#include "drv_damage.h" typedef struct _ephyrPriv { CARD8 *base; @@ -63,7 +63,7 @@ typedef struct _ephyrFakexaPriv { typedef struct _ephyrDrvScrPriv { Rotation randr; Bool shadow; - DamagePtr pDamage; + DrvDamagePtr pDamage; EphyrFakexaPriv *fakexa; } EphyrScrPriv; |