wined3d: Catch NOP vertex declaration changes.

This commit is contained in:
Stefan Dösinger 2007-01-04 00:07:00 +01:00 committed by Alexandre Julliard
parent 0d700bef5d
commit cd9a3517f3
1 changed files with 15 additions and 3 deletions

View File

@ -2151,10 +2151,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetFVF(IWineD3DDevice *iface, DWORD fvf
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
/* Update the current state block */ /* Update the current state block */
This->updateStateBlock->fvf = fvf;
This->updateStateBlock->changed.fvf = TRUE; This->updateStateBlock->changed.fvf = TRUE;
This->updateStateBlock->set.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); TRACE("(%p) : FVF Shader FVF set to %x\n", This, fvf);
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VDECL); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VDECL);
return WINED3D_OK; return WINED3D_OK;
@ -3218,6 +3223,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexDeclaration(IWineD3DDevice* if
if (This->isRecordingState) { if (This->isRecordingState) {
TRACE("Recording... not performing anything\n"); 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) { if (NULL != pDecl) {
@ -5822,13 +5832,15 @@ static void device_reapply_stateblock(IWineD3DDeviceImpl* This) {
/* Temporaryily mark all render states dirty to force reapplication /* Temporaryily mark all render states dirty to force reapplication
* until the context management for is integrated with the state management * 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 * The same for the pixel shader, vertex declaration
* dirty my StateBlock::Apply already * Sampler states and texture stage states are marked
* dirty my StateBlock::Apply already.
*/ */
for(i = 1; i < WINEHIGHEST_RENDER_STATE; i++) { for(i = 1; i < WINEHIGHEST_RENDER_STATE; i++) {
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(i)); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(i));
} }
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_PIXELSHADER); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_PIXELSHADER);
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VDECL);
/* Restore recording */ /* Restore recording */
This->isRecordingState = oldRecording; This->isRecordingState = oldRecording;