diff options
author | Alex Deucher <alex@botch2.com> | 2008-06-25 15:50:16 -0400 |
---|---|---|
committer | Alex Deucher <alex@botch2.com> | 2008-06-25 15:50:16 -0400 |
commit | bb1cfcbfbc1ace1f257fc3bf6401501f1a6da827 (patch) | |
tree | 6746eec8ae2caa8f704692d9dc5b0d61bc428c08 | |
parent | 07be302f6dba61dd15918963fae66502230c74b7 (diff) |
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)
-rw-r--r-- | src/radeon_exa.c | 2 | ||||
-rw-r--r-- | src/radeon_exa_funcs.c | 30 | ||||
-rw-r--r-- | src/radeon_exa_render.c | 17 | ||||
-rw-r--r-- | src/radeon_textured_videofuncs.c | 13 |
4 files changed, 37 insertions, 25 deletions
diff --git a/src/radeon_exa.c b/src/radeon_exa.c index 0193a289..f461f3ca 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 29f7c36e..56de23e6 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 2319e3bb..8a1849c7 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 d5d1b1cf..f0dad03f 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); } |