Stefan Dösinger : wined3d: Do not activate vertex shaders needlessly.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jan 8 14:44:05 CST 2007
Module: wine
Branch: master
Commit: fdb62cbaebb68a784993276cb80de1f73f6466b1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fdb62cbaebb68a784993276cb80de1f73f6466b1
Author: Stefan Dösinger <stefan at 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;
More information about the wine-cvs
mailing list