From 7983d9974bcc451d1081136670bb8563bea74d8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Mon, 7 Apr 2014 22:27:31 +0200 Subject: [PATCH] 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 84567a15519..70cf3be3c49 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(); }