[WINED3D] Resend, Bugfix: restore recording mode later in ActiveRender()

Ivan Gyurdiev ivg231 at gmail.com
Thu Jul 20 22:03:31 CDT 2006


In ActiveRender(), the stateblock is reapplied after saving the current 
recording mode. Then recording mode is restored. Then the CULLMODE state 
is triggered via SetRenderState. The intent is to "Force updating the 
cull mode", but this will only work when not recording. Delay restoring 
recording mode until after that point.

Uncovered by stateblock test patch.

-------------- next part --------------
---

 dlls/wined3d/device.c |   34 +++++++++++++++-------------------
 1 files changed, 15 insertions(+), 19 deletions(-)

957f8c9ae2cff9d720b58ea4891cd26efa9c5fdc
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 2956a15..fb7e084 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -7225,6 +7225,8 @@ #endif
 static HRESULT WINAPI IWineD3DDeviceImpl_ActiveRender(IWineD3DDevice* iface,
                                                IWineD3DSurface *RenderSurface) {
     HRESULT ret =  WINED3DERR_INVALIDCALL;
+    BOOL oldRecording;
+    IWineD3DStateBlockImpl *oldUpdateStateBlock;
 
     /**
     * Currently only active for GLX >= 1.3
@@ -7444,23 +7446,14 @@ #endif
         }
     }
 
-#if 1 /* Apply the stateblock to the new context
-FIXME: This is a bit of a hack, each context should know it's own state,
-the directX current directX state should then be applied to the context */
-    {
-        BOOL oldRecording;
-        IWineD3DStateBlockImpl *oldUpdateStateBlock;
-        oldUpdateStateBlock = This->updateStateBlock;
-        oldRecording= This->isRecordingState;
-        This->isRecordingState = FALSE;
-        This->updateStateBlock = This->stateBlock;
-        IWineD3DStateBlock_Apply((IWineD3DStateBlock *)This->stateBlock);
-
-        This->isRecordingState = oldRecording;
-        This->updateStateBlock = oldUpdateStateBlock;
-    }
-#endif
-
+    /* Disable recording, and apply the stateblock to the new context 
+     * FIXME: This is a bit of a hack, each context should know it's own state,
+     * the directX current directX state should then be applied to the context */
+    oldUpdateStateBlock = This->updateStateBlock;
+    oldRecording= This->isRecordingState;
+    This->isRecordingState = FALSE;
+    This->updateStateBlock = This->stateBlock;
+    IWineD3DStateBlock_Apply((IWineD3DStateBlock *)This->stateBlock);
 
     /* clean up the current rendertargets swapchain (if it belonged to one) */
     if (currentSwapchain != NULL) {
@@ -7474,10 +7467,9 @@ #endif
     IWineD3DSurface_AddRef(This->renderTarget);
     IWineD3DSurface_Release(tmp);
 
-
-
     {
         DWORD value;
+
         /* The surface must be rendered upside down to cancel the flip produce by glCopyTexImage */
         /* Check that the container is not a swapchain member */
 
@@ -7498,6 +7490,10 @@ #endif
         This->proj_valid = FALSE;
     }
 
+    /* Restore recording state */
+    This->isRecordingState = oldRecording;
+    This->updateStateBlock = oldUpdateStateBlock;
+
     ret = WINED3D_OK;
 
     if (cfgs != NULL) {
-- 
1.3.3



More information about the wine-patches mailing list