[PATCH 5/5] d3d9/tests: Add tests for Fetch4 with depth textures.
Henri Verbeet
hverbeet at codeweavers.com
Wed Mar 6 07:00:16 CST 2019
From: Daniel Ansorregui <mailszeros at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/d3d9/tests/visual.c | 175 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 173 insertions(+), 2 deletions(-)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index 4b9b241b37d..61a67944a0a 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -15639,16 +15639,75 @@ static void test_fetch4(void)
},
};
+ static const struct
+ {
+ D3DCOLOR colour_off, colour_amd, colour_intel;
+ unsigned int x, y;
+ }
+ expected_depth[][4] =
+ {
+ {
+ /* Shadow samplers. */
+ {0xffffffff, 0xffffffff, 0xffffffff, 20, 15},
+ {0xffffffff, 0xffffffff, 0xffffffff, 260, 15},
+ {0x00000000, 0x00000000, 0x00000000, 20, 255},
+ {0x00000000, 0x00000000, 0x00000000, 260, 135},
+ },
+ {
+ /* DF16. */
+ {0xfffe0000, 0xfedfdfbf, 0xffffffff, 20, 15},
+ {0xff9f0000, 0x9f7f7f5f, 0x9fbfbf9f, 260, 15},
+ {0xff800000, 0x7f5f5f3f, 0x9f809f80, 20, 255},
+ {0xff600000, 0x5f3f3f1f, 0x80809f60, 260, 135},
+ },
+ {
+ /* DF24. */
+ {0xffff0000, 0xffdfdfbf, 0xffffffff, 20, 15},
+ {0xff9f0000, 0x9f7f7f5f, 0x9fbfbf9f, 260, 15},
+ {0xff800000, 0x7f5f5f3f, 0x9f809f80, 20, 255},
+ {0xff600000, 0x5f3f3f1f, 0x80809f60, 260, 135},
+ },
+ {
+ /* INTZ. */
+ {0xffffffff, 0xffdfdfbf, 0xffffffff, 20, 15},
+ {0x9f9f9f9f, 0x9f7f7f5f, 0x9fbfbf9f, 260, 15},
+ {0x7f7f7f7f, 0x7f5f5f3f, 0x9f809f80, 20, 255},
+ {0x5f5f5f5f, 0x5f3f3f1f, 0x80809f60, 260, 135},
+ }
+ };
+
+ static const struct
+ {
+ const char *name;
+ D3DFORMAT format;
+ unsigned int index;
+ }
+ depth_tests[] =
+ {
+ {"D16_LOCKABLE", D3DFMT_D16_LOCKABLE, 0},
+ {"D32", D3DFMT_D32, 0},
+ {"D15S1", D3DFMT_D15S1, 0},
+ {"D24S8", D3DFMT_D24S8, 0},
+ {"D24X8", D3DFMT_D24X8, 0},
+ {"D24X4S4", D3DFMT_D24X4S4, 0},
+ {"D16", D3DFMT_D16, 0},
+ {"D32F_LOCKABLE", D3DFMT_D32F_LOCKABLE, 0},
+ {"D24FS8", D3DFMT_D24FS8, 0},
+ {"DF16", MAKEFOURCC('D','F','1','6'), 1},
+ {"DF24", MAKEFOURCC('D','F','2','4'), 2},
+ {"INTZ", MAKEFOURCC('I','N','T','Z'), 3},
+ };
+
D3DCOLOR colour, colour_amd, colour_intel, colour_off, colour_zround;
IDirect3DPixelShader9 *ps[ARRAY_SIZE(shaders)];
IDirect3DVolumeTexture9 *texture_3d;
- IDirect3DSurface9 *original_rt;
+ IDirect3DSurface9 *original_rt, *rt;
IDirect3DPixelShader9 *ps_3d;
struct surface_readback rb;
IDirect3DVertexShader9 *vs;
IDirect3DTexture9 *texture;
+ unsigned int i, j, k, x, y;
IDirect3DDevice9 *device;
- unsigned int i, j, x, y;
D3DLOCKED_RECT lr;
D3DLOCKED_BOX lb;
IDirect3D9 *d3d;
@@ -15682,6 +15741,9 @@ static void test_fetch4(void)
}
hr = IDirect3DDevice9_GetRenderTarget(device, 0, &original_rt);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DDevice9_CreateRenderTarget(device, 8, 8, D3DFMT_A8R8G8B8,
+ D3DMULTISAMPLE_NONE, 0, FALSE, &rt, NULL);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = IDirect3DDevice9_CreateTexture(device, 4, 4, 1, 0, D3DFMT_L8, D3DPOOL_MANAGED, &texture, NULL);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
@@ -15900,6 +15962,114 @@ static void test_fetch4(void)
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
}
+ /* Test Fetch4 with depth textures. */
+ for (i = 0; i < ARRAY_SIZE(depth_tests); ++i)
+ {
+ D3DFORMAT format = depth_tests[i].format;
+ IDirect3DTexture9 *depth_texture;
+ IDirect3DSurface9 *ds;
+
+ if (FAILED(IDirect3D9_CheckDeviceFormat(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
+ D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, format)))
+ {
+ skip("Skipping %s depth test, unsupported format.\n", depth_tests[i].name);
+ continue;
+ }
+
+ hr = IDirect3DDevice9_CreateTexture(device, 8, 8, 1,
+ D3DUSAGE_DEPTHSTENCIL, format, D3DPOOL_DEFAULT, &depth_texture, NULL);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DTexture9_GetSurfaceLevel(depth_texture, 0, &ds);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetDepthStencilSurface(device, ds);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetRenderTarget(device, 0, rt);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetVertexShader(device, NULL);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetPixelShader(device, NULL);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *)texture);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetSamplerState(device, 0,
+ D3DSAMP_MIPMAPLODBIAS, MAKEFOURCC('G','E','T','1'));
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+ /* Setup the depth/stencil surface. */
+ hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_ZBUFFER, 0, 0.0f, 0);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+ /* Render to the depth surface. */
+ 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);
+
+ hr = IDirect3DDevice9_SetDepthStencilSurface(device, NULL);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ IDirect3DSurface9_Release(ds);
+ hr = IDirect3DDevice9_SetRenderTarget(device, 0, original_rt);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *)depth_texture);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+ /* Set a shader for depth sampling, otherwise Windows does not show
+ * anything. */
+ hr = IDirect3DDevice9_SetVertexShader(device, vs);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetPixelShader(device, ps[1]); /* texld */
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+ for (j = 0; j < 2; ++j)
+ {
+ hr = IDirect3DDevice9_SetSamplerState(device, 0,
+ D3DSAMP_MIPMAPLODBIAS, MAKEFOURCC('G','E','T', j ? '4' : '1' ));
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+ /* Do the actual shadow mapping. */
+ 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);
+ for (k = 0; k < ARRAY_SIZE(expected_depth[depth_tests[i].index]); ++k)
+ {
+ x = expected_depth[depth_tests[i].index][k].x;
+ y = expected_depth[depth_tests[i].index][k].y;
+ colour_amd = expected_depth[depth_tests[i].index][k].colour_amd;
+ colour_intel = expected_depth[depth_tests[i].index][k].colour_intel;
+ colour_off = expected_depth[depth_tests[i].index][k].colour_off;
+ colour = get_readback_color(&rb, x, y);
+
+ /* When Fetch4 is off, ignore the .g and .b channels on
+ * windows. Some implementations will replicate the .r channel
+ * to .g and .b, others will return 0 for .g and .b. */
+ if (!j)
+ ok(color_match(colour, colour_off, 2)
+ || broken(color_match(colour & 0x00ff0000, colour_off & 0x00ff0000, 2)),
+ "Test off: Got unexpected colour 0x%08x for format %s at (%u, %u).\n",
+ colour, depth_tests[i].name, x, y);
+ else
+ ok(color_match(colour, colour_amd, 2) || broken(color_match(colour, colour_intel, 2)),
+ "Test on: Got unexpected colour 0x%08x for format %s at (%u, %u).\n",
+ colour, depth_tests[i].name, x, y);
+ }
+ release_surface_readback(&rb);
+
+ hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ }
+
+ hr = IDirect3DDevice9_SetTexture(device, 0, NULL);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ IDirect3DTexture9_Release(depth_texture);
+ }
+
IDirect3DVolumeTexture9_Release(texture_3d);
IDirect3DTexture9_Release(texture);
for (i = 0; i < ARRAY_SIZE(ps); ++i)
@@ -15909,6 +16079,7 @@ static void test_fetch4(void)
}
IDirect3DPixelShader9_Release(ps_3d);
IDirect3DVertexShader9_Release(vs);
+ IDirect3DSurface9_Release(rt);
IDirect3DSurface9_Release(original_rt);
refcount = IDirect3DDevice9_Release(device);
ok(!refcount, "Device has %u references left.\n", refcount);
--
2.11.0
More information about the wine-devel
mailing list