[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-video-savage: Changes to 'upstream-unstable'



 src/savage_bci.h    |    6 ++
 src/savage_driver.c |    3 -
 src/savage_exa.c    |  142 ++++++++++++++++++++++++++++++++++------------------
 3 files changed, 101 insertions(+), 50 deletions(-)

New commits:
commit ff0ee0420bd7c0c1be5bf97e8764f3e974ff5887
Author: Alex Deucher <alex@botch2.com>
Date:   Mon Apr 2 17:32:02 2007 -0400

    final odds and ends for exa
    
    I still get blue for solids that should be grey for certain things
    (firefox status and navigation bars, certain mouse overs, etc.)

diff --git a/src/savage_exa.c b/src/savage_exa.c
index 80cd58e..aa6905a 100644
--- a/src/savage_exa.c
+++ b/src/savage_exa.c
@@ -197,7 +197,7 @@ SavageEXAInit(ScreenPtr pScreen)
     /* Composite not implemented yet */
     /* savage3d series only have one tmu */
 
-#if 0
+#if 1
     /* host data blit */
     psav->EXADriverPtr->UploadToScreen = SavageUploadToScreen;
 #endif
@@ -283,10 +283,40 @@ SavagePrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
     cmd = BCI_CMD_RECT
         | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
         | BCI_CMD_DEST_PBD /*BCI_CMD_DEST_PBD_NEW*/
-	| BCI_CMD_SRC_SOLID
-	| BCI_CMD_SEND_COLOR;
+	| BCI_CMD_SRC_SOLID;
+
+#if 0
+    if (alu == 3 /*GXcopy*/) {
+	if (fg == 0)
+	    alu = 0 /*GXclear*/;
+	else if (fg == planemask)
+	    alu = 15 /*GXset*/;
+    }
 
+    if (EXA_PM_IS_SOLID(&pPixmap->drawable, planemask)) {
+	if (!((alu == 5 /*GXnoop*/) || (alu == 15 /*GXset*/) || (alu == 0 /*GXclear*/) || (alu == 10 /*GXinvert*/))) 
+	   cmd |= BCI_CMD_SEND_COLOR;
+	rop = SavageGetCopyROP(alu);
+    } else {	
+	switch(alu) {
+	case 5  /*GXnoop*/:
+	    break;
+	case 15 /*GXset*/:
+	case 0  /*GXclear*/:
+	case 10 /*GXinvert*/:
+	    cmd |= BCI_CMD_SEND_COLOR;
+	    fg = planemask;
+	    break;
+	default:
+	    cmd |= BCI_CMD_SEND_COLOR;
+	    break;
+	}
+	rop = SavageGetSolidROP(alu);
+    }
+#else
+    cmd |= BCI_CMD_SEND_COLOR;
     rop = SavageGetSolidROP(alu);
+#endif
 
     BCI_CMD_SET_ROP( cmd, rop );
 
@@ -326,6 +356,10 @@ SavageSolid(PixmapPtr pPixmap, int x1, int y1, int x2, int y2)
     BCI_SEND(psav->SavedBciCmd);
     /*BCI_SEND(psav->pbd_offset);
     BCI_SEND(psav->pbd_high);*/
+#if 0
+    if ( psav->SavedBciCmd & BCI_CMD_SEND_COLOR )
+	BCI_SEND(psav->SavedFgColor);
+#endif
     BCI_SEND(psav->SavedFgColor);
     BCI_SEND(BCI_X_Y(x1, y1));
     BCI_SEND(BCI_W_H(w, h));
@@ -465,7 +499,7 @@ SavageUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, char *src, int
 	srcp++;
     }
 
-    exaWaitSync(pDst->drawable.pScreen);
+    /*exaWaitSync(pDst->drawable.pScreen);*/
 
     return TRUE;
 }

commit 675ff8177852732c6e9d52464f34d5fe867ac67e
Author: Alex Deucher <alex@botch2.com>
Date:   Wed Mar 21 02:14:16 2007 -0400

    Get Solid() working again
    
    You have to send color EVERY time.

diff --git a/src/savage_bci.h b/src/savage_bci.h
index 833a55d..410925d 100644
--- a/src/savage_bci.h
+++ b/src/savage_bci.h
@@ -118,6 +118,12 @@
 #define BCI_SET_REGISTER_COUNT(count) ((count) << 16)
 #define BCI_BITPLANE_WRITE_MASK	     0xD7
 #define BCI_BITPLANE_READ_MASK	     0xD8
+#define BCI_GBD_1		     0xE0
+#define BCI_GBD_2		     0xE1
+#define BCI_PBD_1		     0xE2
+#define BCI_PBD_2		     0xE3
+#define BCI_SBD_1		     0xE4
+#define BCI_SBD_2		     0xE5
 
 #define BCI_W_H(w, h)                ((((h) << 16) | (w)) & 0x0FFF0FFF)
 #define BCI_X_Y(x, y)                ((((y) << 16) | (x)) & 0x0FFF0FFF)
diff --git a/src/savage_exa.c b/src/savage_exa.c
index 59412ef..80cd58e 100644
--- a/src/savage_exa.c
+++ b/src/savage_exa.c
@@ -197,11 +197,11 @@ SavageEXAInit(ScreenPtr pScreen)
     /* Composite not implemented yet */
     /* savage3d series only have one tmu */
 
-#if 1
+#if 0
     /* host data blit */
     psav->EXADriverPtr->UploadToScreen = SavageUploadToScreen;
 #endif
-#if 1
+#if 0
     psav->EXADriverPtr->DownloadFromScreen = SavageDownloadFromScreen;
 #endif
 
@@ -273,17 +273,22 @@ SavagePrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
 {
     ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
     SavagePtr psav = SAVPTR(pScrn);
-    int cmd;
+    int cmd, rop;
     BCI_GET_PTR;
 
-    /*ErrorF("in preparesolid\n");*/
+    /* HW seems to ignore alpha */
+    if (pPixmap->drawable.bitsPerPixel == 32)
+	return FALSE;
 
     cmd = BCI_CMD_RECT
         | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
-        | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_SOLID
+        | BCI_CMD_DEST_PBD /*BCI_CMD_DEST_PBD_NEW*/
+	| BCI_CMD_SRC_SOLID
 	| BCI_CMD_SEND_COLOR;
-	
-    BCI_CMD_SET_ROP( cmd, SavageGetSolidROP(alu) );
+
+    rop = SavageGetSolidROP(alu);
+
+    BCI_CMD_SET_ROP( cmd, rop );
 
     psav->pbd_offset = exaGetPixmapOffset(pPixmap);
     psav->pbd_high = SavageSetBD(psav, pPixmap);
@@ -291,17 +296,18 @@ SavagePrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
     psav->SavedBciCmd = cmd;
     psav->SavedFgColor = fg;
 
-    psav->WaitQueue(psav,6);
+    psav->WaitQueue(psav,5);
 
     BCI_SEND(BCI_SET_REGISTER
 	     | BCI_SET_REGISTER_COUNT(1)
 	     | BCI_BITPLANE_WRITE_MASK);
     BCI_SEND(planemask);
 
-    BCI_SEND(psav->SavedBciCmd);
+    BCI_SEND(BCI_SET_REGISTER
+	     | BCI_SET_REGISTER_COUNT(2)
+	     | BCI_PBD_1);
     BCI_SEND(psav->pbd_offset);
     BCI_SEND(psav->pbd_high);
-    BCI_SEND(psav->SavedFgColor);
 
     return TRUE;
 }
@@ -314,11 +320,13 @@ SavageSolid(PixmapPtr pPixmap, int x1, int y1, int x2, int y2)
     int w = x2 - x1;
     int h = y2 - y1;
     BCI_GET_PTR;
-    
-    if( !w || !h )
-	return;
 
-    psav->WaitQueue(psav,2);
+    /* yes, it has to be done this way... */
+    psav->WaitQueue(psav,4);
+    BCI_SEND(psav->SavedBciCmd);
+    /*BCI_SEND(psav->pbd_offset);
+    BCI_SEND(psav->pbd_high);*/
+    BCI_SEND(psav->SavedFgColor);
     BCI_SEND(BCI_X_Y(x1, y1));
     BCI_SEND(BCI_W_H(w, h));
 

commit ee7c53ae2b6e167dd4d6e813bc565e991f6b73e3
Author: Alex Deucher <alex@botch2.com>
Date:   Tue Mar 6 02:28:33 2007 -0500

    small exa fix ups, remove an errant comment

diff --git a/src/savage_driver.c b/src/savage_driver.c
index 25694da..2c51770 100644
--- a/src/savage_driver.c
+++ b/src/savage_driver.c
@@ -4159,9 +4159,6 @@ void SavageLoadPaletteSavage4(ScrnInfoPtr pScrn, int numColors, int *indicies,
 }
 
 static void SavageCalcClock(long freq, int min_m, int min_n1, int max_n1,
-
-	/* Make sure linear addressing is enabled after the BIOS call. */
-	/* Note that we must use an I/O port to do this. */
 			   int min_n2, int max_n2, long freq_min,
 			   long freq_max, unsigned int *mdiv,
 			   unsigned int *ndiv, unsigned int *r)
diff --git a/src/savage_exa.c b/src/savage_exa.c
index 8e6da38..59412ef 100644
--- a/src/savage_exa.c
+++ b/src/savage_exa.c
@@ -95,29 +95,30 @@ static int SavageGetCopyROP(int rop) {
 
 }
 
-static int SavageGetCopyROP_PM(int rop) {
+static int SavageGetSolidROP(int rop) {
 
-    int ALUCopyROP_PM[16] =
+    int ALUSolidROP[16] =
     {
-       0x00, /*ROP_0*/		/* not used */
-       0x75, /*ROP_DSPnoa*/
-       0x45, /*ROP_DPSnaon*/
-       0xCA, /*ROP_DPSDxax*/
-       0xD5, /*ROP_DPSana*/
-       0xAA, /*ROP_D*/		/* not used */
-       0x6A, /*ROP_DPSax*/
-       0xEA, /*ROP_DPSao*/
-       0x15, /*ROP_DPSaon*/
-       0x95, /*ROP_DPSaxn*/
-       0x55, /*ROP_Dn*/		/* not used */
-       0xD5, /*ROP_DPSanan*/
-       0x2E, /*ROP_PSDPxox*/		/* is that correct ? */
-       0xBA, /*ROP_DPSnao*/
-       0x75, /*ROP_DSPnoan*/
-       0xFF, /*ROP_1*/		/* not used */
+    /* GXclear      */      0x00,         /* 0 */
+    /* GXand        */      0xA0,         /* src AND dst */
+    /* GXandReverse */      0x50,         /* src AND NOT dst */
+    /* GXcopy       */      0xF0,         /* src */
+    /* GXandInverted*/      0x0A,         /* NOT src AND dst */
+    /* GXnoop       */      0xAA,         /* dst */
+    /* GXxor        */      0x5A,         /* src XOR dst */
+    /* GXor         */      0xFA,         /* src OR dst */
+    /* GXnor        */      0x05,         /* NOT src AND NOT dst */
+    /* GXequiv      */      0xA5,         /* NOT src XOR dst */
+    /* GXinvert     */      0x55,         /* NOT dst */
+    /* GXorReverse  */      0xF5,         /* src OR NOT dst */
+    /* GXcopyInverted*/     0x0F,         /* NOT src */
+    /* GXorInverted */      0xAF,         /* NOT src OR dst */
+    /* GXnand       */      0x5F,         /* NOT src OR NOT dst */
+    /* GXset        */      0xFF,         /* 1 */
+
     };
 
-    return (ALUCopyROP_PM[rop]);
+    return (ALUSolidROP[rop]);
 
 }
 
@@ -171,14 +172,14 @@ SavageEXAInit(ScreenPtr pScreen)
 
     if (psav->Chipset == S3_SAVAGE2000 ||
 	psav->Chipset == S3_SUPERSAVAGE) {
-	psav->EXADriverPtr->pixmapOffsetAlign = 128; /* octword */
+	psav->EXADriverPtr->pixmapOffsetAlign = 16; /* octword */
     } else {
-	psav->EXADriverPtr->pixmapOffsetAlign = 64; /* qword */
+	psav->EXADriverPtr->pixmapOffsetAlign = 8; /* quadword */
     }
 
     /* engine has 12 bit coordinates */
-    psav->EXADriverPtr->maxX = 4095;
-    psav->EXADriverPtr->maxY = 4095;
+    psav->EXADriverPtr->maxX = 4096;
+    psav->EXADriverPtr->maxY = 4096;
 
     /* Sync */
     psav->EXADriverPtr->WaitMarker = SavageEXASync;
@@ -282,7 +283,7 @@ SavagePrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
         | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_SOLID
 	| BCI_CMD_SEND_COLOR;
 	
-    BCI_CMD_SET_ROP( cmd, SavageGetCopyROP(alu) );
+    BCI_CMD_SET_ROP( cmd, SavageGetSolidROP(alu) );
 
     psav->pbd_offset = exaGetPixmapOffset(pPixmap);
     psav->pbd_high = SavageSetBD(psav, pPixmap);
@@ -412,18 +413,19 @@ SavageUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, char *src, int
     ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
     SavagePtr psav = SAVPTR(pScrn);
     BCI_GET_PTR;
-    int i, j, dwords, Bpp;
+    int i, j, dwords, queue, Bpp;
     unsigned int cmd;
     CARD32 * srcp; 
     
     Bpp = pDst->drawable.bitsPerPixel / 8;
-    dwords = ((w * Bpp) + 3) >> 2;
+    dwords = (((w * Bpp) + 3) >> 2) * h;
 
     psav->sbd_offset = exaGetPixmapOffset(pDst);
     psav->sbd_high = SavageSetBD(psav, pDst);
 
     cmd = BCI_CMD_RECT
 	| BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
+        | BCI_CMD_CLIP_LR
         | BCI_CMD_DEST_SBD_NEW
         | BCI_CMD_SRC_COLOR; /* host color data */
 
@@ -442,17 +444,21 @@ SavageUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, char *src, int
     BCI_SEND(BCI_X_Y(x, y));
     BCI_SEND(BCI_W_H(w, h));
     
-    for (i = 0; i < h; i++) {
-	srcp = (CARD32 *)src;
-	BCI_RESET;
-	for (j = dwords; j > 0; j--) {
-	    CARD32 dw = *srcp;
-	    BCI_SEND(dw);
-	    srcp++;
+    srcp = (CARD32 *)src;
+    queue = 120 * 1024;
+    while (dwords) {
+	if (queue < 4) {
+	    BCI_RESET;
+	    queue = 120 * 1024;
 	}
-	src += src_pitch;
+	BCI_SEND(*srcp);
+	queue -= 4;
+	dwords--;
+	srcp++;
     }
 
+    exaWaitSync(pDst->drawable.pScreen);
+
     return TRUE;
 }
 



Reply to: