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