Stefan Dösinger : wined3d: Catch nop sampler changes.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Dec 20 12:24:50 CST 2006


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Tue Dec 19 23:17:17 2006 +0100

wined3d: Catch nop sampler changes.

---

 dlls/wined3d/device.c     |   13 ++++++++++++-
 dlls/wined3d/stateblock.c |    3 ++-
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 6230146..833c84b 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3368,6 +3368,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl
 
 static HRESULT WINAPI IWineD3DDeviceImpl_SetSamplerState(IWineD3DDevice *iface, DWORD Sampler, WINED3DSAMPLERSTATETYPE Type, DWORD Value) {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+    DWORD oldValue = This->stateBlock->samplerState[Sampler][Type];
+
     /**
     * SetSampler is designed to allow for more than the standard up to 8 textures
     *  and Geforce has stopped supporting more than 6 standard textures in openGL.
@@ -3401,6 +3403,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl
         return WINED3D_OK;
     }
 
+    if(oldValue == Value) {
+        TRACE("Application is setting the old value over, nothing to do\n");
+        return WINED3D_OK;
+    }
+
     IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SAMPLER(Sampler));
 
     return WINED3D_OK;
@@ -4487,7 +4494,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl
         This->stateBlock->textureDimensions[Stage] = IWineD3DBaseTexture_GetTextureDimensions(pTexture);
     }
 
-    oldTexture = This->updateStateBlock->textures[Stage];
     TRACE("GL_LIMITS %d\n",GL_LIMITS(sampler_stages));
     TRACE("(%p) : oldtexture(%p)\n", This,oldTexture);
 
@@ -4502,6 +4508,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl
         return WINED3D_OK;
     }
 
+    if(oldTexture == pTexture) {
+        TRACE("App is setting the same texture again, nothing to do\n");
+        return WINED3D_OK;
+    }
+
     /** NOTE: MSDN says that setTexture increases the reference count,
     * and the the application nust set the texture back to null (or have a leaky application),
     * This means we should pass the refcount up to the parent
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 4dd182c..afc582d 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -756,7 +756,8 @@ should really perform a delta so that on
                     ((IWineD3DDeviceImpl *)pDevice)->stateBlock->changed.samplerState[j][i] = TRUE;
                 }
             }
-
+            /* SetTexture catches nop changes, so the above call does not assure that the sampler is updated */
+            IWineD3DDeviceImpl_MarkStateDirty((IWineD3DDeviceImpl *)pDevice, STATE_SAMPLER(j));
         }
 
     } else if (This->blockType == WINED3DSBT_PIXELSTATE) {




More information about the wine-cvs mailing list