newport driver update
Hi,
here's a small update for the Indy's newport driver. It fixes the most
annoying bugs:
- broken 24bpp mode setup
- black console after starting X
- screensaver blanking the console
- 1 off errors in the RefreshArea code
Branden, can this go into pre1v3?
-- Guido
Index: xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h
===================================================================
RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h,v
retrieving revision 1.8
diff -u -u -r1.8 xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h
--- xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h 2001/12/19 21:31:21 1.8
+++ xc/programs/Xserver/hw/xfree86/drivers/newport/newport.h 2002/07/15 23:23:01
@@ -51,7 +51,7 @@
npireg_t drawmode1; /* REX3 drawmode1 common to all drawing operations */
/* ShadowFB stuff: */
- pointer ShadowPtr;
+ CARD32* ShadowPtr;
unsigned long int ShadowPitch;
unsigned int Bpp; /* Bytes per pixel */
Index: xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c
===================================================================
RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c,v
retrieving revision 1.19
diff -u -u -r1.19 newport_driver.c
--- xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c 2002/01/04 21:22:33 1.19
+++ xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c 2002/07/15 23:23:03
@@ -681,7 +689,11 @@
/* turn on RGB mode */
NPORT_DMODE1_RGBMD |
/* turn on 8888 = RGBA pixel packing */
- NPORT_DMODE1_HD32 | NPORT_DMODE1_RWPCKD;
+ NPORT_DMODE1_HD32 | NPORT_DMODE1_RWPCKD;
+ /* After setting up XMAP9 we have to reinitialize the CMAP for
+ * whatever reason (the docs say nothing about it). RestorePalette()
+ * is just a lazy way to do this */
+ NewportRestorePalette( pScrn );
}
/* blank the framebuffer */
NewportWait(pNewportRegs);
Index: xc/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c
===================================================================
RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c,v
retrieving revision 1.2
diff -u -u -r1.2 newport_shadow.c
--- xc/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c 2001/11/23 19:50:45 1.2
+++ xc/programs/Xserver/hw/xfree86/drivers/newport/newport_shadow.c 2002/07/15 23:23:05
@@ -8,13 +8,13 @@
void
NewportRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
{
- unsigned long *base, *src;
int dx, dy, x;
+ CARD32 *base, *src;
NewportPtr pNewport = NEWPORTPTR(pScrn);
NewportRegsPtr pNewportRegs = pNewport->pNewportRegs;
-#define RA8_PIXELS 4 /* burst 4 pixels each time */
-#define RA8_PIXEL_SHIFT 2 /* 4 Pixels on each burst */
+#define RA8_BYTES 4 /* burst 4 pixels each time */
+#define RA8_BYTE_SHIFT 2 /* 4 Pixels on each burst, so divide ShadowPitch by 4 */
#define RA8_MASK 0xffc /* move to 4 byte boundary */
TRACE_ENTER("NewportRefreshArea8");
@@ -25,35 +25,36 @@
while(num--) {
NewportWait(pNewportRegs);
x = pbox->x1 & RA8_MASK; /* move x to 4 byte boundary */
- base = (unsigned long*)pNewport->ShadowPtr
- + (pbox->y1 * (pNewport->ShadowPitch >> RA8_PIXEL_SHIFT) )
- + ( x >> RA8_PIXEL_SHIFT);
+ base = pNewport->ShadowPtr
+ + (pbox->y1 * (pNewport->ShadowPitch >> RA8_BYTE_SHIFT) )
+ + ( x >> RA8_BYTE_SHIFT);
pNewportRegs->set.xystarti = (x << 16) | pbox->y1;
- pNewportRegs->set.xyendi = (pbox->x2 << 16) | pbox->y2;
+ pNewportRegs->set.xyendi = ((pbox->x2-1) << 16) | (pbox->y2-1);
- for ( dy = pbox->y1; dy <= pbox->y2; dy++) {
+ for ( dy = pbox->y1; dy < pbox->y2; dy++) {
src = base;
- for ( dx = x; dx <= pbox->x2; dx += RA8_PIXELS) {
+ for ( dx = x; dx < pbox->x2; dx += RA8_BYTES) {
pNewportRegs->go.hostrw0 = *src;
src++;
}
- base += ( pNewport->ShadowPitch >> RA8_PIXEL_SHIFT );
+ base += ( pNewport->ShadowPitch >> RA8_BYTE_SHIFT );
}
pbox++;
}
TRACE_EXIT("NewportRefreshArea8");
}
+
void
NewportRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
{
- NewportPtr pNewport = NEWPORTPTR(pScrn);
- NewportRegsPtr pNewportRegs = pNewport->pNewportRegs;
int dx, dy;
CARD8 *src, *base;
CARD32 dest;
+ NewportPtr pNewport = NEWPORTPTR(pScrn);
+ NewportRegsPtr pNewportRegs = pNewport->pNewportRegs;
TRACE_ENTER("NewportRefreshArea24");
NewportWait(pNewportRegs);
@@ -67,11 +68,14 @@
base = (CARD8*)pNewport->ShadowPtr + pbox->y1 * pNewport->ShadowPitch + pbox->x1 * 3;
pNewportRegs->set.xystarti = (pbox->x1 << 16) | pbox->y1;
- pNewportRegs->set.xyendi = (pbox->x2 << 16) | pbox->y2;
+ pNewportRegs->set.xyendi = ((pbox->x2-1) << 16) | (pbox->y2-1);
- for ( dy = pbox->y1; dy <= pbox->y2; dy++) {
+ for ( dy = pbox->y1; dy < pbox->y2; dy++) {
src = base;
- for ( dx = pbox->x1 ; dx <= pbox->x2 ; dx++) {
+ for ( dx = pbox->x1 ; dx < pbox->x2 ; dx++) {
+ /* Removing these shifts by using 32bpp fb
+ * yields < 2% percent performance gain and wastes 25% memory
+ */
dest = src[0] | src[1] << 8 | src[2] << 16;
pNewportRegs->go.hostrw0 = dest;
src+=3;
@@ -82,3 +86,4 @@
}
TRACE_EXIT("NewportRefreshArea24");
}
+
Index: xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c
===================================================================
RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c,v
retrieving revision 1.19
diff -u -r1.19 xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c
--- xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c 2002/01/04 21:22:33 1.19
+++ xc/programs/Xserver/hw/xfree86/drivers/newport/newport_driver.c 2002/07/15 23:23:03
@@ -600,8 +601,15 @@
Bool unblank;
unsigned short treg;
+ if (!pScreen)
+ return TRUE;
+
unblank = xf86IsUnblank(mode);
pScrn = xf86Screens[pScreen->myNum];
+
+ if (!pScrn->vtSema)
+ return TRUE;
+
pNewportRegs = NEWPORTPTR(pScrn)->pNewportRegs;
if (unblank) {
Index: xc/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c
===================================================================
RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c,v
retrieving revision 1.2
diff -u -p -u -r1.2 newport_cmap.c
--- xc/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c 2001/11/23 19:50:45 1.2
+++ xc/programs/Xserver/hw/xfree86/drivers/newport/newport_cmap.c 2002/04/23 10:15:33
@@ -33,12 +33,33 @@ void NewportBackupPalette(ScrnInfoPtr pS
}
}
+#ifdef linux
+/* stolen from kernel :) */
+static unsigned char color_table[] = { 0, 4, 2, 6, 1, 5, 3, 7,
+ 8,12,10,14, 9,13,11,15 };
+
+/* the default colour table, for VGA+ colour systems */
+static int default_red[] = {0x00,0xaa,0x00,0xaa,0x00,0xaa,0x00,0xaa,
+ 0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff};
+static int default_grn[] = {0x00,0x00,0xaa,0x55,0x00,0x00,0xaa,0xaa,
+ 0x55,0x55,0xff,0xff,0x55,0x55,0xff,0xff};
+static int default_blu[] = {0x00,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,
+ 0x55,0x55,0x55,0x55,0xff,0xff,0xff,0xff};
+#endif
+
/* restore the default colormap */
void NewportRestorePalette(ScrnInfoPtr pScrn)
{
int i;
NewportPtr pNewport = NEWPORTPTR(pScrn);
+#ifdef linux
+ for (i = 0; i < 16; i++) {
+ pNewport->txt_colormap[color_table[i]].red = default_red[i];
+ pNewport->txt_colormap[color_table[i]].green = default_grn[i];
+ pNewport->txt_colormap[color_table[i]].blue = default_blu[i];
+ }
+#endif
for(i = 0; i < 256; i++) {
NewportCmapSetRGB(pNewport->pNewportRegs, i, pNewport->txt_colormap[i]);
}
Reply to: