d3d9/tests: Add test for occlusion query with result bigger than UINT32_MAX.

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2016-11-25 12:17:53 +01:00 committed by Alexandre Julliard
parent e22b70f270
commit 6b80fe5095
1 changed files with 78 additions and 9 deletions

View File

@ -5489,7 +5489,7 @@ static void test_query_support(void)
DestroyWindow(window); DestroyWindow(window);
} }
static void test_occlusion_query_states(void) static void test_occlusion_query(void)
{ {
static const float quad[] = static const float quad[] =
{ {
@ -5498,21 +5498,25 @@ static void test_occlusion_query_states(void)
1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f,
1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f,
}; };
unsigned int data_size, i, count;
struct device_desc device_desc; struct device_desc device_desc;
IDirect3DQuery9 *query = NULL; IDirect3DQuery9 *query = NULL;
unsigned int data_size, i;
IDirect3DDevice9 *device; IDirect3DDevice9 *device;
IDirect3DSurface9 *rt;
IDirect3D9 *d3d9; IDirect3D9 *d3d9;
D3DVIEWPORT9 vp;
ULONG refcount; ULONG refcount;
D3DCAPS9 caps;
HWND window; HWND window;
HRESULT hr; HRESULT hr;
union union
{ {
WORD word[4]; WORD word[4];
DWORD dword[2]; DWORD dword[2];
} data; UINT64 uint;
} data, expected;
BOOL broken_occlusion = FALSE; BOOL broken_occlusion = FALSE;
DWORD expected = registry_mode.dmPelsWidth * registry_mode.dmPelsHeight; expected.uint = registry_mode.dmPelsWidth * registry_mode.dmPelsHeight;
window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE, window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0, 0, 640, 480, 0, 0, 0, 0); 0, 0, 640, 480, 0, 0, 0, 0);
@ -5591,7 +5595,7 @@ static void test_occlusion_query_states(void)
memset(&data, 0xff, sizeof(data)); memset(&data, 0xff, sizeof(data));
hr = IDirect3DQuery9_GetData(query, &data, data_size, D3DGETDATA_FLUSH); hr = IDirect3DQuery9_GetData(query, &data, data_size, D3DGETDATA_FLUSH);
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
ok(data.dword[0] == expected || broken(!data.dword[0]), ok(data.dword[0] == expected.dword[0] || broken(!data.dword[0]),
"Occlusion query returned an unexpected result (0x%.8x).\n", data.dword[0]); "Occlusion query returned an unexpected result (0x%.8x).\n", data.dword[0]);
if (!data.dword[0]) if (!data.dword[0])
{ {
@ -5603,7 +5607,7 @@ static void test_occlusion_query_states(void)
hr = IDirect3DQuery9_GetData(query, &data, sizeof(WORD), D3DGETDATA_FLUSH); hr = IDirect3DQuery9_GetData(query, &data, sizeof(WORD), D3DGETDATA_FLUSH);
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
if (!broken_occlusion) if (!broken_occlusion)
ok(data.word[0] == (WORD)expected, ok(data.word[0] == expected.word[0],
"Occlusion query returned an unexpected result (0x%.8x).\n", data.dword[0]); "Occlusion query returned an unexpected result (0x%.8x).\n", data.dword[0]);
ok(data.word[1] == 0xffff, ok(data.word[1] == 0xffff,
"data was modified outside of the expected size (0x%.8x).\n", data.dword[0]); "data was modified outside of the expected size (0x%.8x).\n", data.dword[0]);
@ -5612,7 +5616,7 @@ static void test_occlusion_query_states(void)
hr = IDirect3DQuery9_GetData(query, &data, sizeof(data), D3DGETDATA_FLUSH); hr = IDirect3DQuery9_GetData(query, &data, sizeof(data), D3DGETDATA_FLUSH);
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
if (!broken_occlusion) if (!broken_occlusion)
ok(data.dword[0] == expected, ok(data.dword[0] == expected.dword[0],
"Occlusion query returned an unexpected result (0x%.8x).\n", data.dword[0]); "Occlusion query returned an unexpected result (0x%.8x).\n", data.dword[0]);
/* Different drivers seem to return different data in those high bytes on Windows, but they all /* Different drivers seem to return different data in those high bytes on Windows, but they all
write something there and the extra data is consistent (I've seen 0x00000000 and 0xdddddddd write something there and the extra data is consistent (I've seen 0x00000000 and 0xdddddddd
@ -5642,8 +5646,73 @@ static void test_occlusion_query_states(void)
hr = IDirect3DQuery9_Issue(query, D3DISSUE_END); hr = IDirect3DQuery9_Issue(query, D3DISSUE_END);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); if (broken_occlusion)
goto done;
hr = IDirect3DDevice9_GetDeviceCaps(device, &caps);
ok(SUCCEEDED(hr), "Failed to get device caps, hr %#x.\n", hr);
vp.X = 0;
vp.Y = 0;
vp.Width = min(caps.MaxTextureWidth, 8192);
vp.Height = min(caps.MaxTextureHeight, 8192);
vp.MinZ = 0.0f;
vp.MaxZ = 1.0f;
hr = IDirect3DDevice9_SetViewport(device, &vp);
ok(SUCCEEDED(hr), "Failed to set viewport, hr %#x.\n", hr);
hr = IDirect3DDevice9_CreateRenderTarget(device, vp.Width, vp.Height,
D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, FALSE, &rt, NULL);
if (FAILED(hr))
{
skip("Failed to create render target (width %u, height %u), hr %#x.\n", vp.Width, vp.Height, hr);
goto done;
}
ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
hr = IDirect3DDevice9_SetRenderTarget(device, 0, rt);
ok(SUCCEEDED(hr), "Failed to set render target, hr %#x.\n", hr);
hr = IDirect3DDevice9_SetRenderState(device, D3DRS_ZENABLE, FALSE);
ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderState returned %08x\n", hr);
expected.uint = vp.Width * vp.Height;
count = ((((UINT64)~0u) + 1) / expected.uint) + 1;
expected.uint *= count;
trace("Expects 0x%08x%08x samples.\n", expected.dword[1], expected.dword[0]);
hr = IDirect3DQuery9_Issue(query, D3DISSUE_BEGIN);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = IDirect3DDevice9_BeginScene(device);
ok(SUCCEEDED(hr), "Failed to begin scene, hr %#x.\n", hr);
for (i = 0; i < count; i++)
{
hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLEFAN, 2, quad, 3 * sizeof(float));
ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
}
hr = IDirect3DDevice9_EndScene(device);
ok(SUCCEEDED(hr), "Failed to end scene, hr %#x.\n", hr);
hr = IDirect3DQuery9_Issue(query, D3DISSUE_END);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
for (i = 0; i < 500; ++i)
{
if ((hr = IDirect3DQuery9_GetData(query, NULL, 0, D3DGETDATA_FLUSH)) != S_FALSE)
break;
Sleep(10);
}
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
memset(&data, 0xff, sizeof(data));
hr = IDirect3DQuery9_GetData(query, &data, sizeof(data), D3DGETDATA_FLUSH);
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
ok((data.dword[0] == expected.dword[0] && data.dword[1] == expected.dword[1])
|| (data.dword[0] == 0xffffffff && !data.dword[1])
|| broken(data.dword[0] < 0xffffffff && !data.dword[1]),
"Got unexpected query result 0x%08x%08x.\n", data.dword[1], data.dword[0]);
IDirect3DSurface9_Release(rt);
done:
IDirect3DQuery9_Release(query); IDirect3DQuery9_Release(query);
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);
@ -11310,7 +11379,7 @@ START_TEST(device)
test_vb_lock_flags(); test_vb_lock_flags();
test_vertex_buffer_alignment(); test_vertex_buffer_alignment();
test_query_support(); test_query_support();
test_occlusion_query_states(); test_occlusion_query();
test_timestamp_query(); test_timestamp_query();
test_get_set_vertex_shader(); test_get_set_vertex_shader();
test_vertex_shader_constant(); test_vertex_shader_constant();