Module: wine Branch: master Commit: cd9a3517f3ee5309979c7ea3cb734576f37d0560 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cd9a3517f3ee5309979c7ea3cb...
Author: Stefan Dösinger stefan@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;