From 8365b2819ad5e9ab1e820876a35a50ba9f44532b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Tue, 19 Dec 2006 23:17:17 +0100 Subject: [PATCH] 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 623014606c7..833c84b36d8 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3368,6 +3368,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderState(IWineD3DDevice *iface, W 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_SetSamplerState(IWineD3DDevice *iface, 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_SetTexture(IWineD3DDevice *iface, DWORD 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_SetTexture(IWineD3DDevice *iface, DWORD 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 4dd182c0b4f..afc582d821c 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -756,7 +756,8 @@ should really perform a delta so that only the changes get updated*/ ((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) {