[PATCH 4/5] d3d9/tests: Add tests for Fetch4 with 3D textures.
Henri Verbeet
hverbeet at codeweavers.com
Wed Mar 6 07:00:15 CST 2019
From: Daniel Ansorregui <mailszeros at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/d3d9/tests/visual.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 85 insertions(+), 1 deletion(-)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index f6b9211d84c..4b9b241b37d 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -15481,6 +15481,15 @@ static void test_fetch4(void)
0x02000001, 0x800f0800, 0x80e40000, /* mov oC0, r0 */
0x0000ffff, /* end */
};
+ static const DWORD ps_code_3d[] =
+ {
+ 0xffff0300, /* ps_3_0 */
+ 0x0200001f, 0x80000005, 0x900f0000, /* dcl_texcoord v0 */
+ 0x0200001f, 0xa0000000, 0xa00f0800, /* dcl_volume s0 */
+ 0x03000042, 0x800f0000, 0x90e40000, 0xa0e40800, /* texld r0, v0, s0 */
+ 0x02000001, 0x800f0800, 0x80e40000, /* mov oC0, r0 */
+ 0x0000ffff, /* end */
+ };
static const struct
{
@@ -15510,6 +15519,8 @@ static void test_fetch4(void)
D3DCOLOR colour_amd[16];
D3DCOLOR colour_intel[16];
D3DCOLOR colour_fetch4_off[16];
+ D3DCOLOR colour_3d_fetch4_off[16];
+ D3DCOLOR colour_3d_amd_zround[16];
}
expected_colours =
{
@@ -15532,6 +15543,16 @@ static void test_fetch4(void)
0x02020202, 0xf2f2f2f2, 0xf1f1f1f1, 0x01010101,
0x04040404, 0xf4f4f4f4, 0xf3f3f3f3, 0x03030303,
0x23232323, 0x22222222, 0x21212121, 0x20202020},
+ /* Fetch4 off on 3D textures. */
+ {0xff020202, 0xfff2f2f2, 0xfff1f1f1, 0xff010101,
+ 0xff050505, 0xfff4f4f4, 0xfff3f3f3, 0xff030303,
+ 0xff232323, 0xff222222, 0xff212121, 0xff202020,
+ 0xff131313, 0xff121212, 0xff111111, 0xff101010},
+ /* Fetch4 on, 3D texture without nearest z rounding. */
+ {0x02f204f4, 0xf2f1f4f3, 0xf101f303, 0x01010303,
+ 0x04f42322, 0xf4f32221, 0xf3032120, 0x03032020,
+ 0x23221312, 0x22211211, 0x21201110, 0x20201010,
+ 0x13121312, 0x12111211, 0x11101110, 0x10101010},
};
static const DWORD fetch4_data[] = {0x10111213, 0x01f1f202, 0x03f3f404, 0x20212223};
@@ -15618,15 +15639,18 @@ static void test_fetch4(void)
},
};
- D3DCOLOR colour, colour_amd, colour_intel, colour_off;
+ D3DCOLOR colour, colour_amd, colour_intel, colour_off, colour_zround;
IDirect3DPixelShader9 *ps[ARRAY_SIZE(shaders)];
+ IDirect3DVolumeTexture9 *texture_3d;
IDirect3DSurface9 *original_rt;
+ IDirect3DPixelShader9 *ps_3d;
struct surface_readback rb;
IDirect3DVertexShader9 *vs;
IDirect3DTexture9 *texture;
IDirect3DDevice9 *device;
unsigned int i, j, x, y;
D3DLOCKED_RECT lr;
+ D3DLOCKED_BOX lb;
IDirect3D9 *d3d;
ULONG refcount;
D3DCAPS9 caps;
@@ -15681,6 +15705,8 @@ static void test_fetch4(void)
hr = IDirect3DDevice9_CreatePixelShader(device, shaders[i].ps_code, &ps[i]);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
}
+ hr = IDirect3DDevice9_CreatePixelShader(device, ps_code_3d, &ps_3d);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE4(0));
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
@@ -15818,12 +15844,70 @@ static void test_fetch4(void)
IDirect3DTexture9_Release(tex);
}
+ hr = IDirect3DDevice9_CreateVolumeTexture(device, 4, 4, 2, 1, 0, D3DFMT_L8, D3DPOOL_MANAGED, &texture_3d, NULL);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DVolumeTexture9_LockBox(texture_3d, 0, &lb, NULL, 0);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ for (i = 0; i < ARRAY_SIZE(fetch4_data); ++i)
+ {
+ memcpy((BYTE *)lb.pBits + i * lb.RowPitch, &fetch4_data[i], sizeof(fetch4_data[i]));
+ /* Shift the lower level, to keep it different. */
+ memcpy((BYTE *)lb.pBits + i * lb.RowPitch + lb.SlicePitch, &fetch4_data[(i + 1) % 4], sizeof(fetch4_data[i]));
+ }
+ hr = IDirect3DVolumeTexture9_UnlockBox(texture_3d, 0);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *)texture_3d);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+ /* Test Fetch4 with 3D textures. */
+ for (i = 0; i < 2; ++i)
+ {
+ hr = IDirect3DDevice9_SetVertexShader(device, i ? vs : NULL);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetPixelShader(device, i ? ps_3d : NULL);
+ 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);
+ for (j = 0; j < ARRAY_SIZE(expected_colours.colour_amd); ++j)
+ {
+ x = expected_colours.x[j % 4];
+ y = expected_colours.y[j / 4];
+ colour_amd = expected_colours.colour_amd[j];
+ colour_intel = expected_colours.colour_intel[j];
+ colour_off = expected_colours.colour_3d_fetch4_off[j];
+ colour_zround = expected_colours.colour_3d_amd_zround[j];
+ colour = get_readback_color(&rb, x, y);
+
+ /* Note: Fetch4 on 3D textures have different results based on the vendor/driver
+ * - AMD "HD 5700" rounds to nearest "z" texel, and does fetch4 normally on .xy
+ * - AMD "R500" has fetch4 disabled
+ * - AMD "R580" has fetch4 enabled sampling at .xy0
+ * - Intel UHD 620 sample with fetch4 at .xy0 */
+ ok(color_match(colour, colour_off, 2) || broken(color_match(colour, colour_zround, 2)
+ || color_match(colour, colour_intel, 2) || color_match(colour, colour_amd, 2)),
+ "Test 3D %s: Got unexpected colour 0x%08x at (%u, %u).\n", shaders[i].name, colour, x, y);
+ }
+ release_surface_readback(&rb);
+ hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ }
+
+ IDirect3DVolumeTexture9_Release(texture_3d);
IDirect3DTexture9_Release(texture);
for (i = 0; i < ARRAY_SIZE(ps); ++i)
{
if (ps[i])
IDirect3DPixelShader9_Release(ps[i]);
}
+ IDirect3DPixelShader9_Release(ps_3d);
IDirect3DVertexShader9_Release(vs);
IDirect3DSurface9_Release(original_rt);
refcount = IDirect3DDevice9_Release(device);
--
2.11.0
More information about the wine-devel
mailing list