xf86-video-ati: Branch 'master' - 6 commits

Michel Daenzer daenzer at kemper.freedesktop.org
Tue Mar 20 10:17:23 EET 2007


 src/atidri.c            |    4 ++--
 src/r128_dri.c          |    4 ++--
 src/radeon.h            |   20 ++++++++++++--------
 src/radeon_accelfuncs.c |   10 ++++++++--
 src/radeon_dri.c        |   20 ++++----------------
 src/radeon_driver.c     |   25 +++++++++++++++++--------
 src/radeon_exa_funcs.c  |   23 +++++++++++++++++++++--
 7 files changed, 66 insertions(+), 40 deletions(-)

New commits:
diff-tree 166c760a86165330175023e07c4b2bd6891633c5 (from 1bdd376dbd57de8925244f0808f974d6d8cff39d)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Tue Mar 20 09:16:02 2007 +0100

    Fix advertised minimum minor version of the DRI module.
    
    We don't automatically require bumped minor versions.

diff --git a/src/atidri.c b/src/atidri.c
index 83cb25f..d4fbead 100644
--- a/src/atidri.c
+++ b/src/atidri.c
@@ -1197,13 +1197,13 @@ Bool ATIDRIScreenInit( ScreenPtr pScreen
 
    /* Check the DRI version */
    DRIQueryVersion( &major, &minor, &patch );
-   if ( major != DRIINFO_MAJOR_VERSION || minor < DRIINFO_MINOR_VERSION ) {
+   if ( major != DRIINFO_MAJOR_VERSION || minor < 0 ) {
       xf86DrvMsg( pScreen->myNum, X_ERROR,
 		  "[dri] ATIDRIScreenInit failed because of a version mismatch.\n"
 		  "[dri] libdri version is %d.%d.%d but version %d.%d.x is needed.\n"
 		  "[dri] Disabling the DRI.\n",
 		  major, minor, patch,
-                  DRIINFO_MAJOR_VERSION, DRIINFO_MINOR_VERSION );
+                  DRIINFO_MAJOR_VERSION, 0 );
       return FALSE;
    }
 
diff --git a/src/r128_dri.c b/src/r128_dri.c
index 21a13c1..fc91421 100644
--- a/src/r128_dri.c
+++ b/src/r128_dri.c
@@ -988,13 +988,13 @@ Bool R128DRIScreenInit(ScreenPtr pScreen
 
     /* Check the DRI version */
     DRIQueryVersion(&major, &minor, &patch);
-    if (major != DRIINFO_MAJOR_VERSION || minor < DRIINFO_MINOR_VERSION) {
+    if (major != DRIINFO_MAJOR_VERSION || minor < 0) {
 	xf86DrvMsg(pScreen->myNum, X_ERROR,
 		"[dri] R128DRIScreenInit failed because of a version mismatch.\n"
 		"[dri] libdri version is %d.%d.%d but version %d.%d.x is needed.\n"
 		"[dri] Disabling the DRI.\n",
 		major, minor, patch,
-                DRIINFO_MAJOR_VERSION, DRIINFO_MINOR_VERSION);
+                DRIINFO_MAJOR_VERSION, 0);
 	return FALSE;
     }
 
diff --git a/src/radeon_dri.c b/src/radeon_dri.c
index 7ebf958..b09a8cf 100644
--- a/src/radeon_dri.c
+++ b/src/radeon_dri.c
@@ -1244,7 +1244,7 @@ Bool RADEONDRIGetVersion(ScrnInfoPtr pSc
 
     /* Check the DRI version */
     DRIQueryVersion(&major, &minor, &patch);
-    if (major != DRIINFO_MAJOR_VERSION || minor < DRIINFO_MINOR_VERSION) {
+    if (major != DRIINFO_MAJOR_VERSION || minor < 0) {
 	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
 		   "[dri] RADEONDRIGetVersion failed because of a version "
 		   "mismatch.\n"
@@ -1252,7 +1252,7 @@ Bool RADEONDRIGetVersion(ScrnInfoPtr pSc
 		   "needed.\n"
 		   "[dri] Disabling DRI.\n",
 		   major, minor, patch,
-                   DRIINFO_MAJOR_VERSION, DRIINFO_MINOR_VERSION);
+                   DRIINFO_MAJOR_VERSION, 0);
 	return FALSE;
     }
 
diff-tree 1bdd376dbd57de8925244f0808f974d6d8cff39d (from 3cfa3a5c8daf03aaad6fc30d275709f6eb717d29)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Tue Mar 20 09:14:39 2007 +0100

    radeon: Only sync to hardware when really necessary with EXA.
    
    In particular, don't sync again after accelerated DownloadFromScreen, which
    syncs implicitly. This avoids calling into the kernel when it's not necessary,
    which can be relevant in some situations.

diff --git a/src/radeon.h b/src/radeon.h
index 8d0115e..ce2fe19 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -497,6 +497,8 @@ typedef struct {
 
 #ifdef USE_EXA
     ExaDriverPtr      exa;
+    int               exaSyncMarker;
+    int               exaMarkerSynced;
     int               engineMode;
 #define EXA_ENGINEMODE_UNKNOWN 0
 #define EXA_ENGINEMODE_2D      1
diff --git a/src/radeon_exa_funcs.c b/src/radeon_exa_funcs.c
index 0d847d1..c356de7 100644
--- a/src/radeon_exa_funcs.c
+++ b/src/radeon_exa_funcs.c
@@ -59,14 +59,30 @@
 
 #include "exa.h"
 
+static int
+FUNC_NAME(RADEONMarkSync)(ScreenPtr pScreen)
+{
+    RINFO_FROM_SCREEN(pScreen);
+
+    TRACE;
+
+    return ++info->exaSyncMarker;
+}
+
 static void
 FUNC_NAME(RADEONSync)(ScreenPtr pScreen, int marker)
 {
+    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+    RADEONInfoPtr info = RADEONPTR(pScrn);
+
     TRACE;
 
-    FUNC_NAME(RADEONWaitForIdle)(xf86Screens[pScreen->myNum]);
+    if (info->exaMarkerSynced != marker) {
+	FUNC_NAME(RADEONWaitForIdle)(pScrn);
+	info->exaMarkerSynced = marker;
+    }
 
-    RADEONPTR(xf86Screens[pScreen->myNum])->engineMode = EXA_ENGINEMODE_UNKNOWN;
+    RADEONPTR(pScrn)->engineMode = EXA_ENGINEMODE_UNKNOWN;
 }
 
 static Bool
@@ -444,6 +460,8 @@ FUNC_NAME(RADEONDownloadFromScreen)(Pixm
 	drmCommandWriteRead(info->drmFD, DRM_RADEON_INDIRECT,
 			    &indirect, sizeof(drmRadeonIndirect));
 
+	info->exaMarkerSynced = info->exaSyncMarker;
+
 	return TRUE;
     }
 #endif
@@ -504,6 +522,7 @@ Bool FUNC_NAME(RADEONDrawInit)(ScreenPtr
     info->exa->Copy = FUNC_NAME(RADEONCopy);
     info->exa->DoneCopy = FUNC_NAME(RADEONDoneCopy);
 
+    info->exa->MarkSync = FUNC_NAME(RADEONMarkSync);
     info->exa->WaitMarker = FUNC_NAME(RADEONSync);
     info->exa->UploadToScreen = FUNC_NAME(RADEONUploadToScreen);
     info->exa->DownloadFromScreen = FUNC_NAME(RADEONDownloadFromScreen);
diff-tree 3cfa3a5c8daf03aaad6fc30d275709f6eb717d29 (from e174d8df8c801fad95e5f79cff69187c200bee6e)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Tue Mar 20 09:13:24 2007 +0100

    radeon: Unify code to release the CP.

diff --git a/src/radeon.h b/src/radeon.h
index 5bb005b..8d0115e 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -964,6 +964,16 @@ do {									\
     info->CPStarted = TRUE;                                             \
 } while (0)
 
+#define RADEONCP_RELEASE(pScrn, info)					\
+do {									\
+    if (info->CPInUse) {						\
+	RADEON_PURGE_CACHE();						\
+	RADEON_WAIT_UNTIL_IDLE();					\
+	RADEONCPReleaseIndirect(pScrn);					\
+	info->CPInUse = FALSE;						\
+    }									\
+} while (0)
+
 #define RADEONCP_STOP(pScrn, info)					\
 do {									\
     int _ret;								\
@@ -1128,14 +1138,6 @@ do {									\
     ADVANCE_RING();							\
 } while (0)
 
-#define RADEON_FLUSH_CACHE()						\
-do {									\
-    BEGIN_RING(2);							\
-    OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0));		\
-    OUT_RING(RADEON_RB3D_DC_FLUSH);					\
-    ADVANCE_RING();							\
-} while (0)
-
 #define RADEON_PURGE_CACHE()						\
 do {									\
     BEGIN_RING(2);							\
diff --git a/src/radeon_dri.c b/src/radeon_dri.c
index ee6192e..7ebf958 100644
--- a/src/radeon_dri.c
+++ b/src/radeon_dri.c
@@ -409,13 +409,7 @@ static void RADEONLeaveServer(ScreenPtr 
     /* The CP is always running, but if we've generated any CP commands
      * we must flush them to the kernel module now.
      */
-    if (info->CPInUse) {
-	RADEON_FLUSH_CACHE();
-	RADEON_WAIT_UNTIL_IDLE();
-	RADEONCPReleaseIndirect(pScrn);
-
-	info->CPInUse = FALSE;
-    }
+    RADEONCP_RELEASE(pScrn, info);
 
 #ifdef USE_EXA
     info->engineMode = EXA_ENGINEMODE_UNKNOWN;
@@ -1703,13 +1697,7 @@ void RADEONDRIStop(ScreenPtr pScreen)
 	/* If we've generated any CP commands, we must flush them to the
 	 * kernel module now.
 	 */
-	if (info->CPInUse) {
-	    RADEON_FLUSH_CACHE();
-	    RADEON_WAIT_UNTIL_IDLE();
-	    RADEONCPReleaseIndirect(pScrn);
-
-	    info->CPInUse = FALSE;
-	}
+	RADEONCP_RELEASE(pScrn, info);
 	RADEONCP_STOP(pScrn, info);
     }
     info->directRenderingInited = FALSE;
diff-tree e174d8df8c801fad95e5f79cff69187c200bee6e (from 113fb4b61e709a9b54fc2ef73efce06011e771c1)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Tue Mar 20 09:12:51 2007 +0100

    radeon: Minor BlockHandler cleanups.
    
    Don't flush indirect buffer in BlockHandler; it's done in LeaveServer.
    
    Also set the EXA engine mode to unknown only at the end.

diff --git a/src/radeon_driver.c b/src/radeon_driver.c
index 4842542..9ed0d6c 100644
--- a/src/radeon_driver.c
+++ b/src/radeon_driver.c
@@ -3404,14 +3404,6 @@ static void RADEONBlockHandler(int i, po
     ScrnInfoPtr    pScrn   = xf86Screens[i];
     RADEONInfoPtr  info    = RADEONPTR(pScrn);
 
-#ifdef XF86DRI
-    if (info->directRenderingInited) {
-	FLUSH_RING();
-    }
-#endif
-#ifdef USE_EXA
-    info->engineMode = EXA_ENGINEMODE_UNKNOWN;
-#endif
     pScreen->BlockHandler = info->BlockHandler;
     (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask);
     pScreen->BlockHandler = RADEONBlockHandler;
@@ -3423,6 +3415,10 @@ static void RADEONBlockHandler(int i, po
     if(info->RenderCallback)
 	(*info->RenderCallback)(pScrn);
 #endif
+
+#ifdef USE_EXA
+    info->engineMode = EXA_ENGINEMODE_UNKNOWN;
+#endif
 }
 
 
diff-tree 113fb4b61e709a9b54fc2ef73efce06011e771c1 (from 4651d00b183cb498879d605c4b93cd3a0c63cb33)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Tue Mar 20 09:12:09 2007 +0100

    radeon: Disable CP line acceleration on RV280s.
    
    There have been several reports of stability issues with things like the
    xscreensaver hack hypercube.

diff --git a/src/radeon_accelfuncs.c b/src/radeon_accelfuncs.c
index 784b074..212131f 100644
--- a/src/radeon_accelfuncs.c
+++ b/src/radeon_accelfuncs.c
@@ -1204,8 +1204,14 @@ FUNC_NAME(RADEONAccelInit)(ScreenPtr pSc
        hardware accel two point lines */
     miSetZeroLineBias(pScreen, (OCTANT5 | OCTANT6 | OCTANT7 | OCTANT8));
 
-    a->SubsequentSolidTwoPointLine
-	= FUNC_NAME(RADEONSubsequentSolidTwoPointLine);
+#ifdef ACCEL_CP
+    /* RV280s lock up with this using the CP for reasons to be determined.
+     * See https://bugs.freedesktop.org/show_bug.cgi?id=5986 .
+     */
+    if (info->ChipFamily != CHIP_FAMILY_RV280)
+#endif
+	a->SubsequentSolidTwoPointLine
+	    = FUNC_NAME(RADEONSubsequentSolidTwoPointLine);
 
     /* Disabled on RV200 and newer because it does not pass XTest */
     if (info->ChipFamily < CHIP_FAMILY_RV200) {
diff-tree 4651d00b183cb498879d605c4b93cd3a0c63cb33 (from 2d2fb54ba370c1df9ef5102e83c17a7ff5c55403)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Tue Mar 20 09:10:19 2007 +0100

    radeon: Make sure 3D clients will re-upload textures to video RAM after LeaveVT.
    
    Walk the SAREA texList and bump the age of every active object, so their owners
    will consider them kicked out when they grab the HW lock next time.

diff --git a/src/radeon_driver.c b/src/radeon_driver.c
index ca0b201..4842542 100644
--- a/src/radeon_driver.c
+++ b/src/radeon_driver.c
@@ -6874,6 +6874,19 @@ _X_EXPORT void RADEONLeaveVT(int scrnInd
             /* we need to backup the PCIE GART TABLE from fb memory */
             memcpy(info->pciGartBackup, (info->FB + info->pciGartOffset), info->pciGartSize);
         }
+
+	/* Make sure 3D clients will re-upload textures to video RAM */
+	if (info->textureSize) {
+	    RADEONSAREAPrivPtr pSAREAPriv =
+		(RADEONSAREAPrivPtr)DRIGetSAREAPrivate(pScrn->pScreen);
+	    drmTextureRegionPtr list = pSAREAPriv->texList[0];
+	    int age = ++pSAREAPriv->texAge[0], i = 0;
+
+	    do {
+		list[i].age = age;
+		i = list[i].next;
+	    } while (i != 0);
+	}
     }
 #endif
 



More information about the xorg-commit mailing list