From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/d3d9/tests/visual.c | 2 +- dlls/wined3d/glsl_shader.c | 3 +++ dlls/wined3d/shader.c | 17 +++++++++++++++-- dlls/wined3d/stateblock.c | 4 ++-- dlls/wined3d/wined3d_private.h | 5 +++-- 5 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c index 39b6da90463..56f458d86d3 100644 --- a/dlls/d3d9/tests/visual.c +++ b/dlls/d3d9/tests/visual.c @@ -29253,7 +29253,7 @@ static void test_fog(void) { colour = get_readback_vec4(&rb, points[i].x, points[i].y);
-todo_wine_if ((fog_mode_tests[pixel_mode] != D3DFOG_NONE && !ortho_fog && (vs_mode == VS_MODE_FFP || vs_mode == VS_MODE_RHW || i != 2)) +todo_wine_if ((fog_mode_tests[pixel_mode] != D3DFOG_NONE && !ortho_fog && (vs_mode == VS_MODE_FFP || vs_mode == VS_MODE_RHW)) || (fog_mode_tests[pixel_mode] == D3DFOG_NONE && fog_mode_tests[vertex_mode] != D3DFOG_NONE && vs_mode == VS_MODE_FFP) || (fog_mode_tests[pixel_mode] == D3DFOG_NONE && vs_mode == VS_MODE_VS_NO_FOG)) { diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 9118689b9f4..4ec8ba6a590 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -8092,6 +8092,9 @@ static void shader_glsl_generate_vs_epilogue(const struct wined3d_gl_info *gl_in if (args->fog_src == VS_FOG_Z) shader_addline(buffer, "%s = gl_Position.z;\n", legacy_syntax ? "gl_FogFragCoord" : "ffp_varying_fogcoord"); + else if (args->fog_src == VS_FOG_W) + shader_addline(buffer, "%s = gl_Position.w;\n", + legacy_syntax ? "gl_FogFragCoord" : "ffp_varying_fogcoord"); else if (!reg_maps->fog) shader_addline(buffer, "%s = 0.0;\n", legacy_syntax ? "gl_FogFragCoord" : "ffp_varying_fogcoord"); diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 252046f0a39..9c3b02a567f 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -2306,8 +2306,21 @@ void find_vs_compile_args(const struct wined3d_state *state, const struct wined3 const struct wined3d_d3d_info *d3d_info = context->d3d_info; WORD swizzle_map = context->stream_info.swizzle_map;
- args->fog_src = state->render_states[WINED3D_RS_FOGTABLEMODE] - == WINED3D_FOG_NONE ? VS_FOG_COORD : VS_FOG_Z; + if (state->render_states[WINED3D_RS_FOGTABLEMODE] != WINED3D_FOG_NONE) + { + 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) + args->fog_src = VS_FOG_Z; + else + args->fog_src = VS_FOG_W; + } + else + { + args->fog_src = VS_FOG_COORD; + } + args->clip_enabled = state->render_states[WINED3D_RS_CLIPPING] && state->render_states[WINED3D_RS_CLIPPLANEENABLE]; args->point_size = state->primitive_type == WINED3D_PT_POINTLIST; diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 05b17a35d99..5651f853b47 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -3471,8 +3471,8 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, WINED3D_PUSH_CONSTANTS_VS_FFP, WINED3D_SHADER_CONST_FFP_PROJ, offsetof(struct wined3d_ffp_vs_constants, projection_matrix), sizeof(state->transforms[idx]), &state->transforms[idx]); - /* wined3d_ffp_vs_settings.ortho_fog still needs the - * device state to be set. */ + /* wined3d_ffp_vs_settings.ortho_fog and vs_compile_args.ortho_fog + * still need the device state to be set. */ wined3d_device_set_transform(device, idx, &state->transforms[idx]); } } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index b142d514c71..f150316455c 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1489,8 +1489,9 @@ struct ps_compile_args
enum fog_src_type { - VS_FOG_Z = 0, - VS_FOG_COORD = 1 + VS_FOG_Z, + VS_FOG_COORD, + VS_FOG_W, };
struct vs_compile_args