Matteo Bruni : d3d9/tests: Add a couple of fog tests.
Alexandre Julliard
julliard at winehq.org
Thu Jul 28 13:55:39 CDT 2011
Module: wine
Branch: master
Commit: afd1fe43890026540703c9bc146fba49da316325
URL: http://source.winehq.org/git/wine.git/?a=commit;h=afd1fe43890026540703c9bc146fba49da316325
Author: Matteo Bruni <mbruni at codeweavers.com>
Date: Fri Jul 22 20:33:07 2011 +0200
d3d9/tests: Add a couple of fog tests.
---
dlls/d3d9/tests/visual.c | 146 ++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 140 insertions(+), 6 deletions(-)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index 7651069..499ea5f 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -928,6 +928,50 @@ static void fog_test(IDirect3DDevice9 *device)
};
WORD Indices[] = {0, 1, 2, 2, 3, 0};
+ const float ident_mat[16] =
+ {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f
+ };
+ const float world_mat1[16] =
+ {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, -0.5f, 1.0f
+ };
+ const float world_mat2[16] =
+ {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 1.0f
+ };
+ const float proj_mat[16] =
+ {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, -1.0f, 1.0f
+ };
+
+ const struct sVertex far_quad1[] =
+ {
+ {-1.0f, -1.0f, 0.5f, 0xffff0000, 0xff000000},
+ {-1.0f, 0.0f, 0.5f, 0xffff0000, 0xff000000},
+ { 0.0f, 0.0f, 0.5f, 0xffff0000, 0xff000000},
+ { 0.0f, -1.0f, 0.5f, 0xffff0000, 0xff000000},
+ };
+ const struct sVertex far_quad2[] =
+ {
+ {-1.0f, 0.0f, 1.5f, 0xffff0000, 0xff000000},
+ {-1.0f, 1.0f, 1.5f, 0xffff0000, 0xff000000},
+ { 0.0f, 1.0f, 1.5f, 0xffff0000, 0xff000000},
+ { 0.0f, 0.0f, 1.5f, 0xffff0000, 0xff000000},
+ };
+
memset(&caps, 0, sizeof(caps));
hr = IDirect3DDevice9_GetDeviceCaps(device, &caps);
ok(hr == D3D_OK, "IDirect3DDevice9_GetDeviceCaps returned %08x\n", hr);
@@ -1144,15 +1188,105 @@ static void fog_test(IDirect3DDevice9 *device)
break;
}
}
+
+ if (caps.RasterCaps & D3DPRASTERCAPS_FOGTABLE)
+ {
+ /* A simple fog + non-identity world matrix test */
+ hr = IDirect3DDevice9_SetTransform(device, D3DTS_WORLDMATRIX(0), (const D3DMATRIX *)world_mat1);
+ ok(hr == D3D_OK, "IDirect3DDevice9_SetTransform returned %#08x\n", hr);
+
+ start = 0.0;
+ end = 1.0;
+ hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGSTART, *((DWORD *)&start));
+ ok(hr == D3D_OK, "Setting fog start returned %08x\n", hr);
+ hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGEND, *((DWORD *)&end));
+ ok(hr == D3D_OK, "Setting fog end returned %08x\n", hr);
+ hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);
+ ok(hr == D3D_OK, "Setting fog table mode to D3DFOG_LINEAR returned %#08x\n", hr);
+ hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGVERTEXMODE, D3DFOG_NONE);
+ ok(hr == D3D_OK, "Turning off vertex fog returned %#08x\n", hr);
+
+ hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffff00ff, 0.0, 0);
+ ok(hr == D3D_OK, "IDirect3DDevice9_Clear returned %#08x\n", hr);
+
+ if (IDirect3DDevice9_BeginScene(device) == D3D_OK)
+ {
+ hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR);
+ ok(hr == D3D_OK, "SetVertexShader returned %#08x\n", hr);
+
+ hr = IDirect3DDevice9_DrawIndexedPrimitiveUP(device, D3DPT_TRIANGLELIST, 0, 4,
+ 2, Indices, D3DFMT_INDEX16, far_quad1, sizeof(far_quad1[0]));
+ ok(hr == D3D_OK, "DrawIndexedPrimitiveUP returned %#08x\n", hr);
+
+ hr = IDirect3DDevice9_DrawIndexedPrimitiveUP(device, D3DPT_TRIANGLELIST, 0, 4,
+ 2, Indices, D3DFMT_INDEX16, far_quad2, sizeof(far_quad2[0]));
+ ok(hr == D3D_OK, "DrawIndexedPrimitiveUP returned %#08x\n", hr);
+
+ hr = IDirect3DDevice9_EndScene(device);
+ ok(hr == D3D_OK, "EndScene returned %#08x\n", hr);
+ }
+ else
+ {
+ ok(FALSE, "BeginScene failed\n");
+ }
+
+ color = getPixelColor(device, 160, 360);
+ ok(color_match(color, 0x00ff0000, 4), "Unfogged quad has color %08x\n", color);
+ color = getPixelColor(device, 160, 120);
+ ok(color == 0x0000ff00, "Fogged out quad has color %08x\n", color);
+
+ IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
+
+ /* Test fog behavior with an orthogonal (but non-identity) projection matrix */
+ hr = IDirect3DDevice9_SetTransform(device, D3DTS_WORLDMATRIX(0), (const D3DMATRIX *)world_mat2);
+ ok(hr == D3D_OK, "SetTransform returned %#08x\n", hr);
+ hr = IDirect3DDevice9_SetTransform(device, D3DTS_PROJECTION, (const D3DMATRIX *)proj_mat);
+ ok(hr == D3D_OK, "SetTransform returned %#08x\n", hr);
+
+ hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffff00ff, 0.0, 0);
+ ok(hr == D3D_OK, "Clear returned %#08x\n", hr);
+
+ if (IDirect3DDevice9_BeginScene(device) == D3D_OK)
+ {
+ hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR);
+ ok(hr == D3D_OK, "SetVertexShader returned %#08x\n", hr);
+
+ hr = IDirect3DDevice9_DrawIndexedPrimitiveUP(device, D3DPT_TRIANGLELIST, 0, 4,
+ 2, Indices, D3DFMT_INDEX16, untransformed_1, sizeof(untransformed_1[0]));
+ ok(hr == D3D_OK, "DrawIndexedPrimitiveUP returned %#08x\n", hr);
+
+ hr = IDirect3DDevice9_DrawIndexedPrimitiveUP(device, D3DPT_TRIANGLELIST, 0, 4,
+ 2, Indices, D3DFMT_INDEX16, untransformed_2, sizeof(untransformed_2[0]));
+ ok(hr == D3D_OK, "DrawIndexedPrimitiveUP returned %#08x\n", hr);
+
+ hr = IDirect3DDevice9_EndScene(device);
+ ok(hr == D3D_OK, "EndScene returned %#08x\n", hr);
+ }
+ else
+ {
+ ok(FALSE, "BeginScene failed\n");
+ }
+
+ color = getPixelColor(device, 160, 360);
+ todo_wine ok(color_match(color, 0x00e51900, 4), "Partially fogged quad has color %08x\n", color);
+ color = getPixelColor(device, 160, 120);
+ ok(color == 0x0000ff00, "Fogged out quad has color %08x\n", color);
+
+ IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
+
+ hr = IDirect3DDevice9_SetTransform(device, D3DTS_WORLDMATRIX(0), (const D3DMATRIX *)ident_mat);
+ ok(hr == D3D_OK, "SetTransform returned %#08x\n", hr);
+ hr = IDirect3DDevice9_SetTransform(device, D3DTS_PROJECTION, (const D3DMATRIX *)ident_mat);
+ ok(hr == D3D_OK, "SetTransform returned %#08x\n", hr);
+ }
+ else
+ {
+ skip("D3DPRASTERCAPS_FOGTABLE not supported, skipping some 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);
- start = 0.0;
- end = 1.0;
- hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGSTART, *((DWORD *) &start));
- ok(hr == D3D_OK, "Setting fog start returned %08x\n", hr);
- hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGEND, *((DWORD *) &end));
- ok(hr == D3D_OK, "Setting fog end returned %08x\n", hr);
hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR);
ok( hr == D3D_OK, "Setting fog vertex mode to D3DFOG_LINEAR returned %08x\n", hr);
hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);
More information about the wine-cvs
mailing list