Stefan Dösinger : wined3d: Catch NOP vertex declaration changes.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jan 4 04:45:08 CST 2007


Module: wine
Branch: master
Commit: cd9a3517f3ee5309979c7ea3cb734576f37d0560
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cd9a3517f3ee5309979c7ea3cb734576f37d0560

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Thu Jan  4 00:07:00 2007 +0100

wined3d: Catch NOP vertex declaration changes.

---

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

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index a1aab0d..6a51771 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -2151,10 +2151,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
 
     /* Update the current state block */
-    This->updateStateBlock->fvf              = fvf;
     This->updateStateBlock->changed.fvf      = TRUE;
     This->updateStateBlock->set.fvf          = TRUE;
 
+    if(This->updateStateBlock->fvf == fvf) {
+        TRACE("Application is setting the old fvf over, nothing to do\n");
+        return WINED3D_OK;
+    }
+
+    This->updateStateBlock->fvf              = fvf;
     TRACE("(%p) : FVF Shader FVF set to %x\n", This, fvf);
     IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VDECL);
     return WINED3D_OK;
@@ -3218,6 +3223,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl
 
     if (This->isRecordingState) {
         TRACE("Recording... not performing anything\n");
+        return WINED3D_OK;
+    } else if(pDecl == oldDecl) {
+        /* Checked after the assignment to allow proper stateblock recording */
+        TRACE("Application is setting the old declaration over, nothing to do\n");
+        return WINED3D_OK;
     }
 
     if (NULL != pDecl) {
@@ -5822,13 +5832,15 @@ static void device_reapply_stateblock(IW
 
     /* Temporaryily mark all render states dirty to force reapplication
      * until the context management for is integrated with the state management
-     * The same for the pixel shader, sampler states and texture stage states are marked
-     * dirty my StateBlock::Apply already
+     * The same for the pixel shader, vertex declaration
+     * Sampler states and texture stage states are marked
+     * dirty my StateBlock::Apply already.
      */
     for(i = 1; i < WINEHIGHEST_RENDER_STATE; i++) {
         IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(i));
     }
     IWineD3DDeviceImpl_MarkStateDirty(This, STATE_PIXELSHADER);
+    IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VDECL);
 
     /* Restore recording */
     This->isRecordingState = oldRecording;




More information about the wine-cvs mailing list