summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-08-11 16:27:01 +0100
committerDave Airlie <airlied@redhat.com>2011-08-11 16:27:01 +0100
commitd3a71b98eea41ff254c835a1f4a055cc155c8ce1 (patch)
treea6d71307d4ee206d5e3ec310a22378824a471191
parentd06d7c0e7e12fb216f5b98be959ac1a94aa92c80 (diff)
drv: get ephyr back to rendering by fixing damage
-rw-r--r--drv/drv_damage.c10
-rw-r--r--drv/drv_damage.h1
-rw-r--r--drv/drv_screen.c14
-rw-r--r--drv/drv_screenint.h3
-rw-r--r--drv/drv_scrnintstr.h5
-rw-r--r--drv/fb/drvfb.h2
-rw-r--r--drv/impedscrn.c27
-rw-r--r--hw/kdrive/ephyr/ephyr.c46
-rw-r--r--hw/kdrive/ephyr/ephyr.h4
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;