Module Name: xsrc
Committed By: mrg
Date: Mon Nov 9 05:19:11 UTC 2009
Modified Files:
xsrc/external/mit/xf86-video-wsfb/dist/src: wsfb_driver.c
Log Message:
merge xf86-video-wsfb 0.3.0
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c
diff -u xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.3 xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.4
--- xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.3 Fri Jun 12 01:53:00 2009
+++ xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c Mon Nov 9 05:19:11 2009
@@ -1,4 +1,4 @@
-/* $OpenBSD: wsfb_driver.c,v 1.19 2003/04/27 16:42:32 matthieu Exp $ */
+/* $OpenBSD: wsfb_driver.c,v 1.16 2009/09/13 19:33:49 matthieu Exp $ */
/*
* Copyright (c) 2001 Matthieu Herrb
* All rights reserved.
@@ -40,13 +40,15 @@
#include "config.h"
#endif
+#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
+#include <sys/mman.h>
#include <sys/time.h>
#include <errno.h>
#include <dev/wscons/wsconsio.h>
-/* all driver need this */
+/* All drivers need this. */
#include "xf86.h"
#include "xf86_OSproc.h"
@@ -58,11 +60,19 @@
#include "shadow.h"
#include "dgaproc.h"
-/* for visuals */
+/* For visuals */
+#ifdef HAVE_XF1BPP
+# include "xf1bpp.h"
+#endif
+#ifdef HAVE_XF4BPP
+# include "xf4bpp.h"
+#endif
#include "fb.h"
+#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
#include "xf86Resources.h"
#include "xf86RAC.h"
+#endif
#ifdef XvExtension
#include "xf86xv.h"
@@ -74,7 +84,7 @@
#include <sys/mman.h>
-#ifdef USE_PRIVSEP
+#ifdef X_PRIVSEP
extern int priv_open_device(const char *);
#else
#define priv_open_device(n) open(n,O_RDWR|O_NONBLOCK|O_EXCL)
@@ -122,7 +132,7 @@
static void WsfbSave(ScrnInfoPtr);
static void WsfbRestore(ScrnInfoPtr);
-/* dga stuff */
+/* DGA stuff */
#ifdef XFreeXDGA
static Bool WsfbDGAOpenFramebuffer(ScrnInfoPtr, char **, unsigned char **,
int *, int *, int *);
@@ -133,7 +143,7 @@
static Bool WsfbDriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op,
pointer ptr);
-/* helper functions */
+/* Helper functions */
static int wsfb_open(char *);
static pointer wsfb_mmap(size_t, off_t, int);
@@ -144,8 +154,8 @@
};
/*
- * This is intentionally screen-independent. It indicates the binding
- * choice made in the first PreInit.
+ * This is intentionally screen-independent.
+ * It indicates the binding choice made in the first PreInit.
*/
static int pix24bpp = 0;
@@ -231,7 +241,7 @@
static Bool setupDone = FALSE;
const char *osname;
- /* Check that we're being loaded on a OpenBSD or NetBSD system */
+ /* Check that we're being loaded on a OpenBSD or NetBSD system. */
LoaderGetOS(&osname, NULL, NULL, NULL);
if (!osname || (strcmp(osname, "openbsd") != 0 &&
strcmp(osname, "netbsd") != 0)) {
@@ -289,18 +299,18 @@
WsfbChipsets);
}
-/* Open the framebuffer device */
+/* Open the framebuffer device. */
static int
wsfb_open(char *dev)
{
int fd = -1;
- /* try argument from XF86Config first */
+ /* Try argument from XF86Config first. */
if (dev == NULL || ((fd = priv_open_device(dev)) == -1)) {
- /* second: environment variable */
+ /* Second: environment variable. */
dev = getenv("XDEVICE");
if (dev == NULL || ((fd = priv_open_device(dev)) == -1)) {
- /* last try: default device */
+ /* Last try: default device. */
dev = WSFB_DEFAULT_DEV;
if ((fd = priv_open_device(dev)) == -1) {
return -1;
@@ -310,7 +320,7 @@
return fd;
}
-/* Map the framebuffer's memory */
+/* Map the framebuffer's memory. */
static pointer
wsfb_mmap(size_t len, off_t off, int fd)
{
@@ -323,7 +333,7 @@
addr = 0;
/*
- * try and make it private first, that way once we get it, an
+ * Try and make it private first, that way once we get it, an
* interloper, e.g. another server, can't get this frame buffer,
* and if another server already has it, this one won't.
*/
@@ -416,8 +426,10 @@
fPtr->pEnt = xf86GetEntityInfo(pScrn->entityList[0]);
+#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
pScrn->racMemFlags = RAC_FB | RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT;
pScrn->racIoFlags = pScrn->racMemFlags;
+#endif
dev = xf86FindOptionValue(fPtr->pEnt->device->options, "device");
fPtr->fd = wsfb_open(dev);
@@ -444,7 +456,7 @@
return FALSE;
}
/*
- * Allocate room for saving the colormap
+ * Allocate room for saving the colormap.
*/
if (fPtr->info.cmsize != 0) {
fPtr->saved_cmap.red =
@@ -480,7 +492,7 @@
fPtr->info.depth >= 24 ? Support24bppFb|Support32bppFb : 0))
return FALSE;
- /* Check consistency */
+ /* Check consistency. */
if (pScrn->bitsPerPixel != fPtr->info.depth) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"specified depth (%d) or bpp (%d) doesn't match "
@@ -490,11 +502,11 @@
}
xf86PrintDepthBpp(pScrn);
- /* Get the depth24 pixmap format */
+ /* Get the depth24 pixmap format. */
if (pScrn->depth == 24 && pix24bpp == 0)
pix24bpp = xf86GetBppFromDepth(pScrn, 24);
- /* color weight */
+ /* Color weight */
if (pScrn->depth > 8) {
rgb zeros = { 0, 0, 0 }, masks;
@@ -516,11 +528,11 @@
return FALSE;
}
- /* visual init */
+ /* Visual init */
if (!xf86SetDefaultVisual(pScrn, -1))
return FALSE;
- /* We don't currently support DirectColor at > 8bpp */
+ /* We don't currently support DirectColor at > 8bpp . */
if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Given default visual"
" (%s) is not supported at depth %d\n",
@@ -539,7 +551,7 @@
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vidmem: %dk\n",
pScrn->videoRam/1024);
- /* handle options */
+ /* Handle options. */
xf86CollectOptions(pScrn, NULL);
if (!(fPtr->Options = xalloc(sizeof(WsfbOptions))))
return FALSE;
@@ -547,7 +559,7 @@
xf86ProcessOptions(pScrn->scrnIndex, fPtr->pEnt->device->options,
fPtr->Options);
- /* use shadow framebuffer by default, on depth >= 8 */
+ /* Use shadow framebuffer by default, on depth >= 8 */
if (pScrn->depth >= 8)
fPtr->shadowFB = xf86ReturnOptValBool(fPtr->Options,
OPTION_SHADOW_FB, TRUE);
@@ -558,7 +570,7 @@
"Shadow FB option ignored on depth < 8");
}
- /* rotation */
+ /* Rotation */
fPtr->rotate = WSFB_ROTATE_NONE;
if ((s = xf86GetOptValString(fPtr->Options, OPTION_ROTATE))) {
if (pScrn->depth >= 8) {
@@ -591,7 +603,7 @@
}
}
- /* fake video mode struct */
+ /* Fake video mode struct. */
mode = (DisplayModePtr)xalloc(sizeof(DisplayModeRec));
mode->prev = mode;
mode->next = mode;
@@ -619,7 +631,7 @@
pScrn->virtualY = fPtr->info.height;
pScrn->displayWidth = pScrn->virtualX;
- /* Set the display resolution */
+ /* Set the display resolution. */
xf86SetDpi(pScrn, 0, 0);
from = X_DEFAULT;
@@ -633,15 +645,27 @@
xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n",
fPtr->HWCursor ? "HW" : "SW");
- /* Load bpp-specific modules */
+ /* Load bpp-specific modules. */
switch(pScrn->bitsPerPixel) {
+#ifdef HAVE_XF1BPP
+ case 1:
+ mod = "xf1bpp";
+ reqSym = "xf1bppScreenInit";
+ break;
+#endif
+#ifdef HAVE_XF4BPP
+ case 4:
+ mod = "xf4bpp";
+ reqSym = "xf4bppScreenInit";
+ break;
+#endif
default:
mod = "fb";
break;
}
- /* Load shadow if needed */
+ /* Load shadow if needed. */
if (fPtr->shadowFB) {
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
"Using \"Shadow Framebuffer\"\n");
@@ -649,7 +673,6 @@
WsfbFreeRec(pScrn);
return FALSE;
}
- xf86LoaderReqSymLists(shadowSymbols, NULL);
}
if (mod && xf86LoadSubModule(pScrn, mod) == NULL) {
@@ -765,7 +788,7 @@
"unsupported depth %d\n", fPtr->info.depth);
return FALSE;
}
- /* Switch to graphics mode - required before mmap */
+ /* Switch to graphics mode - required before mmap. */
if (ioctl(fPtr->fd, WSDISPLAYIO_SMODE, &wsmode) == -1) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"ioctl WSDISPLAYIO_SMODE: %s\n",
@@ -784,7 +807,7 @@
WsfbSave(pScrn);
pScrn->vtSema = TRUE;
- /* mi layer */
+ /* MI layer */
miClearVisualTypes();
if (pScrn->bitsPerPixel > 8) {
if (!miSetVisualTypes(pScrn->depth, TrueColorMask,
@@ -812,7 +835,34 @@
fPtr->fbstart = fPtr->fbmem;
+ if (fPtr->shadowFB) {
+ fPtr->shadow = xcalloc(1, pScrn->virtualX * pScrn->virtualY *
+ pScrn->bitsPerPixel);
+
+ if (!fPtr->shadow) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to allocate shadow framebuffer\n");
+ return FALSE;
+ }
+ }
+
switch (pScrn->bitsPerPixel) {
+ case 1:
+#ifdef HAVE_XF1BPP
+ ret = xf1bppScreenInit(pScreen, fPtr->fbstart,
+ pScrn->virtualX, pScrn->virtualY,
+ pScrn->xDpi, pScrn->yDpi,
+ pScrn->displayWidth);
+ break;
+#endif
+ case 4:
+#ifdef HAVE_XF4BPP
+ ret = xf4bppScreenInit(pScreen, fPtr->fbstart,
+ pScrn->virtualX, pScrn->virtualY,
+ pScrn->xDpi, pScrn->yDpi,
+ pScrn->displayWidth);
+ break;
+#endif
case 8:
case 16:
case 24:
@@ -833,7 +883,7 @@
return FALSE;
if (pScrn->bitsPerPixel > 8) {
- /* Fixup RGB ordering */
+ /* Fixup RGB ordering. */
visual = pScreen->visuals + pScreen->numVisuals;
while (--visual >= pScreen->visuals) {
if ((visual->class | DynamicClass) == DirectColor) {
@@ -878,19 +928,26 @@
miInitializeBackingStore(pScreen);
xf86SetBackingStore(pScreen);
- /* software cursor */
+ /* Software cursor. */
miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
/* check for hardware cursor support */
if (fPtr->HWCursor)
WsfbSetupCursor(pScreen);
- /* colormap */
+ /*
+ * Colormap
+ *
+ * Note that, even on less than 8 bit depth frame buffers, we
+ * expect the colormap to be programmable with 8 bit values.
+ * As of now, this is indeed the case on all OpenBSD supported
+ * graphics hardware.
+ */
if (!miCreateDefColormap(pScreen))
return FALSE;
flags = CMAP_RELOAD_ON_MODE_SWITCH;
ncolors = fPtr->info.cmsize;
- /* on StaticGray visuals, fake a 256 entries colormap */
+ /* On StaticGray visuals, fake a 256 entries colormap. */
if (ncolors == 0)
ncolors = 256;
if(!xf86HandleColormaps(pScreen, ncolors, 8, WsfbLoadPalette,
@@ -910,7 +967,7 @@
}
#endif
- /* Wrap the current CloseScreen function */
+ /* Wrap the current CloseScreen function. */
fPtr->CloseScreen = pScreen->CloseScreen;
pScreen->CloseScreen = WsfbCloseScreen;
@@ -922,10 +979,15 @@
WsfbCloseScreen(int scrnIndex, ScreenPtr pScreen)
{
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ PixmapPtr pPixmap;
WsfbPtr fPtr = WSFBPTR(pScrn);
+
TRACE_ENTER("WsfbCloseScreen");
+ pPixmap = pScreen->GetScreenPixmap(pScreen);
+ shadowRemove(pScreen, pPixmap);
+
if (pScrn->vtSema) {
WsfbRestore(pScrn);
if (munmap(fPtr->fbmem, fPtr->fbmem_len) == -1) {
@@ -944,8 +1006,9 @@
#endif
pScrn->vtSema = FALSE;
- /* unwrap CloseScreen */
+ /* Unwrap CloseScreen. */
pScreen->CloseScreen = fPtr->CloseScreen;
+ TRACE_EXIT("WsfbCloseScreen");
return (*pScreen->CloseScreen)(scrnIndex, pScreen);
}
@@ -1011,6 +1074,7 @@
TRACE_ENTER("EnterVT");
pScrn->vtSema = TRUE;
+ TRACE_EXIT("EnterVT");
return TRUE;
}
@@ -1032,7 +1096,7 @@
#endif
TRACE_ENTER("SwitchMode");
- /* Nothing else to do */
+ /* Nothing else to do. */
return TRUE;
}
@@ -1072,8 +1136,10 @@
if (ioctl(fPtr->fd,WSDISPLAYIO_PUTCMAP, &cmap) == -1)
ErrorF("ioctl FBIOPUTCMAP: %s\n", strerror(errno));
} else {
- /* Change all colors in 2 syscalls */
- /* and limit the data to be transfered */
+ /*
+ * Change all colors in 2 ioctls
+ * and limit the data to be transfered.
+ */
for (i = 0; i < numColors; i++) {
if (indices[i] < indexMin)
indexMin = indices[i];
@@ -1085,16 +1151,16 @@
cmap.red = &red[indexMin];
cmap.green = &green[indexMin];
cmap.blue = &blue[indexMin];
- /* Get current map */
+ /* Get current map. */
if (ioctl(fPtr->fd, WSDISPLAYIO_GETCMAP, &cmap) == -1)
ErrorF("ioctl FBIOGETCMAP: %s\n", strerror(errno));
- /* Change the colors that require updating */
+ /* Change the colors that require updating. */
for (i = 0; i < numColors; i++) {
red[indices[i]] = colors[indices[i]].red;
green[indices[i]] = colors[indices[i]].green;
blue[indices[i]] = colors[indices[i]].blue;
}
- /* Write the colormap back */
+ /* Write the colormap back. */
if (ioctl(fPtr->fd,WSDISPLAYIO_PUTCMAP, &cmap) == -1)
ErrorF("ioctl FBIOPUTCMAP: %s\n", strerror(errno));
}
@@ -1119,6 +1185,7 @@
ioctl(fPtr->fd,
WSDISPLAYIO_SVIDEO, &state);
}
+ TRACE_EXIT("SaveScreen");
return TRUE;
}
@@ -1140,6 +1207,7 @@
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"error saving colormap %s\n", strerror(errno));
}
+ TRACE_EXIT("WsfbSave");
}
@@ -1161,10 +1229,10 @@
}
}
- /* Clear the screen */
+ /* Clear the screen. */
memset(fPtr->fbmem, 0, fPtr->fbmem_len);
- /* Restore the text mode */
+ /* Restore the text mode. */
mode = WSDISPLAYIO_MODE_EMUL;
if (ioctl(fPtr->fd, WSDISPLAYIO_SMODE, &mode) == -1) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,