d3d9/tests: Add tests for Fetch4 with depth textures.

Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Daniel Ansorregui 2019-03-06 16:30:16 +03:30 committed by Alexandre Julliard
parent 48ca8c1c63
commit 771f528429
1 changed files with 173 additions and 2 deletions

View File

@ -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; D3DCOLOR colour, colour_amd, colour_intel, colour_off, colour_zround;
IDirect3DPixelShader9 *ps[ARRAY_SIZE(shaders)]; IDirect3DPixelShader9 *ps[ARRAY_SIZE(shaders)];
IDirect3DVolumeTexture9 *texture_3d; IDirect3DVolumeTexture9 *texture_3d;
IDirect3DSurface9 *original_rt; IDirect3DSurface9 *original_rt, *rt;
IDirect3DPixelShader9 *ps_3d; IDirect3DPixelShader9 *ps_3d;
struct surface_readback rb; struct surface_readback rb;
IDirect3DVertexShader9 *vs; IDirect3DVertexShader9 *vs;
IDirect3DTexture9 *texture; IDirect3DTexture9 *texture;
unsigned int i, j, k, x, y;
IDirect3DDevice9 *device; IDirect3DDevice9 *device;
unsigned int i, j, x, y;
D3DLOCKED_RECT lr; D3DLOCKED_RECT lr;
D3DLOCKED_BOX lb; D3DLOCKED_BOX lb;
IDirect3D9 *d3d; IDirect3D9 *d3d;
@ -15682,6 +15741,9 @@ static void test_fetch4(void)
} }
hr = IDirect3DDevice9_GetRenderTarget(device, 0, &original_rt); hr = IDirect3DDevice9_GetRenderTarget(device, 0, &original_rt);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); 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); hr = IDirect3DDevice9_CreateTexture(device, 4, 4, 1, 0, D3DFMT_L8, D3DPOOL_MANAGED, &texture, NULL);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); 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); 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); IDirect3DVolumeTexture9_Release(texture_3d);
IDirect3DTexture9_Release(texture); IDirect3DTexture9_Release(texture);
for (i = 0; i < ARRAY_SIZE(ps); ++i) for (i = 0; i < ARRAY_SIZE(ps); ++i)
@ -15909,6 +16079,7 @@ static void test_fetch4(void)
} }
IDirect3DPixelShader9_Release(ps_3d); IDirect3DPixelShader9_Release(ps_3d);
IDirect3DVertexShader9_Release(vs); IDirect3DVertexShader9_Release(vs);
IDirect3DSurface9_Release(rt);
IDirect3DSurface9_Release(original_rt); IDirect3DSurface9_Release(original_rt);
refcount = IDirect3DDevice9_Release(device); refcount = IDirect3DDevice9_Release(device);
ok(!refcount, "Device has %u references left.\n", refcount); ok(!refcount, "Device has %u references left.\n", refcount);