Module: wine Branch: master Commit: fdb62cbaebb68a784993276cb80de1f73f6466b1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fdb62cbaebb68a784993276cb8...
Author: Stefan Dösinger stefan@codeweavers.com Date: Sat Jan 6 18:21:35 2007 +0100
wined3d: Do not activate vertex shaders needlessly.
---
dlls/wined3d/state.c | 21 ++++++++++++--------- dlls/wined3d/wined3d_private.h | 1 + 2 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index cdb250e..0e36a08 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -2675,19 +2675,22 @@ static void vertexdeclaration(DWORD stat IWineD3DVertexShader_CompileShader(stateblock->vertexShader); }
- /* Vertex and pixel shaders are applied together for now, so let the last dirty state do the - * application - */ - if(!isStateDirty(device, STATE_PIXELSHADER)) { + if(useVertexShaderFunction || device->last_was_vshader) { BOOL usePixelShaderFunction = device->ps_selected_mode != SHADER_NONE && - stateblock->pixelShader && - ((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.function; + stateblock->pixelShader && + ((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.function;
- device->shader_backend->shader_select((IWineD3DDevice *) device, usePixelShaderFunction, useVertexShaderFunction); + /* Vertex and pixel shaders are applied together for now, so let the last dirty state do the + * application + */ + if(!isStateDirty(device, STATE_PIXELSHADER)) { + device->shader_backend->shader_select((IWineD3DDevice *) device, usePixelShaderFunction, useVertexShaderFunction);
- if(!isStateDirty(stateblock->wineD3DDevice, STATE_VERTEXSHADERCONSTANT) && (useVertexShaderFunction || usePixelShaderFunction)) { - shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock); + if(!isStateDirty(stateblock->wineD3DDevice, STATE_VERTEXSHADERCONSTANT) && (useVertexShaderFunction || usePixelShaderFunction)) { + shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock); + } } + device->last_was_vshader = useVertexShaderFunction; }
if(updateFog) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 27f95c8..83a8f17 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -583,6 +583,7 @@ typedef struct IWineD3DDeviceImpl BOOL last_was_notclipped; BOOL untransformed; BOOL last_was_pshader; + BOOL last_was_vshader; BOOL last_was_foggy_shader; BOOL namedArraysLoaded, numberedArraysLoaded;