From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/shader.c | 5 +---- dlls/wined3d/stateblock.c | 5 +++++ dlls/wined3d/utils.c | 7 +------ dlls/wined3d/wined3d_private.h | 1 + 4 files changed, 8 insertions(+), 10 deletions(-)
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index c6e219c94eb..4e1c443ff35 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -2697,10 +2697,7 @@ void find_vs_compile_args(const struct wined3d_state *state, const struct wined3
if (state->extra_vs_args.pixel_fog) { - if (state->transforms[WINED3D_TS_PROJECTION]._14 == 0.0f - && state->transforms[WINED3D_TS_PROJECTION]._24 == 0.0f - && state->transforms[WINED3D_TS_PROJECTION]._34 == 0.0f - && state->transforms[WINED3D_TS_PROJECTION]._44 == 1.0f) + if (state->extra_vs_args.ortho_fog) { /* Fog source is vertex output Z. * diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 3560bbcaf2c..97e865a4926 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -1900,6 +1900,9 @@ void CDECL wined3d_stateblock_set_transform(struct wined3d_stateblock *statebloc stateblock->changed.texture_matrices = 1; else if (d3dts == WINED3D_TS_VIEW || d3dts >= WINED3D_TS_WORLD) stateblock->changed.modelview_matrices = 1; + else if (d3dts == WINED3D_TS_PROJECTION + && stateblock->stateblock_state.rs[WINED3D_RS_FOGTABLEMODE] != WINED3D_FOG_NONE) + stateblock->changed.extra_vs_args = 1; /* For ortho_fog. */ }
void CDECL wined3d_stateblock_multiply_transform(struct wined3d_stateblock *stateblock, @@ -3984,11 +3987,13 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
if (changed->extra_vs_args) { + const struct wined3d_matrix *proj = &state->transforms[WINED3D_TS_PROJECTION]; struct wined3d_extra_vs_args args;
args.clip_planes = state->rs[WINED3D_RS_CLIPPING] ? state->rs[WINED3D_RS_CLIPPLANEENABLE] : 0; args.pixel_fog = (state->rs[WINED3D_RS_FOGTABLEMODE] != WINED3D_FOG_NONE); args.flat_shading = state->rs[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT; + args.ortho_fog = (proj->_14 == 0.0f && proj->_24 == 0.0f && proj->_34 == 0.0f && proj->_44 == 1.0f); wined3d_device_context_emit_set_extra_vs_args(context, &args); }
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index d6adfaf59a6..92ee2eb7109 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -6598,12 +6598,7 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_state *state, const struct else if (state->extra_vs_args.pixel_fog) { settings->fog_mode = WINED3D_FFP_VS_FOG_DEPTH; - - if (state->transforms[WINED3D_TS_PROJECTION]._14 == 0.0f - && state->transforms[WINED3D_TS_PROJECTION]._24 == 0.0f - && state->transforms[WINED3D_TS_PROJECTION]._34 == 0.0f - && state->transforms[WINED3D_TS_PROJECTION]._44 == 1.0f) - settings->ortho_fog = 1; + settings->ortho_fog = state->extra_vs_args.ortho_fog; } else if (state->render_states[WINED3D_RS_FOGVERTEXMODE] == WINED3D_FOG_NONE) settings->fog_mode = WINED3D_FFP_VS_FOG_FOGCOORD; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index d70da4260e2..f0dd1884838 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2879,6 +2879,7 @@ struct wined3d_extra_vs_args uint8_t clip_planes; bool pixel_fog; bool flat_shading; + bool ortho_fog; };
struct wined3d_extra_ps_args