Module Name: xsrc
Committed By: macallan
Date: Thu Apr 14 16:48:59 UTC 2011
Modified Files:
xsrc/external/mit/xf86-video-suncg14/dist/src: cg14.h cg14_driver.c
Added Files:
xsrc/external/mit/xf86-video-suncg14/dist/src: cg14_cursor.c
Log Message:
add shadowfb and hardware cursor support
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 xsrc/external/mit/xf86-video-suncg14/dist/src/cg14.h
cvs rdiff -u -r0 -r1.1 \
xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_cursor.c
cvs rdiff -u -r1.5 -r1.6 \
xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_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-suncg14/dist/src/cg14.h
diff -u xsrc/external/mit/xf86-video-suncg14/dist/src/cg14.h:1.3 xsrc/external/mit/xf86-video-suncg14/dist/src/cg14.h:1.4
--- xsrc/external/mit/xf86-video-suncg14/dist/src/cg14.h:1.3 Thu Apr 14 01:37:22 2011
+++ xsrc/external/mit/xf86-video-suncg14/dist/src/cg14.h Thu Apr 14 16:48:59 2011
@@ -51,17 +51,43 @@
#define CG14_G32_VOFF 0xb0000000
#define CG14_R32_VOFF 0xc0000000
+/* Hardware cursor map */
+#define CG14_CURS_SIZE 32
+struct cg14curs {
+ volatile uint32_t curs_plane0[CG14_CURS_SIZE]; /* plane 0 */
+ volatile uint32_t curs_plane1[CG14_CURS_SIZE];
+ volatile uint8_t curs_ctl; /* control register */
+#define CG14_CURS_ENABLE 0x4
+#define CG14_CURS_DOUBLEBUFFER 0x2 /* use X-channel for curs */
+ volatile uint8_t pad0[3];
+ volatile uint16_t curs_x; /* x position */
+ volatile uint16_t curs_y; /* y position */
+ volatile uint32_t curs_color1; /* color register 1 */
+ volatile uint32_t curs_color2; /* color register 2 */
+ volatile uint32_t pad[444]; /* pad to 2KB boundary */
+ volatile uint32_t curs_plane0incr[CG14_CURS_SIZE]; /* autoincr */
+ volatile uint32_t curs_plane1incr[CG14_CURS_SIZE]; /* autoincr */
+};
+
typedef struct {
- unsigned int *fb;
+ unsigned char *fb;
unsigned char *x32;
unsigned char *xlut;
+ struct cg14curs *curs;
int width;
int height;
+ int use_shadow;
+ int HWCursor;
+ void * shadow;
sbusDevicePtr psdp;
CloseScreenProcPtr CloseScreen;
+ CreateScreenResourcesProcPtr CreateScreenResources;
OptionInfoPtr Options;
+ xf86CursorInfoPtr CursorInfoRec;
} Cg14Rec, *Cg14Ptr;
+Bool CG14SetupCursor(ScreenPtr);
+
#define GET_CG14_FROM_SCRN(p) ((Cg14Ptr)((p)->driverPrivate))
/*
Index: xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_driver.c
diff -u xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_driver.c:1.5 xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_driver.c:1.6
--- xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_driver.c:1.5 Thu Apr 14 01:37:22 2011
+++ xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_driver.c Thu Apr 14 16:48:59 2011
@@ -35,8 +35,11 @@
#include "fb.h"
#include "xf86cmap.h"
+#include "shadow.h"
#include "cg14.h"
+#define static
+
static const OptionInfoRec * CG14AvailableOptions(int chipid, int busid);
static void CG14Identify(int flags);
static Bool CG14Probe(DriverPtr drv, int flags);
@@ -49,6 +52,8 @@
static Bool CG14SaveScreen(ScreenPtr pScreen, int mode);
static void CG14InitCplane24(ScrnInfoPtr pScrn);
static void CG14ExitCplane24(ScrnInfoPtr pScrn);
+static void *CG14WindowLinear(ScreenPtr, CARD32, CARD32, int, CARD32 *,
+ void *);
/* Required if the driver supports mode switching */
static Bool CG14SwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
@@ -87,7 +92,14 @@
0
};
+typedef enum {
+ OPTION_SHADOW_FB,
+ OPTION_HW_CURSOR,
+ OPTION_SW_CURSOR
+} CG14Opts;
+
static const OptionInfoRec CG14Options[] = {
+ { OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, TRUE},
{ -1, NULL, OPTV_NONE, {0}, FALSE }
};
@@ -283,7 +295,7 @@
{
Cg14Ptr pCg14;
sbusDevicePtr psdp = NULL;
- int i;
+ int i, from;
if (flags & PROBE_DETECT) return FALSE;
@@ -352,6 +364,8 @@
return FALSE;
memcpy(pCg14->Options, CG14Options, sizeof(CG14Options));
xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, pCg14->Options);
+ pCg14->use_shadow = xf86ReturnOptValBool(pCg14->Options, OPTION_SHADOW_FB,
+ TRUE);
/*
* This must happen after pScrn->display has been set because
@@ -395,6 +409,25 @@
return FALSE;
}
+ if (pCg14->use_shadow) {
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Using shadow framebuffer\n");
+ if (xf86LoadSubModule(pScrn, "shadow") == NULL) {
+ CG14FreeRec(pScrn);
+ return FALSE;
+ }
+ }
+
+ from = X_DEFAULT;
+ pCg14->HWCursor = TRUE;
+ if (xf86GetOptValBool(pCg14->Options, OPTION_HW_CURSOR, &pCg14->HWCursor))
+ from = X_CONFIG;
+ if (xf86ReturnOptValBool(pCg14->Options, OPTION_SW_CURSOR, FALSE)) {
+ from = X_CONFIG;
+ pCg14->HWCursor = FALSE;
+ }
+ xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n",
+ pCg14->HWCursor ? "HW" : "SW");
+
/*********************
set up clock and mode stuff
*********************/
@@ -418,6 +451,46 @@
return TRUE;
}
+static Bool
+CG14CreateScreenResources(ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ Cg14Ptr pCg14 = GET_CG14_FROM_SCRN(pScrn);
+ PixmapPtr pPixmap;
+ Bool ret;
+
+ pScreen->CreateScreenResources = pCg14->CreateScreenResources;
+ ret = pScreen->CreateScreenResources(pScreen);
+ pScreen->CreateScreenResources = CG14CreateScreenResources;
+
+ if (!ret)
+ return FALSE;
+
+ pPixmap = pScreen->GetScreenPixmap(pScreen);
+
+ if (!shadowAdd(pScreen, pPixmap, shadowUpdatePackedWeak(),
+ CG14WindowLinear, 0, NULL)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+static Bool
+CG14ShadowInit(ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ Cg14Ptr pCg14 = GET_CG14_FROM_SCRN(pScrn);
+
+ if (!shadowSetup(pScreen)) {
+ return FALSE;
+ }
+
+ pCg14->CreateScreenResources = pScreen->CreateScreenResources;
+ pScreen->CreateScreenResources = CG14CreateScreenResources;
+
+ return TRUE;
+}
/* Mandatory */
/* This gets called at the start of each server generation */
@@ -425,28 +498,27 @@
static Bool
CG14ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
{
- ScrnInfoPtr pScrn;
- Cg14Ptr pCg14;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ Cg14Ptr pCg14 = GET_CG14_FROM_SCRN(pScrn);
VisualPtr visual;
int ret;
- /*
- * First get the ScrnInfoRec
- */
- pScrn = xf86Screens[pScreen->myNum];
-
- pCg14 = GET_CG14_FROM_SCRN(pScrn);
-
/* Map the CG14 memory */
pCg14->fb = xf86MapSbusMem (pCg14->psdp, CG14_BGR_VOFF, 4 *
(pCg14->psdp->width * pCg14->psdp->height));
pCg14->x32 = xf86MapSbusMem (pCg14->psdp, CG14_X32_VOFF,
(pCg14->psdp->width * pCg14->psdp->height));
pCg14->xlut = xf86MapSbusMem (pCg14->psdp, CG14_XLUT_VOFF, 4096);
+ pCg14->curs = xf86MapSbusMem (pCg14->psdp, CG14_CURSOR_VOFF, 4096);
- if (! pCg14->fb || !pCg14->x32 || !pCg14->xlut) {
- xf86Msg(X_ERROR, "can't mmap something: fd %08x x32 %08x xlut %08x\n",
- (uint32_t)pCg14->fb, (uint32_t)pCg14->x32, (uint32_t)pCg14->xlut);
+ pCg14->width = pCg14->psdp->width;
+ pCg14->height = pCg14->psdp->height;
+
+ if (! pCg14->fb || !pCg14->x32 || !pCg14->xlut || !pCg14->curs) {
+ xf86Msg(X_ERROR,
+ "can't mmap something: fd %08x x32 %08x xlut %08x cursor %08x\n",
+ (uint32_t)pCg14->fb, (uint32_t)pCg14->x32, (uint32_t)pCg14->xlut,
+ (uint32_t)pCg14->curs);
return FALSE;
}
@@ -475,19 +547,40 @@
miSetPixmapDepths ();
+ if (pCg14->use_shadow) {
+ pCg14->shadow = xcalloc(1, pScrn->virtualX * pScrn->virtualY * 4);
+
+ if (!pCg14->shadow) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to allocate shadow framebuffer\n");
+ return FALSE;
+ }
+ }
+
/*
* Call the framebuffer layer's ScreenInit function, and fill in other
* pScreen fields.
*/
CG14InitCplane24(pScrn);
- ret = fbScreenInit(pScreen, pCg14->fb, pScrn->virtualX,
+ ret = fbScreenInit(pScreen, pCg14->use_shadow ? pCg14->shadow : pCg14->fb,
+ pScrn->virtualX,
pScrn->virtualY, pScrn->xDpi, pScrn->yDpi,
pScrn->virtualX, pScrn->bitsPerPixel);
if (!ret)
return FALSE;
+ /* must be after RGB ordering fixed */
+ fbPictureInit (pScreen, 0, 0);
+
+xf86DrvMsg(scrnIndex, X_ERROR, "calling CG14ShadowInit\n");
+ if (pCg14->use_shadow && !CG14ShadowInit(pScreen)) {
+ xf86DrvMsg(scrnIndex, X_ERROR,
+ "shadow framebuffer initialization failed\n");
+ return FALSE;
+ }
+
miInitializeBackingStore(pScreen);
xf86SetBackingStore(pScreen);
xf86SetSilkenMouse(pScreen);
@@ -509,14 +602,13 @@
}
}
-#ifdef RENDER
- /* must be after RGB ordering fixed */
- fbPictureInit (pScreen, 0, 0);
-#endif
-
/* Initialise cursor functions */
miDCInitialize (pScreen, xf86GetPointerScreenFuncs());
+ /* check for hardware cursor support */
+ if (pCg14->HWCursor)
+ CG14SetupCursor(pScreen);
+
/* Initialise default colourmap */
if (!miCreateDefColormap(pScreen))
return FALSE;
@@ -601,6 +693,14 @@
{
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
Cg14Ptr pCg14 = GET_CG14_FROM_SCRN(pScrn);
+ PixmapPtr pPixmap;
+
+ if (pCg14->use_shadow) {
+
+ pPixmap = pScreen->GetScreenPixmap(pScreen);
+ shadowRemove(pScreen, pPixmap);
+ pCg14->use_shadow = FALSE;
+ }
pScrn->vtSema = FALSE;
CG14ExitCplane24 (pScrn);
@@ -609,12 +709,22 @@
xf86UnmapSbusMem(pCg14->psdp, pCg14->x32,
(pCg14->psdp->width * pCg14->psdp->height));
xf86UnmapSbusMem(pCg14->psdp, pCg14->xlut, 4096);
+ xf86UnmapSbusMem(pCg14->psdp, pCg14->curs, 4096);
pScreen->CloseScreen = pCg14->CloseScreen;
return (*pScreen->CloseScreen)(scrnIndex, pScreen);
- return FALSE;
}
+static void *
+CG14WindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode,
+ CARD32 *size, void *closure)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ Cg14Ptr pCg14 = GET_CG14_FROM_SCRN(pScrn);
+
+ *size = pCg14->width << 2;
+ return (CARD8 *)pCg14->fb + row * (pCg14->width << 2) + offset;
+}
/* Free up any per-generation data structures */
Added files:
Index: xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_cursor.c
diff -u /dev/null xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_cursor.c:1.1
--- /dev/null Thu Apr 14 16:48:59 2011
+++ xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_cursor.c Thu Apr 14 16:48:59 2011
@@ -0,0 +1,131 @@
+/* $NetBSD: cg14_cursor.c,v 1.1 2011/04/14 16:48:59 macallan Exp $ */
+/*
+ * Copyright (c) 2005 Michael Lorenz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/endian.h>
+#include <dev/wscons/wsconsio.h>
+#include <errno.h>
+
+/* all driver need this */
+#include "xf86.h"
+#include "xf86_OSproc.h"
+
+#include "cg14.h"
+
+static void CG14LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src);
+static void CG14SetCursorPosition(ScrnInfoPtr pScrn, int x, int y);
+static void CG14SetCursorColors(ScrnInfoPtr pScrn, int bg, int fg);
+
+static void
+CG14LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src)
+{
+ Cg14Ptr pCG14 = GET_CG14_FROM_SCRN(pScrn);
+ uint32_t buf[64];
+ uint32_t *img = buf;
+ int i;
+
+ memcpy(buf, src, 256); /* to make sure it's aligned */
+ for (i = 0; i < 32; i++) {
+ pCG14->curs->curs_plane0[i] = *img;
+ img++;
+ }
+ for (i = 0; i < 32; i++) {
+ pCG14->curs->curs_plane1[i] = *img;
+ img++;
+ }
+}
+
+void
+CG14ShowCursor(ScrnInfoPtr pScrn)
+{
+ Cg14Ptr pCG14 = GET_CG14_FROM_SCRN(pScrn);
+
+ pCG14->curs->curs_ctl = CG14_CURS_ENABLE;
+}
+
+void
+CG14HideCursor(ScrnInfoPtr pScrn)
+{
+ Cg14Ptr pCG14 = GET_CG14_FROM_SCRN(pScrn);
+
+ pCG14->curs->curs_ctl = 0;
+}
+
+static void
+CG14SetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
+{
+ Cg14Ptr pCG14 = GET_CG14_FROM_SCRN(pScrn);
+
+ pCG14->curs->curs_x = x;
+ pCG14->curs->curs_y = y;
+}
+
+static void
+CG14SetCursorColors(ScrnInfoPtr pScrn, int bg, int fg)
+{
+ Cg14Ptr pCG14 = GET_CG14_FROM_SCRN(pScrn);
+#define RGB2BGR(x) (((x & 0xff0000) >> 16) | (x & 0xff00) | ((x & 0xff) << 16))
+ pCG14->curs->curs_color1 = RGB2BGR(bg);
+ pCG14->curs->curs_color2 = RGB2BGR(fg);
+}
+
+Bool
+CG14SetupCursor(ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ Cg14Ptr pCG14 = GET_CG14_FROM_SCRN(pScrn);
+ xf86CursorInfoPtr infoPtr;
+
+ pCG14->curs->curs_ctl = 0;
+
+ infoPtr = xf86CreateCursorInfoRec();
+ if(!infoPtr) return FALSE;
+
+ pCG14->CursorInfoRec = infoPtr;
+
+ xf86Msg(X_INFO, "HW cursor enabled\n");
+
+ infoPtr->MaxWidth = 32;
+ infoPtr->MaxHeight = 32;
+
+ infoPtr->Flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
+ HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
+ HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK;
+ infoPtr->SetCursorColors = CG14SetCursorColors;
+ infoPtr->SetCursorPosition = CG14SetCursorPosition;
+ infoPtr->LoadCursorImage = CG14LoadCursorImage;
+ infoPtr->HideCursor = CG14HideCursor;
+ infoPtr->ShowCursor = CG14ShowCursor;
+ infoPtr->UseHWCursor = NULL;
+
+ return xf86InitCursor(pScreen, infoPtr);
+}