Index: radeon.h =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h,v retrieving revision 1.7 diff -u -r1.7 radeon.h --- radeon.h 30 Jul 2004 22:20:21 -0000 1.7 +++ radeon.h 11 Aug 2004 08:12:16 -0000 @@ -553,6 +553,7 @@ /* Render */ Bool RenderAccel; + Bool RenderInited3D; FBLinearPtr RenderTex; void (*RenderCallback)(ScrnInfoPtr); Time RenderTimeout; @@ -626,7 +627,6 @@ extern Bool RADEONAccelInit(ScreenPtr pScreen); extern void RADEONAccelInitMMIO(ScreenPtr pScreen, XAAInfoRecPtr a); -extern void RADEONInit3DEngineForRender(ScrnInfoPtr pScrn); extern void RADEONEngineInit(ScrnInfoPtr pScrn); extern Bool RADEONCursorInit(ScreenPtr pScreen); extern Bool RADEONDGAInit(ScreenPtr pScreen); Index: radeon_accel.c =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_accel.c,v retrieving revision 1.9 diff -u -r1.9 radeon_accel.c --- radeon_accel.c 9 Aug 2004 22:37:22 -0000 1.9 +++ radeon_accel.c 11 Aug 2004 08:19:30 -0000 @@ -313,12 +313,11 @@ OUTREG(RADEON_DP_SRC_BKGD_CLR, 0x00000000); OUTREG(RADEON_DP_WRITE_MASK, 0xffffffff); + RADEONWaitForIdleMMIO(pScrn); + #ifdef RENDER - if (info->RenderAccel) - RADEONInit3DEngineForRender(pScrn); + info->RenderInited3D = FALSE; #endif - - RADEONWaitForIdleMMIO(pScrn); } /* Initialize the acceleration hardware */ Index: radeon_dri.c =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c,v retrieving revision 1.6 diff -u -r1.6 radeon_dri.c --- radeon_dri.c 9 Aug 2004 22:37:22 -0000 1.6 +++ radeon_dri.c 11 Aug 2004 08:29:45 -0000 @@ -343,9 +343,17 @@ { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; RADEONInfoPtr info = RADEONPTR(pScrn); +#ifdef RENDER + RADEONSAREAPrivPtr pSAREAPriv; +#endif if (info->accel) info->accel->NeedToSync = TRUE; +#ifdef RENDER + pSAREAPriv = DRIGetSAREAPrivate(pScrn->pScreen); + if (pSAREAPriv->ctxOwner != DRIGetContext(pScrn->pScreen)) + info->RenderInited3D = FALSE; +#endif } /* Called when the X server goes to sleep to allow the X server's Index: radeon_render.c =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_render.c,v retrieving revision 1.5 diff -u -r1.5 radeon_render.c --- radeon_render.c 9 Aug 2004 22:37:22 -0000 1.5 +++ radeon_render.c 11 Aug 2004 08:31:24 -0000 @@ -225,16 +225,22 @@ return bits - 1; } -void RADEONInit3DEngineForRender(ScrnInfoPtr pScrn) +static void RadeonInit3DEngine(ScrnInfoPtr pScrn) { -#ifdef XF86DRI RADEONInfoPtr info = RADEONPTR (pScrn); - if (info->CPStarted) +#ifdef XF86DRI + if (info->directRenderingEnabled) { + RADEONSAREAPrivPtr pSAREAPriv; + + pSAREAPriv = DRIGetSAREAPrivate(pScrn->pScreen); + pSAREAPriv->ctxOwner = DRIGetContext(pScrn->pScreen); RadeonInit3DEngineCP(pScrn); - else + } else #endif RadeonInit3DEngineMMIO(pScrn); + + info->RenderInited3D = TRUE; } static void @@ -433,11 +439,8 @@ i = height; dst = (CARD8*)(info->FB + offset); - if (info->accel->NeedToSync) { + if (info->accel->NeedToSync) info->accel->Sync(pScrn); - if (info->CPStarted) - RADEONInit3DEngineForRender(pScrn); - } while(i--) { memcpy(dst, src, width * tex_bytepp); @@ -490,6 +493,9 @@ if (blend_cntl == 0) return FALSE; + if (!info->RenderInited3D) + RadeonInit3DEngine(pScrn); + if (!FUNC_NAME(R100SetupTexture)(pScrn, maskFormat, alphaPtr, alphaPitch, width, height, flags)) return FALSE; @@ -539,6 +545,9 @@ if (blend_cntl == 0) return FALSE; + if (!info->RenderInited3D) + RadeonInit3DEngine(pScrn); + if (!FUNC_NAME(R100SetupTexture)(pScrn, srcFormat, texPtr, texPitch, width, height, flags)) return FALSE; @@ -741,11 +750,8 @@ /* Upload texture to card. Should use ImageWrite to avoid syncing. */ i = height; dst = (CARD8*)(info->FB + offset); - if (info->accel->NeedToSync) { + if (info->accel->NeedToSync) info->accel->Sync(pScrn); - if (info->CPStarted) - RADEONInit3DEngineForRender(pScrn); - } while(i--) { memcpy(dst, src, width * tex_bytepp); @@ -799,6 +805,9 @@ if (blend_cntl == 0) return FALSE; + if (!info->RenderInited3D) + RadeonInit3DEngine(pScrn); + if (!FUNC_NAME(R200SetupTexture)(pScrn, maskFormat, alphaPtr, alphaPitch, width, height, flags)) return FALSE; @@ -849,6 +858,9 @@ if (blend_cntl == 0) return FALSE; + if (!info->RenderInited3D) + RadeonInit3DEngine(pScrn); + if (!FUNC_NAME(R200SetupTexture)(pScrn, srcFormat, texPtr, texPitch, width, height, flags)) return FALSE;