[PATCH 5/8] d3d9/tests: Add tests for D3DQUERY_TIMESTAMP* queries.
Adam Martinson
amartinson at codeweavers.com
Wed May 4 11:28:22 CDT 2011
---
dlls/d3d9/tests/query.c | 163 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 163 insertions(+), 0 deletions(-)
diff --git a/dlls/d3d9/tests/query.c b/dlls/d3d9/tests/query.c
index 8bcfcf6..ebe639c 100644
--- a/dlls/d3d9/tests/query.c
+++ b/dlls/d3d9/tests/query.c
@@ -240,6 +240,168 @@ cleanup:
}
}
+/* Test for basic sanity against QueryPerformanceCounter()/QueryPerformanceFrequency() */
+static void test_timestamp_queries(IDirect3D9 *pD3d, HWND hwnd)
+{
+ HRESULT hr;
+ int count;
+ IDirect3DDevice9 *pDevice = NULL;
+ D3DPRESENT_PARAMETERS d3dpp;
+ D3DDISPLAYMODE d3ddm;
+ IDirect3DQuery9 *qTimestamp1 = NULL, *qTimestamp2 = NULL, *qTimestampdisjoint = NULL, *qTimestampfreq = NULL;
+ UINT64 freq = 0, ts1 = 0, ts2 = 0, elapsed, qp_elapsed1, qp_elapsed2;
+ LARGE_INTEGER qp_freq, qp_ts1, qp_ts2, qp_ts3, qp_ts4;
+ BOOL ts_dj = TRUE;
+ UINT size;
+
+ if (!QueryPerformanceFrequency(&qp_freq))
+ {
+ skip("QueryPerformanceFrequency() failed\n");
+ goto cleanup;
+ }
+
+ IDirect3D9_GetAdapterDisplayMode( pD3d, D3DADAPTER_DEFAULT, &d3ddm );
+ ZeroMemory( &d3dpp, sizeof(d3dpp) );
+ d3dpp.Windowed = TRUE;
+ d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
+ d3dpp.BackBufferFormat = d3ddm.Format;
+
+ hr = IDirect3D9_CreateDevice( pD3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice );
+ ok(SUCCEEDED(hr) || hr == D3DERR_NOTAVAILABLE, "Failed to create IDirect3D9Device (%08x)\n", hr);
+ if (FAILED(hr))
+ {
+ skip("Failed to create a d3d device\n");
+ goto cleanup;
+ }
+
+ hr = IDirect3DDevice9_CreateQuery(pDevice, D3DQUERYTYPE_TIMESTAMP, &qTimestamp1);
+ ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE,
+ "IDirect3DDevice9_CreateQuery returned unexpected return value %08x\n", hr);
+ hr = IDirect3DDevice9_CreateQuery(pDevice, D3DQUERYTYPE_TIMESTAMP, &qTimestamp2);
+ ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE,
+ "IDirect3DDevice9_CreateQuery returned unexpected return value %08x\n", hr);
+ hr = IDirect3DDevice9_CreateQuery(pDevice, D3DQUERYTYPE_TIMESTAMPFREQ, &qTimestampfreq);
+ ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE,
+ "IDirect3DDevice9_CreateQuery returned unexpected return value %08x\n", hr);
+ hr = IDirect3DDevice9_CreateQuery(pDevice, D3DQUERYTYPE_TIMESTAMPDISJOINT, &qTimestampdisjoint);
+ ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE,
+ "IDirect3DDevice9_CreateQuery returned unexpected return value %08x\n", hr);
+
+ if(!qTimestampfreq || !qTimestamp1 || !qTimestamp2 || !qTimestampdisjoint)
+ {
+ skip("Timestamp queries not supported\n");
+ goto cleanup;
+ }
+
+ do {
+ QueryPerformanceCounter(&qp_ts1);
+
+ hr = IDirect3DQuery9_Issue(qTimestampdisjoint, D3DISSUE_BEGIN);
+ ok(hr == D3D_OK, "IDirect3DQuery9_Issue(qTimestampdisjoint, D3DISSUE_BEGIN) returned %08x\n", hr);
+
+ hr = IDirect3DQuery9_Issue(qTimestampfreq, D3DISSUE_END);
+ ok(hr == D3D_OK, "IDirect3DQuery9_Issue(qTimestampfreq, D3DISSUE_END) returned %08x\n", hr);
+
+ hr = IDirect3DQuery9_Issue(qTimestamp1, D3DISSUE_END);
+ ok(hr == D3D_OK, "IDirect3DQuery9_Issue(qTimestamp1, D3DISSUE_END) returned %08x\n", hr);
+
+ do {
+ QueryPerformanceCounter(&qp_ts2);
+ } while (qp_ts1.QuadPart == qp_ts2.QuadPart);
+
+ do {
+ QueryPerformanceCounter(&qp_ts3);
+ } while (qp_ts2.QuadPart == qp_ts3.QuadPart);
+
+ hr = IDirect3DQuery9_Issue(qTimestamp2, D3DISSUE_END);
+ ok(hr == D3D_OK, "IDirect3DQuery9_Issue(qTimestamp2, D3DISSUE_END) returned %08x\n", hr);
+
+ hr = IDirect3DQuery9_Issue(qTimestampdisjoint, D3DISSUE_END);
+ ok(hr == D3D_OK, "IDirect3DQuery9_Issue(qTimestampdisjoint, D3DISSUE_END) returned %08x\n", hr);
+
+ do {
+ QueryPerformanceCounter(&qp_ts4);
+ } while (qp_ts3.QuadPart == qp_ts4.QuadPart);
+
+ } while (qp_ts1.QuadPart > qp_ts2.QuadPart || qp_ts2.QuadPart > qp_ts3.QuadPart || qp_ts3.QuadPart > qp_ts4.QuadPart);
+
+ for (count = 0; (hr = IDirect3DQuery9_GetData(qTimestamp1, NULL, 0, D3DGETDATA_FLUSH)) == S_FALSE && count < 500; ++count)
+ {
+ Sleep(10);
+ }
+ ok(hr == S_OK, "Timestamp1 query did not finish\n");
+
+ for (count = 0; (hr = IDirect3DQuery9_GetData(qTimestamp2, NULL, 0, D3DGETDATA_FLUSH)) == S_FALSE && count < 500; ++count)
+ {
+ Sleep(10);
+ }
+ ok(hr == S_OK, "Timestamp2 query did not finish\n");
+
+ for (count = 0; (hr = IDirect3DQuery9_GetData(qTimestampfreq, NULL, 0, D3DGETDATA_FLUSH)) == S_FALSE && count < 500; ++count)
+ {
+ Sleep(10);
+ }
+ ok(hr == S_OK, "Timestampfreq query did not finish\n");
+
+ for (count = 0; (hr = IDirect3DQuery9_GetData(qTimestampdisjoint, NULL, 0, D3DGETDATA_FLUSH)) == S_FALSE && count < 500; ++count)
+ {
+ Sleep(10);
+ }
+ ok(hr == S_OK, "Timestampdisjoint query did not finish\n");
+
+ size = IDirect3DQuery9_GetDataSize(qTimestampdisjoint);
+ ok(size == sizeof(ts_dj), "IDirect3DQuery9_GetDataSize(qTimestampdisjoint) returned %i\n", size);
+ hr = IDirect3DQuery9_GetData(qTimestampdisjoint, &ts_dj, size, 0);
+ ok(hr == S_OK, "IDirect3DQuery9_GetData(qTimestampdisjoint) failed\n");
+
+ if (ts_dj)
+ {
+ skip("Timestamps may be disjoint\n");
+ goto cleanup;
+ }
+
+ size = IDirect3DQuery9_GetDataSize(qTimestampfreq);
+ ok(size == sizeof(freq), "IDirect3DQuery9_GetDataSize(qTimestampfreq) returned %i\n", size);
+ hr = IDirect3DQuery9_GetData(qTimestampfreq, &freq, size, 0);
+ ok(hr == S_OK, "IDirect3DQuery9_GetData(qTimestampfreq) failed\n");
+ ok(freq != 0, "Timestampfreq query returned 0\n");
+ if (hr != S_OK || freq == 0)
+ goto cleanup;
+
+ size = IDirect3DQuery9_GetDataSize(qTimestamp1);
+ ok(size == sizeof(ts1), "IDirect3DQuery9_GetDataSize(qTimestamp1) returned %i\n", size);
+ hr = IDirect3DQuery9_GetData(qTimestamp1, &ts1, size, 0);
+ ok(hr == S_OK, "IDirect3DQuery9_GetData(qTimestamp1) failed\n");
+
+ size = IDirect3DQuery9_GetDataSize(qTimestamp2);
+ ok(size == sizeof(ts2), "IDirect3DQuery9_GetDataSize(qTimestamp2) returned %i\n", size);
+ hr = IDirect3DQuery9_GetData(qTimestamp2, &ts2, size, 0);
+ ok(hr == S_OK, "IDirect3DQuery9_GetData(qTimestamp2) failed\n");
+
+#define NANOSECONDS 1000000000
+ ok(ts1 != ts2, "Timestamps are equal: 0x%08x%08x\n", (UINT)(ts1 >> 32), (UINT)(ts1 & 0xFFFFFFFF));
+ elapsed = ((double)(ts2 - ts1) / freq) * NANOSECONDS;
+ qp_elapsed1 = ((double)(qp_ts4.QuadPart - qp_ts1.QuadPart) / qp_freq.QuadPart) * NANOSECONDS;
+ qp_elapsed2 = ((double)(qp_ts3.QuadPart - qp_ts2.QuadPart) / qp_freq.QuadPart) * NANOSECONDS;
+
+ /* sanity check */
+ ok(qp_elapsed1 >= elapsed && elapsed >= qp_elapsed2, "timestamp sanity check fail: 0x%08x%08x >= 0x%08x%08x >= 0x%08x%08x\n",
+ (UINT)(qp_elapsed1 >> 32), (UINT)(qp_elapsed1 & 0xFFFFFFFF),
+ (UINT)(elapsed >> 32), (UINT)(elapsed & 0xFFFFFFFF),
+ (UINT)(qp_elapsed2 >> 32), (UINT)(qp_elapsed2 & 0xFFFFFFFF));
+
+cleanup:
+ if (qTimestamp1) IDirect3DQuery9_Release(qTimestamp1);
+ if (qTimestamp2) IDirect3DQuery9_Release(qTimestamp2);
+ if (qTimestampfreq) IDirect3DQuery9_Release(qTimestampfreq);
+ if (qTimestampdisjoint) IDirect3DQuery9_Release(qTimestampdisjoint);
+ if (pDevice)
+ {
+ UINT refcount = IDirect3DDevice9_Release(pDevice);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ }
+}
+
START_TEST(query)
{
HMODULE d3d9_handle = LoadLibraryA( "d3d9.dll" );
@@ -276,6 +438,7 @@ START_TEST(query)
test_query_support(pD3d, hwnd);
test_occlusion_query_states(pD3d, hwnd);
+ test_timestamp_queries(pD3d, hwnd);
out:
if(pD3d) IDirect3D9_Release(pD3d);
--
1.7.1
--------------060507020707010706000101
Content-Type: text/x-patch;
name="0006-wined3d-Add-support-for-D3DQUERY_TIMESTAMP-queries.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
filename*0="0006-wined3d-Add-support-for-D3DQUERY_TIMESTAMP-queries.patc";
filename*1="h"
More information about the wine-devel
mailing list