=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: d3d9/tests: Range fog is not used with table fog.

Alexandre Julliard julliard at winehq.org
Thu Sep 15 12:34:53 CDT 2011


Module: wine
Branch: master
Commit: f708da1c1c4bc9e66fa9bf14fe8e6404df7f622f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f708da1c1c4bc9e66fa9bf14fe8e6404df7f622f

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Sat Sep  3 17:24:36 2011 +0200

d3d9/tests: Range fog is not used with table fog.

---

 dlls/d3d9/tests/visual.c |   92 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 92 insertions(+), 0 deletions(-)

diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index 1857e2e..f583a89 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -1284,6 +1284,98 @@ static void fog_test(IDirect3DDevice9 *device)
         skip("D3DPRASTERCAPS_FOGTABLE not supported, skipping some fog tests\n");
     }
 
+    /* Test RANGEFOG vs FOGTABLEMODE */
+    if ((caps.RasterCaps & (D3DPRASTERCAPS_FOGTABLE | D3DPRASTERCAPS_FOGRANGE)) ==
+            (D3DPRASTERCAPS_FOGTABLE | D3DPRASTERCAPS_FOGRANGE))
+    {
+        struct sVertex untransformed_3[] =
+        {
+            {-1.0,-1.0,   0.4999f,      0xFFFF0000,     0xFF000000  },
+            {-1.0, 1.0,   0.4999f,      0xFFFF0000,     0xFF000000  },
+            { 1.0,-1.0,   0.4999f,      0xFFFF0000,     0xFF000000  },
+            { 1.0, 1.0,   0.4999f,      0xFFFF0000,     0xFF000000  },
+        };
+
+        hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffff00ff, 0.0, 0);
+        ok(SUCCEEDED(hr), "IDirect3DDevice9_Clear failed, hr %#x.\n", hr);
+        hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR);
+        ok(SUCCEEDED(hr), "IDirect3DDevice9_SetFVF failed, hr %#x.\n", hr);
+
+        hr = IDirect3DDevice9_SetRenderState(device, D3DRS_RANGEFOGENABLE, TRUE);
+        ok(SUCCEEDED(hr), "IDirect3DDevice9_SetRenderState failed, hr %#x.\n", hr);
+
+        /* z=0.4999, set the fogstart to 0.5 and fogend slightly higher. If range fog
+         * is not used, the fog coordinate will be equal to fogstart and the quad not
+         * fogged. If range fog is used the fog coordinate will be slightly higher and
+         * the fog coordinate will be > fogend, so we get a fully fogged quad. The fog
+         * is calculated per vertex and interpolated, so even the center of the screen
+         * where the difference doesn't matter will be fogged, but check the corners in
+         * case a d3d/gl implementation decides to calculate the fog factor per fragment */
+        start = 0.5f;
+        end = 0.50001f;
+        hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGSTART, *((DWORD *) &start));
+        ok(SUCCEEDED(hr), "IDirect3DDevice9_SetRenderState failed, hr %#x.\n", hr);
+        hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGEND, *((DWORD *) &end));
+        ok(SUCCEEDED(hr), "IDirect3DDevice9_SetRenderState failed, hr %#x.\n", hr);
+
+        /* Table fog: Range fog is not used */
+        hr = IDirect3DDevice9_BeginScene(device);
+        ok(SUCCEEDED(hr), "IDirect3DDevice9_BeginScene failed, hr %#x.\n", hr);
+        if (SUCCEEDED(hr))
+        {
+            hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);
+            ok(SUCCEEDED(hr), "IDirect3DDevice9_SetRenderState failed, hr %#x.\n", hr);
+            hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, untransformed_3, sizeof(*untransformed_3));
+            ok(SUCCEEDED(hr), "IDirect3DDevice9_DrawPrimitiveUP failed, hr %#x.\n", hr);
+            hr = IDirect3DDevice9_EndScene(device);
+            ok(SUCCEEDED(hr), "IDirect3DDevice9_EndScene failed, hr %#x.\n", hr);
+        }
+        color = getPixelColor(device, 10, 10);
+        ok(color == 0x00ff0000, "Rangefog with table fog returned color 0x%08x\n", color);
+        color = getPixelColor(device, 630, 10);
+        ok(color == 0x00ff0000, "Rangefog with table fog returned color 0x%08x\n", color);
+        color = getPixelColor(device, 10, 470);
+        ok(color == 0x00ff0000, "Rangefog with table fog returned color 0x%08x\n", color);
+        color = getPixelColor(device, 630, 470);
+        ok(color == 0x00ff0000, "Rangefog with table fog returned color 0x%08x\n", color);
+
+        hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
+        ok(SUCCEEDED(hr), "IDirect3DDevice9_Present failed, hr %#x.\n", hr);
+
+        /* Vertex fog: Rangefog is used */
+        hr = IDirect3DDevice9_BeginScene(device);
+        ok(hr == D3D_OK, "IDirect3DDevice9_DrawPrimitiveUP returned %#08x\n", hr);
+        if (SUCCEEDED(hr))
+        {
+            hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGTABLEMODE, D3DFOG_NONE);
+            ok(SUCCEEDED(hr), "IDirect3DDevice9_SetRenderState failed, hr %#x.\n", hr);
+            hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR);
+            ok(SUCCEEDED(hr), "IDirect3DDevice9_SetRenderState failed, hr %#x.\n", hr);
+            hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, untransformed_3, sizeof(*untransformed_3));
+            ok(SUCCEEDED(hr), "IDirect3DDevice9_DrawPrimitiveUP failed, hr %#x.\n", hr);
+            hr = IDirect3DDevice9_EndScene(device);
+            ok(SUCCEEDED(hr), "IDirect3DDevice9_EndScene failed, hr %#x.\n", hr);
+        }
+        color = getPixelColor(device, 10, 10);
+        ok(color == 0x0000ff00, "Rangefog with vertex fog returned color 0x%08x\n", color);
+        color = getPixelColor(device, 630, 10);
+        ok(color == 0x0000ff00, "Rangefog with vertex fog returned color 0x%08x\n", color);
+        color = getPixelColor(device, 10, 470);
+        ok(color == 0x0000ff00, "Rangefog with vertex fog returned color 0x%08x\n", color);
+        color = getPixelColor(device, 630, 470);
+        ok(color == 0x0000ff00, "Rangefog with vertex fog returned color 0x%08x\n", color);
+
+        hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
+        ok(SUCCEEDED(hr), "IDirect3DDevice9_Present failed, hr %#x.\n", hr);
+
+        hr = IDirect3DDevice9_SetRenderState(device, D3DRS_RANGEFOGENABLE, FALSE);
+        ok(SUCCEEDED(hr), "IDirect3DDevice9_SetRenderState failed, hr %#x.\n", hr);
+    }
+    else
+    {
+        skip("Range fog or table fog not supported, skipping range fog tests\n");
+    }
+
     /* Turn off the fog master switch to avoid confusing other tests */
     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGENABLE, FALSE);
     ok(hr == D3D_OK, "Turning off fog calculations returned %08x\n", hr);




More information about the wine-cvs mailing list