=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: dxgi/tests: Add private data tests.

Alexandre Julliard julliard at winehq.org
Tue Apr 8 14:02:51 CDT 2014


Module: wine
Branch: master
Commit: 7983d9974bcc451d1081136670bb8563bea74d8c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7983d9974bcc451d1081136670bb8563bea74d8c

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Mon Apr  7 22:27:31 2014 +0200

dxgi/tests: Add private data tests.

---

 dlls/dxgi/tests/device.c |  143 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 143 insertions(+)

diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c
index 84567a1..70cf3be 100644
--- a/dlls/dxgi/tests/device.c
+++ b/dlls/dxgi/tests/device.c
@@ -23,6 +23,12 @@
 
 static HRESULT (WINAPI *pCreateDXGIFactory1)(REFIID iid, void **factory);
 
+static ULONG get_refcount(IUnknown *iface)
+{
+    IUnknown_AddRef(iface);
+    return IUnknown_Release(iface);
+}
+
 static IDXGIDevice *create_device(void)
 {
     IDXGIDevice *dxgi_device;
@@ -578,6 +584,142 @@ static void test_create_factory(void)
     IUnknown_Release(iface);
 }
 
+static void test_private_data(void)
+{
+    ULONG refcount, expected_refcount;
+    IDXGIDevice *device;
+    HRESULT hr;
+    IDXGIDevice *test_object;
+    IUnknown *ptr;
+    static const DWORD data[] = {1, 2, 3, 4};
+    UINT size;
+    static const GUID dxgi_private_data_test_guid =
+    {
+        0xfdb37466,
+        0x428f,
+        0x4edf,
+        {0xa3, 0x7f, 0x9b, 0x1d, 0xf4, 0x88, 0xc5, 0xfc}
+    };
+    static const GUID dxgi_private_data_test_guid2 =
+    {
+        0x2e5afac2,
+        0x87b5,
+        0x4c10,
+        {0x9b, 0x4b, 0x89, 0xd7, 0xd1, 0x12, 0xe7, 0x2b}
+    };
+
+    if (!(device = create_device()))
+    {
+        skip("Failed to create device, skipping tests.\n");
+        return;
+    }
+
+    test_object = create_device();
+
+    /* SetPrivateData with a pointer of NULL has the purpose of FreePrivateData in previous
+     * d3d versions. A successful clear returns S_OK. A redundant clear S_FALSE. Setting a
+     * NULL interface is not considered a clear but as setting an interface pointer that
+     * happens to be NULL. */
+    hr = IDXGIDevice_SetPrivateData(device, &dxgi_private_data_test_guid, 0, NULL);
+    todo_wine ok(hr == S_FALSE, "Got unexpected hr %#x.\n", hr);
+    hr = IDXGIDevice_SetPrivateDataInterface(device, &dxgi_private_data_test_guid, NULL);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    hr = IDXGIDevice_SetPrivateData(device, &dxgi_private_data_test_guid, ~0U, NULL);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    hr = IDXGIDevice_SetPrivateData(device, &dxgi_private_data_test_guid, ~0U, NULL);
+    todo_wine ok(hr == S_FALSE, "Got unexpected hr %#x.\n", hr);
+
+    hr = IDXGIDevice_SetPrivateDataInterface(device, &dxgi_private_data_test_guid, NULL);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    size = sizeof(ptr) * 2;
+    ptr = (IUnknown *)0xdeadbeef;
+    hr = IDXGIDevice_GetPrivateData(device, &dxgi_private_data_test_guid, &size, &ptr);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    todo_wine ok(!ptr, "Got unexpected pointer %p.\n", ptr);
+    todo_wine ok(size == sizeof(IUnknown *), "Got unexpected size %u.\n", size);
+
+    refcount = get_refcount((IUnknown *)test_object);
+    hr = IDXGIDevice_SetPrivateDataInterface(device, &dxgi_private_data_test_guid,
+            (IUnknown *)test_object);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    expected_refcount = refcount + 1;
+    refcount = get_refcount((IUnknown *)test_object);
+    todo_wine ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount);
+    hr = IDXGIDevice_SetPrivateDataInterface(device, &dxgi_private_data_test_guid,
+            (IUnknown *)test_object);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    refcount = get_refcount((IUnknown *)test_object);
+    todo_wine ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount);
+
+    hr = IDXGIDevice_SetPrivateDataInterface(device, &dxgi_private_data_test_guid, NULL);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    expected_refcount--;
+    refcount = get_refcount((IUnknown *)test_object);
+    ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount);
+
+    hr = IDXGIDevice_SetPrivateDataInterface(device, &dxgi_private_data_test_guid,
+            (IUnknown *)test_object);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    size = sizeof(data);
+    hr = IDXGIDevice_SetPrivateData(device, &dxgi_private_data_test_guid, size, data);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    refcount = get_refcount((IUnknown *)test_object);
+    ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount);
+    hr = IDXGIDevice_SetPrivateData(device, &dxgi_private_data_test_guid, 42, NULL);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    hr = IDXGIDevice_SetPrivateData(device, &dxgi_private_data_test_guid, 42, NULL);
+    todo_wine ok(hr == S_FALSE, "Got unexpected hr %#x.\n", hr);
+
+    hr = IDXGIDevice_SetPrivateDataInterface(device, &dxgi_private_data_test_guid,
+            (IUnknown *)test_object);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    expected_refcount++;
+    size = 2 * sizeof(ptr);
+    ptr = NULL;
+    hr = IDXGIDevice_GetPrivateData(device, &dxgi_private_data_test_guid, &size, &ptr);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    todo_wine ok(size == sizeof(test_object), "Got unexpected size %u.\n", size);
+    expected_refcount++;
+    refcount = get_refcount((IUnknown *)test_object);
+    todo_wine ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount);
+    if (ptr)
+        IUnknown_Release(ptr);
+    expected_refcount--;
+
+    ptr = (IUnknown *)0xdeadbeef;
+    size = 1;
+    hr = IDXGIDevice_GetPrivateData(device, &dxgi_private_data_test_guid, &size, NULL);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    todo_wine ok(size == sizeof(device), "Got unexpected size %u.\n", size);
+    size = 2 * sizeof(ptr);
+    hr = IDXGIDevice_GetPrivateData(device, &dxgi_private_data_test_guid, &size, NULL);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    todo_wine ok(size == sizeof(device), "Got unexpected size %u.\n", size);
+    refcount = get_refcount((IUnknown *)test_object);
+    todo_wine ok(refcount == expected_refcount, "Got unexpected refcount %u, expected %u.\n", refcount, expected_refcount);
+
+    size = 1;
+    hr = IDXGIDevice_GetPrivateData(device, &dxgi_private_data_test_guid, &size, &ptr);
+    todo_wine ok(hr == DXGI_ERROR_MORE_DATA, "Got unexpected hr %#x.\n", hr);
+    todo_wine ok(size == sizeof(device), "Got unexpected size %u.\n", size);
+    ok(ptr == (IUnknown *)0xdeadbeef, "Got unexpected pointer %p.\n", ptr);
+    hr = IDXGIDevice_GetPrivateData(device, &dxgi_private_data_test_guid2, NULL, NULL);
+    todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+    size = 0xdeadbabe;
+    hr = IDXGIDevice_GetPrivateData(device, &dxgi_private_data_test_guid2, &size, &ptr);
+    todo_wine ok(hr == DXGI_ERROR_NOT_FOUND, "Got unexpected hr %#x.\n", hr);
+    todo_wine ok(size == 0, "Got unexpected size %u.\n", size);
+    ok(ptr == (IUnknown *)0xdeadbeef, "Got unexpected pointer %p.\n", ptr);
+    hr = IDXGIDevice_GetPrivateData(device, &dxgi_private_data_test_guid, NULL, &ptr);
+    todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+    ok(ptr == (IUnknown *)0xdeadbeef, "Got unexpected pointer %p.\n", ptr);
+
+    refcount = IDXGIDevice_Release(device);
+    ok(!refcount, "Device has %u references left.\n", refcount);
+    refcount = IDXGIDevice_Release(test_object);
+    ok(!refcount, "Test object has %u references left.\n", refcount);
+}
+
 START_TEST(device)
 {
     pCreateDXGIFactory1 = (void *)GetProcAddress(GetModuleHandleA("dxgi.dll"), "CreateDXGIFactory1");
@@ -589,4 +731,5 @@ START_TEST(device)
     test_output();
     test_createswapchain();
     test_create_factory();
+    test_private_data();
 }




More information about the wine-cvs mailing list