summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-08-12 14:40:23 +0100
committerDave Airlie <airlied@redhat.com>2011-08-12 14:40:23 +0100
commit2053325d8525411517e42f719f3429470d33f4b6 (patch)
tree007f74f1506c9d02b49a1f58249dbeb3292f1d23
parent27e0679ddc13e4596f185335548d479e281f92b0 (diff)
drv/kdrive: fixup some colormap loving
-rw-r--r--hw/kdrive/ephyr/ephyr.c16
-rw-r--r--hw/kdrive/src/kcmap.c62
-rw-r--r--hw/kdrive/src/kdrive.c59
-rw-r--r--hw/kdrive/src/kdrive.h37
4 files changed, 109 insertions, 65 deletions
diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index b369fc542..3a6a9ac5c 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -214,13 +214,15 @@ ephyrWindowLinear (ScreenPtr pScreen,
void *closure)
{
KdScreenPriv(pScreen);
- EphyrPriv *priv = pScreenPriv->card->driver;
+#if 0
+ EphyrPriv *priv = pScreenPriv->card->driver;
if (!pScreenPriv->enabled)
return 0;
*size = priv->bytes_per_line;
return priv->base + row * priv->bytes_per_line + offset;
+#endif
}
/**
@@ -326,7 +328,7 @@ ephyrUnmapFramebuffer (KdDrvScreenInfo *screen)
void
ephyrShadowUpdate (DrvScreenPtr pScreen, shadowBufPtr pBuf)
{
- KdScreenPriv(pScreen);
+ KdDrvScreenPriv(pScreen);
KdDrvScreenInfo *screen = pScreenPriv->screen;
EPHYR_LOG("slow paint");
@@ -342,7 +344,7 @@ ephyrShadowUpdate (DrvScreenPtr pScreen, shadowBufPtr pBuf)
static void
ephyrInternalDamageRedisplay (DrvScreenPtr pScreen)
{
- KdScreenPriv(pScreen);
+ KdDrvScreenPriv(pScreen);
KdDrvScreenInfo *screen = pScreenPriv->screen;
EphyrScrPriv *scrpriv = screen->driver;
RegionPtr pRegion;
@@ -392,7 +394,7 @@ ephyrInternalDamageWakeupHandler (pointer data, int i, pointer LastSelectMask)
Bool
ephyrSetInternalDamage (DrvScreenPtr pScreen)
{
- KdScreenPriv(pScreen);
+ KdDrvScreenPriv(pScreen);
KdDrvScreenInfo *screen = pScreenPriv->screen;
EphyrScrPriv *scrpriv = screen->driver;
DrvPixmapPtr pPixmap = NULL;
@@ -419,7 +421,7 @@ ephyrSetInternalDamage (DrvScreenPtr pScreen)
void
ephyrUnsetInternalDamage (DrvScreenPtr pScreen)
{
- KdScreenPriv(pScreen);
+ KdDrvScreenPriv(pScreen);
KdDrvScreenInfo *screen = pScreenPriv->screen;
EphyrScrPriv *scrpriv = screen->driver;
DrvPixmapPtr pPixmap = NULL;
@@ -646,7 +648,7 @@ ephyrCreateColormap (ColormapPtr pmap)
Bool
ephyrInitScreen (DrvScreenPtr pScreen)
{
- KdScreenPriv(pScreen);
+ KdDrvScreenPriv(pScreen);
KdDrvScreenInfo *screen = pScreenPriv->screen;
EPHYR_LOG ("pScreen->myNum:%d\n", pScreen->myNum) ;
@@ -708,7 +710,7 @@ ephyrFinishInitScreen (DrvScreenPtr pScreen)
Bool
ephyrCreateResources (DrvScreenPtr pScreen)
{
- KdScreenPriv(pScreen);
+ KdDrvScreenPriv(pScreen);
KdDrvScreenInfo *screen = pScreenPriv->screen;
EphyrScrPriv *scrpriv = screen->driver;
diff --git a/hw/kdrive/src/kcmap.c b/hw/kdrive/src/kcmap.c
index e2df38e62..0bde16c6c 100644
--- a/hw/kdrive/src/kcmap.c
+++ b/hw/kdrive/src/kcmap.c
@@ -30,7 +30,7 @@
*/
void
-KdSetColormap (DrvScreenPtr pScreen)
+KdSetColormap (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
ColormapPtr pCmap = pScreenPriv->pInstalledmap;
@@ -39,13 +39,13 @@ KdSetColormap (DrvScreenPtr pScreen)
xColorItem defs[KD_MAX_PSEUDO_SIZE];
int i;
- if (!pScreenPriv->card->cfuncs->putColors)
- return;
- if (pScreenPriv->screen->fb.depth > KD_MAX_PSEUDO_DEPTH)
- return;
+ // if (!pScreenPriv->card->cfuncs->putColors)
+ // return;
+ // if (pScreenPriv->screen->fb.depth > KD_MAX_PSEUDO_DEPTH)
+ // return;
- if (!pScreenPriv->enabled)
- return;
+ // if (!pScreenPriv->enabled)
+ // return;
if (!pCmap)
return;
@@ -54,7 +54,7 @@ KdSetColormap (DrvScreenPtr pScreen)
* Make DIX convert pixels into RGB values -- this handles
* true/direct as well as pseudo/static visuals
*/
-
+#if 0
for (i = 0; i < (1 << pScreenPriv->screen->fb.depth); i++)
pixels[i] = i;
@@ -71,11 +71,12 @@ KdSetColormap (DrvScreenPtr pScreen)
(*pScreenPriv->card->cfuncs->putColors) (pScreen,
(1 << pScreenPriv->screen->fb.depth),
- defs);
/* recolor hardware cursor */
if (pScreenPriv->card->cfuncs->recolorCursor)
(*pScreenPriv->card->cfuncs->recolorCursor) (pScreen, 0, 0);
+#endif defs);
+
}
/*
@@ -83,11 +84,12 @@ KdSetColormap (DrvScreenPtr pScreen)
* the current colormap
*/
void
-KdEnableColormap (DrvScreenPtr pScreen)
+KdEnableColormap (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
int i;
+#if 0
if (!pScreenPriv->card->cfuncs->putColors)
return;
@@ -99,16 +101,18 @@ KdEnableColormap (DrvScreenPtr pScreen)
(1 << pScreenPriv->screen->fb.depth),
pScreenPriv->systemPalette);
}
+#endif
KdSetColormap (pScreen);
}
void
-KdDisableColormap (DrvScreenPtr pScreen)
+KdDisableColormap (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
- if (!pScreenPriv->card->cfuncs->putColors)
- return;
+#if 0
+ // if (!pScreenPriv->card->cfuncs->putColors)
+ // return;
if (pScreenPriv->screen->fb.depth <= KD_MAX_PSEUDO_DEPTH)
{
@@ -116,6 +120,7 @@ KdDisableColormap (DrvScreenPtr pScreen)
(1 << pScreenPriv->screen->fb.depth),
pScreenPriv->systemPalette);
}
+#endif
}
/*
@@ -128,25 +133,26 @@ KdDisableColormap (DrvScreenPtr pScreen)
* colormap and realize it into the Windows system palette.
*/
void
-KdInstallColormap (DrvScreenPtr pDrvScreen, ColormapPtr pCmap)
+KdInstallColormap (ColormapPtr pCmap)
{
- KdScreenPriv(pDrvScreen);
+ ScreenPtr pScreen = pCmap->pScreen;
+ KdScreenPriv(pScreen);
if (pCmap == pScreenPriv->pInstalledmap)
return;
/* Tell X clients that the installed colormap is going away. */
- // if (pScreenPriv->pInstalledmap)
- // WalkTree(pScreenPriv->pInstalledmap->pScreen, TellLostMap,
- // (pointer) &(pScreenPriv->pInstalledmap->mid));
+ if (pScreenPriv->pInstalledmap)
+ WalkTree(pScreenPriv->pInstalledmap->pScreen, TellLostMap,
+ (pointer) &(pScreenPriv->pInstalledmap->mid));
/* Take note of the new installed colorscreen-> */
pScreenPriv->pInstalledmap = pCmap;
- KdSetColormap (pDrvScreen);
+ KdSetColormap (pScreen);
/* Tell X clients of the new colormap */
- // WalkTree(pCmap->pScreen, TellGainedMap, (pointer) &(pCmap->mid));
+ WalkTree(pCmap->pScreen, TellGainedMap, (pointer) &(pCmap->mid));
}
/*
@@ -157,9 +163,8 @@ KdInstallColormap (DrvScreenPtr pDrvScreen, ColormapPtr pCmap)
* The default X colormap itself cannot be uninstalled.
*/
void
-KdUninstallColormap (DrvScreenPtr pDrvScreen, ColormapPtr pCmap)
+KdUninstallColormap (ScreenPtr pDrvScreen, ColormapPtr pCmap)
{
-#if 0
KdScreenPriv(pDrvScreen);
Colormap defMapID;
ColormapPtr defMap;
@@ -169,7 +174,7 @@ KdUninstallColormap (DrvScreenPtr pDrvScreen, ColormapPtr pCmap)
return;
dixLookupResourceByType((pointer *)&defMap, defMapID, RT_COLORMAP,
- 0 serverClient, DixInstallAccess);
+ serverClient, DixInstallAccess);
if (defMap)
(*pCmap->pScreen->InstallColormap)(defMap);
else
@@ -179,13 +184,11 @@ KdUninstallColormap (DrvScreenPtr pDrvScreen, ColormapPtr pCmap)
(pointer) &(pCmap->mid));
pScreenPriv->pInstalledmap = 0;
}
-#endif
}
int
-KdListInstalledColormaps (DrvScreenPtr pScreen, Colormap *pCmaps)
+KdListInstalledColormaps (ScreenPtr pScreen, Colormap *pCmaps)
{
-#if 0
KdScreenPriv(pScreen);
int n = 0;
@@ -195,7 +198,6 @@ KdListInstalledColormaps (DrvScreenPtr pScreen, Colormap *pCmaps)
n++;
}
return n;
-#endif
}
/*
@@ -206,12 +208,13 @@ KdListInstalledColormaps (DrvScreenPtr pScreen, Colormap *pCmaps)
* colormap; it can be either the default colormap or a private colorscreen->
*/
void
-KdStoreColors (DrvScreenPtr pDrvScreen, ColormapPtr pCmap, int ndef, xColorItem *pdefs)
+KdStoreColors (ScreenPtr pScreen, ColormapPtr pCmap, int ndef, xColorItem *pdefs)
{
- KdScreenPriv(pDrvScreen);
+ KdScreenPriv(pScreen);
VisualPtr pVisual;
xColorItem expanddefs[KD_MAX_PSEUDO_SIZE];
+#if 0
if (pCmap != pScreenPriv->pInstalledmap)
return;
@@ -241,4 +244,5 @@ KdStoreColors (DrvScreenPtr pDrvScreen, ColormapPtr pCmap, int ndef, xColorItem
/* recolor hardware cursor */
if (pScreenPriv->card->cfuncs->recolorCursor)
(*pScreenPriv->card->cfuncs->recolorCursor) (pDrvScreen, ndef, pdefs);
+#endif
}
diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c
index 46f468a12..feeccf80e 100644
--- a/hw/kdrive/src/kdrive.c
+++ b/hw/kdrive/src/kdrive.c
@@ -97,13 +97,12 @@ KdOsFuncs *kdOsFuncs;
void
KdDisableScreen (DrvScreenPtr pScreen)
{
- KdScreenPriv(pScreen);
-
+ KdDrvScreenPriv(pScreen);
if (!pScreenPriv->enabled)
return;
//TODOif (!pScreenPriv->closed)
SetRootClip (pScreen->pScreen, FALSE);
- KdDisableColormap (pScreen);
+ // KdDisableColormap (pScreen);
if (!pScreenPriv->screen->dumb && pScreenPriv->card->cfuncs->disableAccel)
(*pScreenPriv->card->cfuncs->disableAccel) (pScreen);
if (!pScreenPriv->screen->softCursor && pScreenPriv->card->cfuncs->disableCursor)
@@ -170,7 +169,7 @@ KdDisableScreens (void)
Bool
KdEnableScreen (DrvScreenPtr pScreen)
{
- KdScreenPriv (pScreen);
+ KdDrvScreenPriv (pScreen);
if (pScreenPriv->enabled)
return TRUE;
@@ -184,7 +183,7 @@ KdEnableScreen (DrvScreenPtr pScreen)
(*pScreenPriv->card->cfuncs->enableCursor) (pScreen);
if (!pScreenPriv->screen->dumb && pScreenPriv->card->cfuncs->enableAccel)
(*pScreenPriv->card->cfuncs->enableAccel) (pScreen);
- KdEnableColormap (pScreen);
+ // KdEnableColormap (pScreen);
SetRootClip (pScreen->pScreen, TRUE);
if (pScreenPriv->card->cfuncs->dpms)
(*pScreenPriv->card->cfuncs->dpms) (pScreen, pScreenPriv->dpmsState);
@@ -723,9 +722,9 @@ KdOsInit (KdOsFuncs *pOsFuncs)
}
Bool
-KdAllocatePrivates (DrvScreenPtr pScreen)
+KdAllocatePrivates (ScreenPtr pScreen)
{
- KdPrivDrvScreenPtr pScreenPriv;
+ KdPrivScreenPtr pScreenPriv;
if (kdGeneration != serverGeneration)
kdGeneration = serverGeneration;
@@ -738,9 +737,24 @@ KdAllocatePrivates (DrvScreenPtr pScreen)
}
Bool
+KdDrvAllocatePrivates (DrvScreenPtr pScreen)
+{
+ KdPrivDrvScreenPtr pScreenPriv;
+
+ if (kdGeneration != serverGeneration)
+ kdGeneration = serverGeneration;
+
+ pScreenPriv = calloc(1, sizeof (*pScreenPriv));
+ if (!pScreenPriv)
+ return FALSE;
+ KdSetDrvScreenPriv (pScreen, pScreenPriv);
+ return TRUE;
+}
+
+Bool
KdCreateScreenResources (DrvScreenPtr pScreen)
{
- KdScreenPriv(pScreen);
+ KdDrvScreenPriv(pScreen);
KdCardInfo *card = pScreenPriv->card;
Bool ret;
@@ -759,7 +773,7 @@ KdCreateScreenResources (DrvScreenPtr pScreen)
Bool
KdCloseScreen (DrvScreenPtr pScreen)
{
- KdScreenPriv(pScreen);
+ KdDrvScreenPriv(pScreen);
KdDrvScreenInfo *screen = pScreenPriv->screen;
KdCardInfo *card = pScreenPriv->card;
Bool ret;
@@ -826,7 +840,7 @@ KdCloseScreen (DrvScreenPtr pScreen)
Bool
KdSaveScreen (DrvScreenPtr pScreen, int on)
{
- KdScreenPriv(pScreen);
+ KdDrvScreenPriv(pScreen);
int dpmsState;
#if 0
@@ -880,7 +894,7 @@ KdCreateWindow (WindowPtr pWin)
void
KdSetSubpixelOrder (DrvScreenPtr pScreen, Rotation randr)
{
- KdScreenPriv(pScreen);
+ KdDrvScreenPriv(pScreen);
KdDrvScreenInfo *screen = pScreenPriv->screen;
int subpixel_order = screen->subpixel_order;
Rotation subpixel_dir;
@@ -951,7 +965,7 @@ KdDrvScreenInit(KdDrvScreenInfo *screen, int argc, char **argv)
Bool rotated = (screen->randr & (RR_Rotate_90|RR_Rotate_270)) != 0;
int width, height, *width_mmp, *height_mmp;
- KdAllocatePrivates (pScreen);
+ KdDrvAllocatePrivates (pScreen);
pScreenPriv = KdGetDrvScreenPriv(pScreen);
@@ -997,9 +1011,6 @@ KdDrvScreenInit(KdDrvScreenInfo *screen, int argc, char **argv)
/*
* Set colormap functions
*/
- pScreen->InstallColormap = KdInstallColormap;
- pScreen->UninstallColormap = KdUninstallColormap;
- pScreen->ListInstalledColormaps = KdListInstalledColormaps;
pScreen->StoreColors = KdStoreColors;
@@ -1099,7 +1110,7 @@ KdDrvScreenInit(KdDrvScreenInfo *screen, int argc, char **argv)
pScreenPriv->enabled = TRUE;
if (!screen->softCursor && card->cfuncs->enableCursor)
(*card->cfuncs->enableCursor) (pScreen);
- KdEnableColormap (pScreen);
+ // KdEnableColormap (pScreen);
if (!screen->dumb && card->cfuncs->enableAccel)
(*card->cfuncs->enableAccel) (pScreen);
}
@@ -1197,6 +1208,8 @@ KdScreenInit(int index, ScreenPtr pScreen,
Bool rotated;
int width, height;
+ KdAllocatePrivates (pScreen);
+
if (!impedSetupScreen(index, pScreen))
return FALSE;
@@ -1217,17 +1230,23 @@ KdScreenInit(int index, ScreenPtr pScreen,
width = first->height;
height = first->width;
}
+
+ pScreen->InstallColormap = KdInstallColormap;
+ pScreen->UninstallColormap = KdUninstallColormap;
+ pScreen->ListInstalledColormaps = KdListInstalledColormaps;
+
if (!impedFinishScreenInit(pScreen, first->fb.frameBuffer, width, height,
75, 75,
first->fb.pixelStride, first->fb.bitsPerPixel))
return FALSE;
- if (!miCreateDefColormap (pScreen)) {
- return FALSE;
- }
+
pScreen->SaveScreen = KdSaveScreen;
if (first->softCursor)
miDCInitialize(pScreen, &kdPointerScreenFuncs);
+ if (!miCreateDefColormap (pScreen)) {
+ return FALSE;
+ }
}
static void
@@ -1314,6 +1333,8 @@ KdInitOutput (ScreenInfo *pScreenInfo,
if (!dixRegisterPrivateKey(&kdDrvScreenPrivateKeyRec, PRIVATE_DRV_SCREEN, 0))
return FALSE;
+ if (!dixRegisterPrivateKey(&kdScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
if (!kdCardInfo)
{
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index f1026e664..3a5cb3d8f 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -169,6 +169,14 @@ typedef struct {
DrvCloseScreenProcPtr CloseScreen;
} KdPrivDrvScreenRec, *KdPrivDrvScreenPtr;
+typedef struct {
+ KdScreenInfo *screen;
+
+ ColormapPtr pInstalledmap; /* current colormap */
+ xColorItem systemPalette[KD_MAX_PSEUDO_SIZE];/* saved windows colors */
+
+ Bool enabled;
+} KdPrivScreenRec, *KdPrivScreenPtr;
typedef enum _kdPointerState {
start,
@@ -377,31 +385,37 @@ extern KdOsFuncs *kdOsFuncs;
#define KdGetDrvScreenPriv(pScreen) ((KdPrivDrvScreenPtr) \
dixLookupPrivate(&(pScreen)->devPrivates, kdDrvScreenPrivateKey))
-#define KdSetScreenPriv(pScreen,v) \
+#define KdSetDrvScreenPriv(pScreen,v) \
dixSetPrivate(&(pScreen)->devPrivates, kdDrvScreenPrivateKey, v)
-#define KdScreenPriv(pScreen) KdPrivDrvScreenPtr pScreenPriv = KdGetDrvScreenPriv(pScreen)
+#define KdDrvScreenPriv(pScreen) KdPrivDrvScreenPtr pScreenPriv = KdGetDrvScreenPriv(pScreen)
+
+#define KdGetScreenPriv(pScreen) ((KdPrivScreenPtr) \
+ dixLookupPrivate(&(pScreen)->devPrivates, kdScreenPrivateKey))
+#define KdSetScreenPriv(pScreen,v) \
+ dixSetPrivate(&(pScreen)->devPrivates, kdScreenPrivateKey, v)
+#define KdScreenPriv(pScreen) KdPrivScreenPtr pScreenPriv = KdGetScreenPriv(pScreen)
/* kcmap.c */
void
-KdSetColormap (DrvScreenPtr pScreen);
+KdSetColormap (ScreenPtr pScreen);
void
-KdEnableColormap (DrvScreenPtr pScreen);
+KdEnableColormap (ScreenPtr pScreen);
void
-KdDisableColormap (DrvScreenPtr pScreen);
+KdDisableColormap (ScreenPtr pScreen);
void
-KdInstallColormap (DrvScreenPtr pDrvScreen, ColormapPtr pCmap);
+KdInstallColormap (ColormapPtr pCmap);
void
-KdUninstallColormap (DrvScreenPtr pDrvScreen, ColormapPtr pCmap);
+KdUninstallColormap (ScreenPtr pDrvScreen, ColormapPtr pCmap);
int
-KdListInstalledColormaps (DrvScreenPtr pScreen, Colormap *pCmaps);
+KdListInstalledColormaps (ScreenPtr pScreen, Colormap *pCmaps);
void
-KdStoreColors (DrvScreenPtr pScreen, ColormapPtr pCmap, int ndef, xColorItem *pdefs);
+KdStoreColors (ScreenPtr pScreen, ColormapPtr pCmap, int ndef, xColorItem *pdefs);
/* kdrive.c */
extern miPointerScreenFuncRec kdPointerScreenFuncs;
@@ -462,7 +476,10 @@ void
KdOsAddInputDrivers (void);
Bool
-KdAllocatePrivates (DrvScreenPtr pScreen);
+KdAllocatePrivates (ScreenPtr pScreen);
+
+Bool
+KdDrvAllocatePrivates (DrvScreenPtr pScreen);
Bool
KdCreateScreenResources (DrvScreenPtr pScreen);