[PATCH 3/5] d3d9/tests: Add tests for Fetch4 format support.

Henri Verbeet hverbeet at codeweavers.com
Wed Mar 6 07:00:14 CST 2019


From: Daniel Ansorregui <mailszeros at gmail.com>

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/d3d9/tests/visual.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 122 insertions(+)

diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index c62a94a8fb1..f6b9211d84c 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -15493,6 +15493,15 @@ static void test_fetch4(void)
         {{ 1.0f,  1.0f, 0.0f}, {1.0f, 0.0f, 4.0f, 2.0f}},
         {{-1.0f, -1.0f, 0.0f}, {0.0f, 1.0f, 4.0f, 2.0f}},
         {{ 1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 4.0f, 2.0f}},
+    },
+    quad2[] =
+    {
+        /* Tilted on the z-axis to get a depth gradient in the depth test. */
+        /* Note: Using 0.55f-0.6f to avoid rounding errors on depth tests. */
+        {{-1.0f,  1.0f, 1.0f}, {0.0f, 0.0f, 0.6f, 0.0f}},
+        {{ 1.0f,  1.0f, 0.0f}, {1.0f, 0.0f, 0.6f, 0.0f}},
+        {{-1.0f, -1.0f, 0.0f}, {0.0f, 1.0f, 0.6f, 0.0f}},
+        {{ 1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.6f, 0.0f}},
     };
 
     static const struct
@@ -15548,6 +15557,67 @@ static void test_fetch4(void)
         {"FFP_proj3",  NULL,            4, FALSE, D3DTTFF_COUNT3 | D3DTTFF_PROJECTED},
     };
 
+    static const struct
+    {
+        const char *name;
+        D3DFORMAT format;
+        DWORD data;
+        unsigned int x, y;
+        unsigned int w, h;
+        D3DCOLOR colour_amd[3];
+        D3DCOLOR colour_intel[3];
+        BOOL todo;
+    }
+    format_tests[] =
+    {
+        /* Enabled formats */
+        {
+            "L8", D3DFMT_L8,
+            0xff804010, 360, 30, 2, 2,
+            {0x40400000, 0x40400000, 0x10400000},
+            {0x40101040, 0x40101040, 0x40101040},
+        },
+        {
+            "L16", D3DFMT_L16,
+            0xff804010, 360, 30, 2, 2,
+            {0xffff0000, 0xffff0000, 0x40ff0000},
+            {0xff4040ff, 0xff4040ff, 0xff4040ff},
+        },
+        {
+            "R16F", D3DFMT_R16F,
+            0x38003c00, 360, 30, 2, 2,
+            {0x80800000, 0x80800000, 0xff800000},
+            {0x80ffff80, 0x80ffff80, 0x80ffff80},
+        },
+        {
+            "R32F", D3DFMT_R32F,
+            0x3f000000, 360, 30, 2, 2,
+            {0x00000000, 0x00000000, 0x80000000},
+            {0x00808000, 0x00808000, 0x00808000},
+        },
+        {
+            "ATI1", MAKEFOURCC('A','T','I','1'),
+            0xb97700ff, 360, 30, 4, 4,
+            {0x6d6d6d6d, 0x6d6d6d6d, 0x49494949},
+            {0xff6d00ff, 0xff6d00ff, 0xff4900ff},
+        },
+        /* Unsupported on Intel, broken in Wine. */
+        {
+            "A8", D3DFMT_A8,
+            0xff804010, 360, 30, 2, 2,
+            {0x40400000, 0x40400000, 0x10400000},
+            {0x00000000, 0x00000000, 0x00000000},
+            TRUE,
+        },
+        /* Unsupported format. */
+        {
+            "A8R8G8B8", D3DFMT_A8R8G8B8,
+            0xff804010, 360, 270, 2, 2,
+            {0x00000000, 0x00000000, 0xff804010},
+            {0x00000000, 0x00000000, 0xff804010},
+        },
+    };
+
     D3DCOLOR colour, colour_amd, colour_intel, colour_off;
     IDirect3DPixelShader9 *ps[ARRAY_SIZE(shaders)];
     IDirect3DSurface9 *original_rt;
@@ -15695,6 +15765,58 @@ static void test_fetch4(void)
         hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
         ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
     }
+    hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
+    ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+    /* Test Fetch4 format support. */
+    for (i = 0; i < ARRAY_SIZE(format_tests); ++i)
+    {
+        IDirect3DTexture9 *tex;
+
+        hr = IDirect3DDevice9_CreateTexture(device, format_tests[i].w, format_tests[i].h,
+                1, 0, format_tests[i].format, D3DPOOL_MANAGED, &tex, NULL);
+        ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+        hr = IDirect3DTexture9_LockRect(tex, 0, &lr, NULL, 0);
+        ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+        memcpy(lr.pBits, &format_tests[i].data, 4);
+        hr = IDirect3DTexture9_UnlockRect(tex, 0);
+        ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+        hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *)tex);
+        ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+        for (j = 0; j < ARRAY_SIZE(format_tests[i].colour_amd); ++j)
+        {
+            hr = IDirect3DDevice9_SetVertexShader(device, ps[j] ? vs : NULL);
+            ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+            hr = IDirect3DDevice9_SetPixelShader(device,  ps[j]);
+            ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+            hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0, 0.0f, 0);
+            ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+            hr = IDirect3DDevice9_BeginScene(device);
+            ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+            hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad2, sizeof(*quad2));
+            ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+            hr = IDirect3DDevice9_EndScene(device);
+            ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+            get_rt_readback(original_rt, &rb);
+            colour_amd = format_tests[i].colour_amd[j];
+            colour_intel = format_tests[i].colour_intel[j];
+            colour = get_readback_color(&rb, format_tests[i].x, format_tests[i].y);
+            /* On windows just test the R channel, since G/B might be 0xff or 0x00. */
+            todo_wine_if(format_tests[i].todo)
+                ok(color_match(colour, colour_amd, 2) || broken(color_match(colour, colour_intel, 2))
+                        || broken(color_match(colour & 0x00ff0000, colour_amd & 0x00ff0000, 2)),
+                        "Test %s on %s: Got unexpected colour 0x%08x at (%u, %u).\n",
+                        shaders[j].name, format_tests[i].name, colour, format_tests[i].x, format_tests[i].y);
+            release_surface_readback(&rb);
+
+            hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
+            ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+        }
+        IDirect3DTexture9_Release(tex);
+    }
 
     IDirect3DTexture9_Release(texture);
     for (i = 0; i < ARRAY_SIZE(ps); ++i)
-- 
2.11.0




More information about the wine-devel mailing list