[2/2] wined3d: Take abs() of vertex z coordinate as FFP fog coordinate (try 5)

Matteo Bruni matteo.mystral at gmail.com
Fri Nov 7 12:11:06 CST 2014


2014-11-06 21:51 GMT+01:00 Joachim Priesner <joachim.priesner at web.de>:
> Take the absolute value of vertex.z as fog coordinate instead of just
> the z coordinate. This fixes e.g. fog for applications that use
> right-handed projection matrices.
>
> Also test the clamp behavior of the oFog vertex shader output.
>
> Tested on openSuse 13.1 and Windows 8.1 (VMware Player).
>
> Try 5 that fixes a test failure I overlooked.
> ---
>  dlls/d3d8/tests/visual.c   | 296 +++++++++++++++++++++++++++++++++++++
>  dlls/d3d9/tests/visual.c   | 360 +++++++++++++++++++++++++++++++++++++++++++++
>  dlls/ddraw/tests/ddraw7.c  | 161 ++++++++++++++++++++
>  dlls/wined3d/glsl_shader.c |   2 +-
>  4 files changed, 818 insertions(+), 1 deletion(-)
>
> diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c
> index 163110c..a1eabcd 100644
> --- a/dlls/d3d8/tests/visual.c
> +++ b/dlls/d3d8/tests/visual.c
> @@ -696,6 +696,301 @@ done:
>      DestroyWindow(window);
>  }
>
> +/* This test tests fog in combination with negative vertex z coordinates. */
> +static void fog_negative_z_test(void)
> +{
> +    enum
> +    {
> +        C_ALPHA_0x00  = 0x00000000,
> +        C_CLEAR       = 0xffff00ff,
> +        C_FOGGED      = 0x0000ff00,
> +        C_HALF_FOGGED = 0x00808000,
> +        C_UNFOGGED    = 0x00ff0000,
> +        C_CLAMPED_FOG = 0xdeadbeef /* triggers special codepath when used as middle_color */
> +    };
> +
> +    /* Fill the null-shader entry with the FVF (SetVertexShader is "overloaded" on d3d8). */
> +    DWORD vertex_shader[3] = {D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR, 0, 0};
> +    DWORD pixel_shader[2] = {0, 0};
> +    IDirect3D8 *d3d;
> +    IDirect3DDevice8 *device;
> +    BOOL has_vs_support, has_ps_support, has_table_fog_support;
> +    unsigned int i, ps, y;
> +    D3DCOLOR color, expected_middle_color;
> +    ULONG refcount;
> +    D3DCAPS8 caps;
> +    HWND window;
> +    HRESULT hr;
> +
> +    /* Basic vertex shader without fog computation ("non foggy") */
> +    static const DWORD vertex_shader_code1[] =
> +    {
> +        0xfffe0100,                                                             /* vs_1_0                */
> +        /* output.Pos.z = input.Pos.z * 0.5 + 0.5 */
> +        0x00000005, 0x80010000, 0x90aa0000, 0xa0000000,                         /* mul r0.x, v0.z, c0.x  */
> +        0x00000002, 0xc0040000, 0x80000000, 0xa0000000,                         /* add oPos.z, r0.x c0.x */
> +        /* output.Pos.xyw = input.Pos.xyw */
> +        0x00000001, 0xc00b0000, 0x90e40000,                                     /* mov oPos.xyw, v0      */
> +        /* output.Color = input.Color */
> +        0x00000001, 0xd00f0000, 0x90e40001,                                     /* mov oD0, v1           */
> +        0x0000ffff,                                                             /* END                   */
> +    };

Where are you setting the value of c0 in the d3d8 test?



More information about the wine-devel mailing list