summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-08-11 15:28:58 +0100
committerDave Airlie <airlied@redhat.com>2011-08-11 15:28:58 +0100
commitd06d7c0e7e12fb216f5b98be959ac1a94aa92c80 (patch)
tree6b01b3b5bec6a48252ecd3ddcc08dd5ec9cec525
parent8aa4ceb71791a057c62ad05f5ece184fa9a62c2f (diff)
drv: got ephyr to start again, now to fix damaiste
-rw-r--r--drv/Makefile.am1
-rw-r--r--drv/drv_imped.h11
-rw-r--r--drv/drv_screen.c9
-rw-r--r--drv/drv_screenint.h2
-rw-r--r--drv/fb/fbscreen.c12
-rw-r--r--drv/impedscrn.c9
-rw-r--r--hw/kdrive/src/kdrive.c79
-rw-r--r--hw/kdrive/src/kdrive.h1
8 files changed, 101 insertions, 23 deletions
diff --git a/drv/Makefile.am b/drv/Makefile.am
index bbf0c23fa..4e3c880ec 100644
--- a/drv/Makefile.am
+++ b/drv/Makefile.am
@@ -31,6 +31,7 @@ libdrv_la_SOURCES = \
drv_pixmap.c \
drv_picture.c \
drv_damage.c \
+ drv_screen.c \
impedscrn.c \
impedgc.c \
impedpict.c
diff --git a/drv/drv_imped.h b/drv/drv_imped.h
index d2757a9ef..6c8673567 100644
--- a/drv/drv_imped.h
+++ b/drv/drv_imped.h
@@ -97,7 +97,16 @@ extern _X_EXPORT void impedScreenSetPixmapSize(ScreenPtr pScreen);
extern _X_EXPORT void impedAttachDrvScreen(ScreenPtr pScreen, DrvScreenPtr pDrvScreen);
-extern _X_EXPORT Bool impedScreenInit(int i, ScreenPtr pScreen, int argc, char **argv);
+extern _X_EXPORT Bool impedSetupScreen(int index, ScreenPtr pScreen);
+
+extern _X_EXPORT Bool impedFinishScreenInit(ScreenPtr pScreen,
+ pointer pbits,
+ int xsize,
+ int ysize,
+ int dpix,
+ int dpiy,
+ int width,
+ int bpp);
extern _X_EXPORT void impedInit(void);
#endif
diff --git a/drv/drv_screen.c b/drv/drv_screen.c
new file mode 100644
index 000000000..ec236991b
--- /dev/null
+++ b/drv/drv_screen.c
@@ -0,0 +1,9 @@
+#include "drv_scrnintstr.h"
+
+Bool
+drvScreenInit(DrvScreenPtr pDrvScreen)
+{
+ pDrvScreen->ModifyPixmapHeader = drvModifyPixmapHeader;
+}
+
+
diff --git a/drv/drv_screenint.h b/drv/drv_screenint.h
index dc3d3c7f3..9afbf4933 100644
--- a/drv/drv_screenint.h
+++ b/drv/drv_screenint.h
@@ -4,4 +4,6 @@
#include "drv_types.h"
DrvScreenPtr DrvScreenAllocate(void);
+Bool
+drvScreenInit(DrvScreenPtr pDrvScreen);
#endif
diff --git a/drv/fb/fbscreen.c b/drv/fb/fbscreen.c
index bc51b8d1f..eedcf836b 100644
--- a/drv/fb/fbscreen.c
+++ b/drv/fb/fbscreen.c
@@ -98,10 +98,9 @@ fbSetupScreen(DrvScreenPtr pScreen,
pScreen->GetSpans = fbGetSpans;
pScreen->CreatePixmap = fbCreatePixmap;
pScreen->DestroyPixmap = fbDestroyPixmap;
- pScreen->ModifyPixmapHeader = drvModifyPixmapHeader;
- // if (!impedScreenInit(pScreen))
- // return FALSE;
+ if (!drvScreenInit(pScreen))
+ return FALSE;
return TRUE;
}
@@ -188,6 +187,11 @@ fbFinishScreenInit(DrvScreenPtr pScreen,
fbGetScreenPrivate(pScreen)->finishWrap = finishWrap;
#endif
rootdepth = 0;
+
+ // if (!drvScreenInit(pScreen))
+ // return FALSE;
+#if 0
+
if (!miInitVisuals (&visuals, &depths, &nvisuals, &ndepths, &rootdepth,
&defaultVisual,((unsigned long)1<<(imagebpp-1)), 8, -1))
{
@@ -195,7 +199,6 @@ fbFinishScreenInit(DrvScreenPtr pScreen,
free(depths);
return FALSE;
}
-#if 0
if (! miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width,
rootdepth, ndepths, depths,
defaultVisual, nvisuals, visuals))
@@ -203,6 +206,7 @@ fbFinishScreenInit(DrvScreenPtr pScreen,
#endif
/* overwrite miCloseScreen with our own */
pScreen->CloseScreen = fbCloseScreen;
+
if (bpp == 24 && imagebpp == 32)
{
pScreen->ModifyPixmapHeader = fb24_32ModifyPixmapHeader;
diff --git a/drv/impedscrn.c b/drv/impedscrn.c
index de9420dcb..ce3f02cf5 100644
--- a/drv/impedscrn.c
+++ b/drv/impedscrn.c
@@ -350,7 +350,7 @@ impedCloseScreen (int index,ScreenPtr pScreen)
}
Bool
-impedSetupScreen(int index, ScreenPtr pScreen, int argc, char **argv)
+impedSetupScreen(int index, ScreenPtr pScreen)
{
if (!impedAllocatePrivates(pScreen, NULL))
@@ -381,7 +381,6 @@ impedSetupScreen(int index, ScreenPtr pScreen, int argc, char **argv)
pScreen->CreatePixmap = impedCreatePixmap;
pScreen->DestroyPixmap = impedDestroyPixmap;
- pScreen->ModifyPixmapHeader = impedModifyPixmapHeader;
pScreen->CreateGC = impedCreateGC;
@@ -414,6 +413,8 @@ Bool impedFinishScreenInit(ScreenPtr pScreen,
VisualID defaultVisual;
int imagebpp = bpp;
+ rootdepth = 0;
+
if (!miInitVisuals(&visuals, &depths, &nvisuals, &ndepths, &rootdepth,
&defaultVisual, 8, ((unsigned long)1<<(imagebpp - 1)), -1))
return FALSE;
@@ -421,6 +422,9 @@ Bool impedFinishScreenInit(ScreenPtr pScreen,
rootdepth, ndepths, depths, defaultVisual,
nvisuals, visuals))
return FALSE;
+
+ pScreen->ModifyPixmapHeader = impedModifyPixmapHeader;
+
}
void
impedScreenSetPixmapSize(ScreenPtr pScreen)
@@ -454,6 +458,7 @@ void impedAttachDrvScreen(ScreenPtr pScreen, DrvScreenPtr pDrvScreen)
}
imped_screen->gpu[i] = pDrvScreen;
+ pDrvScreen->pScreen = pScreen;
imped_screen->num_gpu++;
}
diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c
index 80a9ef2d2..46f468a12 100644
--- a/hw/kdrive/src/kdrive.c
+++ b/hw/kdrive/src/kdrive.c
@@ -102,7 +102,7 @@ KdDisableScreen (DrvScreenPtr pScreen)
if (!pScreenPriv->enabled)
return;
//TODOif (!pScreenPriv->closed)
- // SetRootClip (pScreen, FALSE);
+ SetRootClip (pScreen->pScreen, FALSE);
KdDisableColormap (pScreen);
if (!pScreenPriv->screen->dumb && pScreenPriv->card->cfuncs->disableAccel)
(*pScreenPriv->card->cfuncs->disableAccel) (pScreen);
@@ -185,7 +185,7 @@ KdEnableScreen (DrvScreenPtr pScreen)
if (!pScreenPriv->screen->dumb && pScreenPriv->card->cfuncs->enableAccel)
(*pScreenPriv->card->cfuncs->enableAccel) (pScreen);
KdEnableColormap (pScreen);
- // SetRootClip (pScreen, TRUE);
+ SetRootClip (pScreen->pScreen, TRUE);
if (pScreenPriv->card->cfuncs->dpms)
(*pScreenPriv->card->cfuncs->dpms) (pScreen, pScreenPriv->dpmsState);
return TRUE;
@@ -594,6 +594,7 @@ KdProcessArgument (int argc, char **argv, int i)
screen = KdScreenInfoAdd ();
// KdParseScreen (screen, argv[i+1]);
drvscreen = KdDrvScreenInfoAdd(card);
+ drvscreen->proto_screen = screen->mynum;
KdParseDrvScreen (drvscreen, argv[i+1]);
} else
ErrorF("No matching card found!\n");
@@ -828,6 +829,7 @@ KdSaveScreen (DrvScreenPtr pScreen, int on)
KdScreenPriv(pScreen);
int dpmsState;
+#if 0
if (!pScreenPriv->card->cfuncs->dpms)
return FALSE;
@@ -854,6 +856,7 @@ KdSaveScreen (DrvScreenPtr pScreen, int on)
pScreenPriv->dpmsState = dpmsState;
}
return TRUE;
+#endif
}
static Bool
@@ -999,7 +1002,7 @@ KdDrvScreenInit(KdDrvScreenInfo *screen, int argc, char **argv)
pScreen->ListInstalledColormaps = KdListInstalledColormaps;
pScreen->StoreColors = KdStoreColors;
- //pScreen->SaveScreen = KdSaveScreen;
+
// pScreen->CreateWindow = KdCreateWindow;
if (!fbFinishScreenInit (pScreen,
@@ -1069,7 +1072,7 @@ KdDrvScreenInit(KdDrvScreenInfo *screen, int argc, char **argv)
{
/* Use MI for cursor display and event queueing. */
screen->softCursor = TRUE;
- // miDCInitialize(pScreen, &kdPointerScreenFuncs);
+ //miDCInitialize(pScreen, &kdPointerScreenFuncs);
}
@@ -1184,15 +1187,46 @@ KdSetPixmapFormats (ScreenInfo *pScreenInfo)
return TRUE;
}
-static void
+static Bool
KdScreenInit(int index, ScreenPtr pScreen,
- int argc, char *argv)
+ int argc, char **argv)
{
+ KdScreenInfo *screen = kdCurrentScreen;
+ KdCardInfo *card;
+ KdDrvScreenInfo *drvscreen, *first = NULL;
+ Bool rotated;
+ int width, height;
- if (!miCreateDefColormap (pScreen))
- {
+ if (!impedSetupScreen(index, pScreen))
+ return FALSE;
+
+ /* add drv screens to screen with imped */
+ for (card = kdCardInfo; card; card = card->next)
+ for (drvscreen = card->drv_screenList; drvscreen; drvscreen = drvscreen->next)
+ if (drvscreen->proto_screen == screen->mynum) {
+ if (!first)
+ first = drvscreen;
+ impedAttachDrvScreen(pScreen, drvscreen->pDrvScreen);
+ }
+
+ rotated = first->randr & (RR_Rotate_90 | RR_Rotate_270);
+ if (!rotated) {
+ width = first->width;
+ height = first->height;
+ } else {
+ width = first->height;
+ height = first->width;
+ }
+ 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);
}
@@ -1203,10 +1237,23 @@ KdAddScreen (ScreenInfo *pScreenInfo,
char **argv)
{
int i;
+ KdCardInfo *card;
+ KdDrvScreenInfo *drvscreen, *found = NULL;
/*
* Fill in fb visual type masks for this screen
*/
-#if 0
+ for (card = kdCardInfo; card; card = card->next) {
+ for (drvscreen = card->drv_screenList; drvscreen; drvscreen = drvscreen->next)
+ if (drvscreen->proto_screen == screen->mynum)
+ found = drvscreen;
+ break;
+ }
+
+ if (!found) {
+ ErrorF("can't find screen for protocol screen\n");
+ return;
+ }
+
for (i = 0; i < pScreenInfo->numPixmapFormats; i++)
{
unsigned long visuals;
@@ -1214,19 +1261,19 @@ KdAddScreen (ScreenInfo *pScreenInfo,
visuals = 0;
rm = gm = bm = 0;
- if (pScreenInfo->formats[i].depth == screen->fb.depth)
+ if (pScreenInfo->formats[i].depth == found->fb.depth)
{
- visuals = screen->fb.visuals;
- rm = screen->drvscreen->fb.redMask;
- gm = screen->drvscreen->fb.greenMask;
- bm = screen->drvscreen->fb.blueMask;
+ visuals = found->fb.visuals;
+ rm = found->fb.redMask;
+ gm = found->fb.greenMask;
+ bm = found->fb.blueMask;
}
miSetVisualTypesAndMasks (pScreenInfo->formats[i].depth,
visuals,
- 8,
+ 8, -1,
rm, gm, bm);
}
-#endif
+
kdCurrentScreen = screen;
AddScreen (KdScreenInit, argc, argv);
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index 837b3dc80..f1026e664 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -115,6 +115,7 @@ typedef struct _KdDrvScreenInfo {
int mynum;
DDXPointRec origin;
KdFrameBuffer fb;
+ int proto_screen; /* which protocol screen this is going to */
} KdDrvScreenInfo;