summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/radeon_exa_render.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c
index 2bc2c659..c1ea4d2c 100644
--- a/src/radeon_exa_render.c
+++ b/src/radeon_exa_render.c
@@ -1888,8 +1888,10 @@ static void FUNC_NAME(RadeonComposite)(PixmapPtr pDst,
RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE |
(4 << RADEON_CP_VC_CNTL_NUM_SHIFT));
} else {
- if (IS_R300_3D || IS_R500_3D)
+ if (IS_R300_3D)
BEGIN_RING(4 * vtx_count + 4);
+ else if (IS_R500_3D)
+ BEGIN_RING(4 * vtx_count + 6);
else
BEGIN_RING(4 * vtx_count + 2);
@@ -1901,8 +1903,10 @@ static void FUNC_NAME(RadeonComposite)(PixmapPtr pDst,
}
#else /* ACCEL_CP */
- if (IS_R300_3D || IS_R500_3D)
+ if (IS_R300_3D)
BEGIN_ACCEL(2 + vtx_count * 4);
+ else if (IS_R500_3D)
+ BEGIN_ACCEL(3 + vtx_count * 4);
else
BEGIN_ACCEL(1 + vtx_count * 4);
@@ -1931,9 +1935,14 @@ static void FUNC_NAME(RadeonComposite)(PixmapPtr pDst,
xFixedToFloat(srcTopRight.x) / info->texW[0], xFixedToFloat(srcTopRight.y) / info->texH[0],
xFixedToFloat(maskTopRight.x) / info->texW[1], xFixedToFloat(maskTopRight.y) / info->texH[1]);
- if (IS_R300_3D || IS_R500_3D)
+ if (IS_R300_3D)
/* flushing is pipelined, free/finish is not */
OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D);
+ else if (IS_R500_3D) {
+ /* r500 shows corruption on small things like glyphs without a 3D idle */
+ OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D);
+ OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
+ }
#ifdef ACCEL_CP
ADVANCE_RING();