[PATCH 06/12] 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


--------------020407030507000107030307
Content-Type: text/x-patch;
 name="0007-wined3d-context-Add-context-framework-for-D3DQUERY_T.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename*0="0007-wined3d-context-Add-context-framework-for-D3DQUERY_T.pa";
 filename*1="tch"



More information about the wine-devel mailing list