[PATCH 3/5] d3d8/tests: Add a test for instructions taking a scalar source.

Henri Verbeet hverbeet at codeweavers.com
Wed Dec 11 07:32:05 CST 2013


---
 dlls/d3d8/tests/visual.c |  189 +++++++++++++++++++++++++++-------------------
 1 file changed, 110 insertions(+), 79 deletions(-)

diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c
index 1913e6e..33d876a 100644
--- a/dlls/d3d8/tests/visual.c
+++ b/dlls/d3d8/tests/visual.c
@@ -1685,114 +1685,145 @@ out:
     ok(SUCCEEDED(hr), "Failed to enable z writes, hr %#x.\n", hr);
 }
 
-static void test_rcp_rsq(IDirect3DDevice8 *device)
+static void test_scalar_instructions(IDirect3DDevice8 *device)
 {
-    HRESULT hr;
-    DWORD shader;
-    DWORD color;
-    float constant[4] = {1.0, 1.0, 1.0, 2.0};
-
-    static const float quad[][3] = {
+    static const struct vec3 quad[] =
+    {
         {-1.0f, -1.0f, 0.0f},
         {-1.0f,  1.0f, 0.0f},
         { 1.0f, -1.0f, 0.0f},
         { 1.0f,  1.0f, 0.0f},
     };
-
+    static const DWORD decl[] =
+    {
+        D3DVSD_STREAM(0),
+        D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3),                           /* dcl_position v0 */
+        D3DVSD_CONST(0, 1), 0x3e800000, 0x3f000000, 0x3f800000, 0x40000000,     /* def c0, 0.25, 0.5, 1.0, 2.0 */
+        D3DVSD_END()
+    };
     static const DWORD rcp_test[] =
     {
-        0xfffe0101,                                         /* vs.1.1 */
-
-        0x0009fffe, 0x30303030, 0x30303030,                 /* Shaders have to have a minimal size. */
-        0x30303030, 0x30303030, 0x30303030,                 /* Add a filler comment. Usually D3DX8's*/
-        0x30303030, 0x30303030, 0x30303030,                 /* version comment makes the shader big */
-        0x00303030,                                         /* enough to make windows happy         */
-
+        0xfffe0101,                                         /* vs_1_1 */
+        0x0009fffe, 0x30303030, 0x30303030,                 /* Shaders have to have a minimal size.  */
+        0x30303030, 0x30303030, 0x30303030,                 /* Add a filler comment. Usually d3dx8's */
+        0x30303030, 0x30303030, 0x30303030,                 /* version comment makes the shader big  */
+        0x00303030,                                         /* enough to make Windows happy.         */
         0x00000001, 0xc00f0000, 0x90e40000,                 /* mov oPos, v0 */
         0x00000006, 0xd00f0000, 0xa0e40000,                 /* rcp oD0, c0 */
         0x0000ffff                                          /* END */
     };
-
     static const DWORD rsq_test[] =
     {
-        0xfffe0101,                                         /* vs.1.1 */
-
-        0x0009fffe, 0x30303030, 0x30303030,                 /* Shaders have to have a minimal size. */
-        0x30303030, 0x30303030, 0x30303030,                 /* Add a filler comment. Usually D3DX8's*/
-        0x30303030, 0x30303030, 0x30303030,                 /* version comment makes the shader big */
-        0x00303030,                                         /* enough to make windows happy         */
-
+        0xfffe0101,                                         /* vs_1_1 */
+        0x0009fffe, 0x30303030, 0x30303030,                 /* Shaders have to have a minimal size.  */
+        0x30303030, 0x30303030, 0x30303030,                 /* Add a filler comment. Usually d3dx8's */
+        0x30303030, 0x30303030, 0x30303030,                 /* version comment makes the shader big  */
+        0x00303030,                                         /* enough to make Windows happy.         */
         0x00000001, 0xc00f0000, 0x90e40000,                 /* mov oPos, v0 */
         0x00000007, 0xd00f0000, 0xa0e40000,                 /* rsq oD0, c0 */
         0x0000ffff                                          /* END */
     };
-
-    DWORD decl[] =
+    static const DWORD exp_test[] =
     {
-        D3DVSD_STREAM(0),
-        D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3),  /* D3DVSDE_POSITION, Register v0 */
-        D3DVSD_END()
+        0xfffe0101,                                         /* vs_1_1 */
+        0x0009fffe, 0x30303030, 0x30303030,                 /* Shaders have to have a minimal size.  */
+        0x30303030, 0x30303030, 0x30303030,                 /* Add a filler comment. Usually d3dx8's */
+        0x30303030, 0x30303030, 0x30303030,                 /* version comment makes the shader big  */
+        0x00303030,                                         /* enough to make Windows happy.         */
+        0x00000001, 0xc00f0000, 0x90e40000,                 /* mov oPos, v0 */
+        0x0000000e, 0x800f0000, 0xa0e40000,                 /* exp r0, c0 */
+        0x00000006, 0xd00f0000, 0x80000000,                 /* rcp oD0, r0.x */
+        0x0000ffff,                                         /* END */
     };
-
-    hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xff336699, 0.0f, 0);
-    ok(hr == D3D_OK, "IDirect3DDevice8_Clear failed with %#08x\n", hr);
-
-    hr = IDirect3DDevice8_CreateVertexShader(device, decl, rcp_test, &shader, 0);
-    ok(hr == D3D_OK, "IDirect3DDevice8_CreateVertexShader returned with %#08x\n", hr);
-
-    hr = IDirect3DDevice8_SetVertexShader(device, shader);
-    ok(hr == D3D_OK, "IDirect3DDevice8_SetVertexShader returned %#08x\n", hr);
-    IDirect3DDevice8_SetVertexShaderConstant(device, 0, constant, 1);
-
-    hr = IDirect3DDevice8_BeginScene(device);
-    ok(hr == D3D_OK, "IDirect3DDevice8_BeginScene returned %#08x\n", hr);
-    if(SUCCEEDED(hr))
+    static const DWORD expp_test[] =
     {
-        hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, &quad[0], 3 * sizeof(float));
-        ok(SUCCEEDED(hr), "DrawPrimitiveUP failed (%#08x)\n", hr);
-        hr = IDirect3DDevice8_EndScene(device);
-        ok(hr == D3D_OK, "IDirect3DDevice8_EndScene returned %#08x\n", hr);
+        0xfffe0101,                                         /* vs_1_1 */
+        0x0009fffe, 0x30303030, 0x30303030,                 /* Shaders have to have a minimal size.  */
+        0x30303030, 0x30303030, 0x30303030,                 /* Add a filler comment. Usually d3dx8's */
+        0x30303030, 0x30303030, 0x30303030,                 /* version comment makes the shader big  */
+        0x00303030,                                         /* enough to make Windows happy.         */
+        0x00000001, 0xc00f0000, 0x90e40000,                 /* mov oPos, v0 */
+        0x0000004e, 0x800f0000, 0xa0e40000,                 /* expp r0, c0 */
+        0x00000006, 0xd00f0000, 0x80000000,                 /* rcp oD0, r0.x */
+        0x0000ffff,                                         /* END */
+    };
+    static const DWORD log_test[] =
+    {
+        0xfffe0101,                                         /* vs_1_1 */
+        0x0009fffe, 0x30303030, 0x30303030,                 /* Shaders have to have a minimal size.  */
+        0x30303030, 0x30303030, 0x30303030,                 /* Add a filler comment. Usually d3dx8's */
+        0x30303030, 0x30303030, 0x30303030,                 /* version comment makes the shader big  */
+        0x00303030,                                         /* enough to make Windows happy.         */
+        0x00000001, 0xc00f0000, 0x90e40000,                 /* mov oPos, v0 */
+        0x0000000f, 0xd00f0000, 0xa0e40000,                 /* log oD0, c0 */
+        0x0000ffff,                                         /* END */
+    };
+    static const DWORD logp_test[] =
+    {
+        0xfffe0101,                                         /* vs_1_1 */
+        0x0009fffe, 0x30303030, 0x30303030,                 /* Shaders have to have a minimal size.  */
+        0x30303030, 0x30303030, 0x30303030,                 /* Add a filler comment. Usually d3dx8's */
+        0x30303030, 0x30303030, 0x30303030,                 /* version comment makes the shader big  */
+        0x00303030,                                         /* enough to make Windows happy.         */
+        0x00000001, 0xc00f0000, 0x90e40000,                 /* mov oPos, v0 */
+        0x0000004f, 0xd00f0000, 0xa0e40000,                 /* logp oD0, c0 */
+        0x0000ffff,                                         /* END */
+    };
+    static const struct
+    {
+        const char *name;
+        const DWORD *byte_code;
+        D3DCOLOR color;
+        BOOL todo;
     }
+    test_data[] =
+    {
+        {"rcp_test",    rcp_test,   D3DCOLOR_ARGB(0x00, 0x80, 0x80, 0x80), FALSE},
+        {"rsq_test",    rsq_test,   D3DCOLOR_ARGB(0x00, 0xb4, 0xb4, 0xb4), FALSE},
+        {"exp_test",    exp_test,   D3DCOLOR_ARGB(0x00, 0x40, 0x40, 0x40), TRUE},
+        {"expp_test",   expp_test,  D3DCOLOR_ARGB(0x00, 0x40, 0x40, 0x40), TRUE},
+        {"log_test",    log_test,   D3DCOLOR_ARGB(0x00, 0xff, 0xff, 0xff), TRUE},
+        {"logp_test",   logp_test,  D3DCOLOR_ARGB(0x00, 0xff, 0xff, 0xff), TRUE},
+    };
+    unsigned int i;
+    DWORD shader;
+    DWORD color;
+    HRESULT hr;
 
-    color = getPixelColor(device, 320, 240);
-    ok(color_match(color, D3DCOLOR_ARGB(0x00, 0x80, 0x80, 0x80), 4),
-            "RCP test returned color 0x%08x, expected 0x00808080.\n", color);
-
-    hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
-    ok(SUCCEEDED(hr), "Present failed (%#08x)\n", hr);
-
-    IDirect3DDevice8_SetVertexShader(device, 0);
-    IDirect3DDevice8_DeleteVertexShader(device, shader);
-
-    hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xff996633, 0.0f, 0);
-    ok(hr == D3D_OK, "IDirect3DDevice8_Clear failed with %#08x\n", hr);
-
-    hr = IDirect3DDevice8_CreateVertexShader(device, decl, rsq_test, &shader, 0);
-    ok(hr == D3D_OK, "IDirect3DDevice8_CreateVertexShader returned with %#08x\n", hr);
+    for (i = 0; i < sizeof(test_data) / sizeof(*test_data); ++i)
+    {
+        hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xff336699, 0.0f, 0);
+        ok(SUCCEEDED(hr), "%s: Failed to clear, hr %#x.\n", test_data[i].name, hr);
 
-    hr = IDirect3DDevice8_SetVertexShader(device, shader);
-    ok(hr == D3D_OK, "IDirect3DDevice8_SetVertexShader returned %#08x\n", hr);
-    IDirect3DDevice8_SetVertexShaderConstant(device, 0, constant, 1);
+        hr = IDirect3DDevice8_CreateVertexShader(device, decl, test_data[i].byte_code, &shader, 0);
+        ok(SUCCEEDED(hr), "%s: Failed to create vertex shader, hr %#x.\n", test_data[i].name, hr);
+        hr = IDirect3DDevice8_SetVertexShader(device, shader);
+        ok(SUCCEEDED(hr), "%s: Failed to set vertex shader, hr %#x.\n", test_data[i].name, hr);
 
-    hr = IDirect3DDevice8_BeginScene(device);
-    ok(hr == D3D_OK, "IDirect3DDevice8_BeginScene returned %#08x\n", hr);
-    if(SUCCEEDED(hr))
-    {
+        hr = IDirect3DDevice8_BeginScene(device);
+        ok(SUCCEEDED(hr), "%s: Failed to begin scene, hr %#x.\n", test_data[i].name, hr);
         hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, &quad[0], 3 * sizeof(float));
-        ok(SUCCEEDED(hr), "DrawPrimitiveUP failed (%#08x)\n", hr);
+        ok(SUCCEEDED(hr), "%s: Failed to draw primitive, hr %#x.\n", test_data[i].name, hr);
         hr = IDirect3DDevice8_EndScene(device);
-        ok(hr == D3D_OK, "IDirect3DDevice8_EndScene returned %#08x\n", hr);
-    }
+        ok(SUCCEEDED(hr), "%s: Failed to end scene, hr %#x.\n", test_data[i].name, hr);
 
-    color = getPixelColor(device, 320, 240);
-    ok(color_match(color, D3DCOLOR_ARGB(0x00, 0xb4, 0xb4, 0xb4), 4),
-            "RSQ test returned color 0x%08x, expected 0x00b4b4b4.\n", color);
+        color = getPixelColor(device, 320, 240);
+        if (test_data[i].todo)
+            todo_wine ok(color_match(color, test_data[i].color, 4),
+                    "%s: Got unexpected color 0x%08x, expected 0x%08x.\n",
+                    test_data[i].name, color, test_data[i].color);
+        else
+            ok(color_match(color, test_data[i].color, 4), "%s: Got unexpected color 0x%08x, expected 0x%08x.\n",
+                    test_data[i].name, color, test_data[i].color);
 
-    hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
-    ok(SUCCEEDED(hr), "Present failed (%#08x)\n", hr);
+        hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
+        ok(SUCCEEDED(hr), "%s: Failed to present, hr %#x.\n", test_data[i].name, hr);
 
-    IDirect3DDevice8_SetVertexShader(device, 0);
-    IDirect3DDevice8_DeleteVertexShader(device, shader);
+        hr = IDirect3DDevice8_SetVertexShader(device, 0);
+        ok(SUCCEEDED(hr), "%s: Failed to set vertex shader, hr %#x.\n", test_data[i].name, hr);
+        hr = IDirect3DDevice8_DeleteVertexShader(device, shader);
+        ok(SUCCEEDED(hr), "%s: Failed to delete vertex shader, hr %#x.\n", test_data[i].name, hr);
+    }
 }
 
 static void offscreen_test(IDirect3DDevice8 *device)
@@ -4726,7 +4757,7 @@ START_TEST(visual)
 
     if (caps.VertexShaderVersion >= D3DVS_VERSION(1, 1))
     {
-        test_rcp_rsq(device_ptr);
+        test_scalar_instructions(device_ptr);
         if (caps.PixelShaderVersion >= D3DPS_VERSION(1, 1))
         {
             fog_with_shader_test(device_ptr);
-- 
1.7.10.4




More information about the wine-patches mailing list