xf86-video-ati: Branch 'master'

Alex Deucher agd5f at kemper.freedesktop.org
Wed Jun 25 12:50:28 PDT 2008


 src/radeon_exa.c                 |    2 +-
 src/radeon_exa_funcs.c           |   30 ++++++++++++++++++------------
 src/radeon_exa_render.c          |   17 ++++++-----------
 src/radeon_textured_videofuncs.c |   13 ++++++++++++-
 4 files changed, 37 insertions(+), 25 deletions(-)

New commits:
commit bb1cfcbfbc1ace1f257fc3bf6401501f1a6da827
Author: Alex Deucher <alex at botch2.com>
Date:   Wed Jun 25 15:50:16 2008 -0400

    RADEON: adjustments to Jerome's last commit
    
    - Flush caches and wait for idle after drawing
    - Make sure 3D is idle too (after composite or textured video)

diff --git a/src/radeon_exa.c b/src/radeon_exa.c
index 0193a28..f461f3c 100644
--- a/src/radeon_exa.c
+++ b/src/radeon_exa.c
@@ -323,7 +323,7 @@ do {									\
 	case EXA_ENGINEMODE_UNKNOWN:					\
 	    wait_until |= RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN;	\
 	case EXA_ENGINEMODE_2D:						\
-	    wait_until |= RADEON_WAIT_2D_IDLECLEAN;			\
+	    wait_until |= RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE;		\
 	case EXA_ENGINEMODE_3D:						\
 	    break;							\
 	}								\
diff --git a/src/radeon_exa_funcs.c b/src/radeon_exa_funcs.c
index 29f7c36..56de23e 100644
--- a/src/radeon_exa_funcs.c
+++ b/src/radeon_exa_funcs.c
@@ -116,11 +116,6 @@ FUNC_NAME(RADEONPrepareSolid)(PixmapPtr pPix, int alu, Pixel pm, Pixel fg)
 	(RADEON_DST_X_LEFT_TO_RIGHT | RADEON_DST_Y_TOP_TO_BOTTOM));
     OUT_ACCEL_REG(RADEON_DST_PITCH_OFFSET, dst_pitch_offset);
     FINISH_ACCEL();
-    BEGIN_ACCEL(2);
-    OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL);
-    OUT_ACCEL_REG(RADEON_WAIT_UNTIL,
-                  RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE);
-    FINISH_ACCEL();
 
     return TRUE;
 }
@@ -129,7 +124,6 @@ FUNC_NAME(RADEONPrepareSolid)(PixmapPtr pPix, int alu, Pixel pm, Pixel fg)
 static void
 FUNC_NAME(RADEONSolid)(PixmapPtr pPix, int x1, int y1, int x2, int y2)
 {
-
     RINFO_FROM_SCREEN(pPix->drawable.pScreen);
     ACCEL_PREAMBLE();
 
@@ -144,7 +138,16 @@ FUNC_NAME(RADEONSolid)(PixmapPtr pPix, int x1, int y1, int x2, int y2)
 static void
 FUNC_NAME(RADEONDoneSolid)(PixmapPtr pPix)
 {
+    RINFO_FROM_SCREEN(pPix->drawable.pScreen);
+    ACCEL_PREAMBLE();
+
     TRACE;
+
+    BEGIN_ACCEL(2);
+    OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL);
+    OUT_ACCEL_REG(RADEON_WAIT_UNTIL,
+                  RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE);
+    FINISH_ACCEL();
 }
 
 void
@@ -174,11 +177,6 @@ FUNC_NAME(RADEONDoPrepareCopy)(ScrnInfoPtr pScrn, uint32_t src_pitch_offset,
     OUT_ACCEL_REG(RADEON_DST_PITCH_OFFSET, dst_pitch_offset);
     OUT_ACCEL_REG(RADEON_SRC_PITCH_OFFSET, src_pitch_offset);
     FINISH_ACCEL();
-    BEGIN_ACCEL(2);
-    OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL);
-    OUT_ACCEL_REG(RADEON_WAIT_UNTIL,
-                  RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE);
-    FINISH_ACCEL();
 }
 
 static Bool
@@ -216,7 +214,6 @@ FUNC_NAME(RADEONCopy)(PixmapPtr pDst,
 		      int dstX, int dstY,
 		      int w, int h)
 {
-
     RINFO_FROM_SCREEN(pDst->drawable.pScreen);
     ACCEL_PREAMBLE();
 
@@ -243,7 +240,16 @@ FUNC_NAME(RADEONCopy)(PixmapPtr pDst,
 static void
 FUNC_NAME(RADEONDoneCopy)(PixmapPtr pDst)
 {
+    RINFO_FROM_SCREEN(pDst->drawable.pScreen);
+    ACCEL_PREAMBLE();
+
     TRACE;
+
+    BEGIN_ACCEL(2);
+    OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL);
+    OUT_ACCEL_REG(RADEON_WAIT_UNTIL,
+                  RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE);
+    FINISH_ACCEL();
 }
 
 static Bool
diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c
index 2319e3b..8a1849c 100644
--- a/src/radeon_exa_render.c
+++ b/src/radeon_exa_render.c
@@ -2114,18 +2114,13 @@ static void FUNC_NAME(RadeonDoneComposite)(PixmapPtr pDst)
 
     ENTER_DRAW(0);
 
-    if (IS_R500_3D || ((info->ChipFamily == CHIP_FAMILY_RS400) ||
-		       (info->ChipFamily == CHIP_FAMILY_RS480) ||
-		       (info->ChipFamily == CHIP_FAMILY_RS600) ||
-		       (info->ChipFamily == CHIP_FAMILY_RS690) ||
-		       (info->ChipFamily == CHIP_FAMILY_RS740))) {
-	/* r500 shows corruption on small things like glyphs without a 3D idle 
-	 * IGP shows more substantial corruption
-	 */
+    if (IS_R300_3D | IS_R500_3D) {
+	BEGIN_ACCEL(2);
+	OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DC_FLUSH_ALL);
+    } else
 	BEGIN_ACCEL(1);
-	OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
-	FINISH_ACCEL();
-    }
+    OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
+    FINISH_ACCEL();
 
     LEAVE_DRAW(0);
 }
diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c
index d5d1b1c..f0dad03 100644
--- a/src/radeon_textured_videofuncs.c
+++ b/src/radeon_textured_videofuncs.c
@@ -117,7 +117,10 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
 	OUT_VIDEO_REG(RADEON_RB3D_DSTCACHE_CTLSTAT, RADEON_RB3D_DC_FLUSH);
     /* We must wait for 3d to idle, in case source was just written as a dest. */
     OUT_VIDEO_REG(RADEON_WAIT_UNTIL,
-		RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN);
+		  RADEON_WAIT_HOST_IDLECLEAN |
+		  RADEON_WAIT_2D_IDLECLEAN |
+		  RADEON_WAIT_3D_IDLECLEAN |
+		  RADEON_WAIT_DMA_GUI_IDLE);
     FINISH_VIDEO();
 
     if (IS_R300_3D || IS_R500_3D) {
@@ -640,6 +643,14 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
 	pBox++;
     }
 
+    if (IS_R300_3D | IS_R500_3D) {
+	BEGIN_VIDEO(2);
+	OUT_VIDEO_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DC_FLUSH_ALL);
+    } else
+	BEGIN_VIDEO(1);
+    OUT_VIDEO_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
+    FINISH_VIDEO();
+
     DamageDamageRegion(pPriv->pDraw, &pPriv->clip);
 }
 


More information about the xorg-commit mailing list