[PATCH 1/1] d3d9/tests: Use create_device() in more tests.

Henri Verbeet hverbeet at codeweavers.com
Thu Mar 6 05:59:46 CST 2014


v2: Handle a NULL device in the test_null_stream() cleanup path.

This supersedes patch 103009. Testbot job 5435.
---
 dlls/d3d9/tests/device.c |  989 +++++++++++++++++++---------------------------
 1 file changed, 406 insertions(+), 583 deletions(-)

diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c
index 74c83ed..08a5be4 100644
--- a/dlls/d3d9/tests/device.c
+++ b/dlls/d3d9/tests/device.c
@@ -182,148 +182,113 @@ static void check_mipmap_levels(IDirect3DDevice9 *device, UINT width, UINT heigh
 
 static void test_mipmap_levels(void)
 {
-
-    HRESULT               hr;
-    IDirect3DDevice9      *pDevice = NULL;
-    D3DPRESENT_PARAMETERS d3dpp;
-    D3DDISPLAYMODE        d3ddm;
+    IDirect3DDevice9 *device;
     IDirect3D9 *d3d;
-    HWND hwnd;
+    ULONG refcount;
+    HWND window;
 
-    hwnd = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
-            100, 100, 160, 160, NULL, NULL, NULL, NULL);
-    ok(!!hwnd, "Failed to create a window.\n");
+    window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, NULL, NULL, NULL, NULL);
+    ok(!!window, "Failed to create a window.\n");
     d3d = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d, "Failed to create a D3D object.\n");
-
-    IDirect3D9_GetAdapterDisplayMode(d3d, D3DADAPTER_DEFAULT, &d3ddm);
-    ZeroMemory( &d3dpp, sizeof(d3dpp) );
-    d3dpp.Windowed         = TRUE;
-    d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
-    d3dpp.BackBufferFormat = d3ddm.Format;
-
-    hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_NULLREF,
-            hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice);
-    ok(SUCCEEDED(hr) || hr == D3DERR_NOTAVAILABLE || broken(hr == D3DERR_INVALIDCALL), "Failed to create IDirect3D9Device (%08x)\n", hr);
-    if (FAILED(hr)) {
-        skip("failed to create a d3d device\n");
+    if (!(device = create_device(d3d, window, window, TRUE)))
+    {
+        skip("Failed to create a 3D device, skipping test.\n");
         goto cleanup;
     }
 
-    check_mipmap_levels(pDevice, 32, 32, 6);
-    check_mipmap_levels(pDevice, 256, 1, 9);
-    check_mipmap_levels(pDevice, 1, 256, 9);
-    check_mipmap_levels(pDevice, 1, 1, 1);
+    check_mipmap_levels(device, 32, 32, 6);
+    check_mipmap_levels(device, 256, 1, 9);
+    check_mipmap_levels(device, 1, 256, 9);
+    check_mipmap_levels(device, 1, 1, 1);
 
+    refcount = IDirect3DDevice9_Release(device);
+    ok(!refcount, "Device has %u references left.\n", refcount);
 cleanup:
-    if (pDevice)
-    {
-        UINT refcount = IDirect3DDevice9_Release( pDevice );
-        ok(!refcount, "Device has %u references left.\n", refcount);
-    }
     IDirect3D9_Release(d3d);
-    DestroyWindow( hwnd );
+    DestroyWindow(window);
 }
 
 static void test_checkdevicemultisampletype(void)
 {
-
-    HRESULT               hr;
-    IDirect3DDevice9      *pDevice = NULL;
-    D3DPRESENT_PARAMETERS d3dpp;
-    D3DDISPLAYMODE        d3ddm;
-    DWORD                 qualityLevels;
+    IDirect3DDevice9 *device;
+    DWORD quality_levels;
     IDirect3D9 *d3d;
-    HWND hwnd;
+    ULONG refcount;
+    HWND window;
+    HRESULT hr;
 
-    hwnd = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
-            100, 100, 160, 160, NULL, NULL, NULL, NULL);
-    ok(!!hwnd, "Failed to create a window.\n");
+    window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, NULL, NULL, NULL, NULL);
+    ok(!!window, "Failed to create a window.\n");
     d3d = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d, "Failed to create a D3D object.\n");
-
-    IDirect3D9_GetAdapterDisplayMode(d3d, D3DADAPTER_DEFAULT, &d3ddm);
-    ZeroMemory( &d3dpp, sizeof(d3dpp) );
-    d3dpp.Windowed         = TRUE;
-    d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
-    d3dpp.BackBufferFormat = d3ddm.Format;
-
-    hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_NULLREF,
-            hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice);
-    ok(SUCCEEDED(hr) || hr == D3DERR_NOTAVAILABLE || broken(hr == D3DERR_INVALIDCALL), "Failed to create IDirect3D9Device (%08x)\n", hr);
-    if (FAILED(hr)) {
-        skip("failed to create a d3d device\n");
+    if (!(device = create_device(d3d, window, window, TRUE)))
+    {
+        skip("Failed to create a 3D device, skipping test.\n");
         goto cleanup;
     }
 
-    qualityLevels = 0;
-
+    quality_levels = 0;
     hr = IDirect3D9_CheckDeviceMultiSampleType(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
-            D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_NONE, &qualityLevels);
+            D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_NONE, &quality_levels);
     ok(SUCCEEDED(hr) || hr == D3DERR_NOTAVAILABLE, "CheckDeviceMultiSampleType failed with (%08x)\n", hr);
-    if(hr == D3DERR_NOTAVAILABLE)
+    if (hr == D3DERR_NOTAVAILABLE)
     {
         skip("IDirect3D9_CheckDeviceMultiSampleType not available\n");
         goto cleanup;
     }
-    ok(qualityLevels == 1,"qualitylevel is not 1 but %d\n",qualityLevels);
+    ok(quality_levels == 1, "Got unexpected quality_levels %u.\n", quality_levels);
 
     hr = IDirect3D9_CheckDeviceMultiSampleType(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
-            D3DFMT_X8R8G8B8, FALSE, D3DMULTISAMPLE_NONE, &qualityLevels);
+            D3DFMT_X8R8G8B8, FALSE, D3DMULTISAMPLE_NONE, &quality_levels);
     ok(SUCCEEDED(hr), "CheckDeviceMultiSampleType failed with (%08x)\n", hr);
-    ok(qualityLevels == 1,"qualitylevel is not 1 but %d\n",qualityLevels);
+    ok(quality_levels == 1, "Got unexpected quality_levels %u.\n", quality_levels);
 
 cleanup:
-    if (pDevice)
+    if (device)
     {
-        UINT refcount = IDirect3DDevice9_Release( pDevice );
+        refcount = IDirect3DDevice9_Release(device);
         ok(!refcount, "Device has %u references left.\n", refcount);
     }
     IDirect3D9_Release(d3d);
-    DestroyWindow(hwnd);
+    DestroyWindow(window);
 }
 
 static void test_swapchain(void)
 {
-    HRESULT                      hr;
-    IDirect3DDevice9            *pDevice            = NULL;
-    IDirect3DSwapChain9         *swapchain0         = NULL;
-    IDirect3DSwapChain9         *swapchain1         = NULL;
-    IDirect3DSwapChain9         *swapchain2         = NULL;
-    IDirect3DSwapChain9         *swapchain3         = NULL;
-    IDirect3DSwapChain9         *swapchainX         = NULL;
-    IDirect3DSurface9           *backbuffer         = NULL;
-    D3DPRESENT_PARAMETERS        d3dpp;
-    D3DDISPLAYMODE               d3ddm;
+    IDirect3DSwapChain9 *swapchain0;
+    IDirect3DSwapChain9 *swapchain1;
+    IDirect3DSwapChain9 *swapchain2;
+    IDirect3DSwapChain9 *swapchain3;
+    IDirect3DSwapChain9 *swapchainX;
+    IDirect3DSurface9 *backbuffer;
+    D3DPRESENT_PARAMETERS d3dpp;
+    IDirect3DDevice9 *device;
     IDirect3D9 *d3d;
-    HWND hwnd;
+    ULONG refcount;
+    HWND window;
+    HRESULT hr;
 
-    hwnd = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
-            100, 100, 160, 160, NULL, NULL, NULL, NULL);
-    ok(!!hwnd, "Failed to create a window.\n");
+    window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, NULL, NULL, NULL, NULL);
+    ok(!!window, "Failed to create a window.\n");
     d3d = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d, "Failed to create a D3D object.\n");
-
-    IDirect3D9_GetAdapterDisplayMode(d3d, D3DADAPTER_DEFAULT, &d3ddm);
-    ZeroMemory( &d3dpp, sizeof(d3dpp) );
-    d3dpp.Windowed         = TRUE;
-    d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
-    d3dpp.BackBufferFormat = d3ddm.Format;
-    d3dpp.BackBufferCount  = 0;
-
-    hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
-            hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice);
-    ok(hr == S_OK || hr == D3DERR_NOTAVAILABLE || broken(hr == D3DERR_INVALIDCALL),
-       "Failed to create IDirect3D9Device (%08x)\n", hr);
-    if (FAILED(hr)) goto cleanup;
-
-    /* Check if the back buffer count was modified */
-    ok(d3dpp.BackBufferCount == 1, "The back buffer count in the presentparams struct is %d\n", d3dpp.BackBufferCount);
+    if (!(device = create_device(d3d, window, window, TRUE)))
+    {
+        skip("Failed to create a 3D device, skipping test.\n");
+        goto cleanup;
+    }
 
     /* Get the implicit swapchain */
-    hr = IDirect3DDevice9_GetSwapChain(pDevice, 0, &swapchain0);
+    hr = IDirect3DDevice9_GetSwapChain(device, 0, &swapchain0);
     ok(SUCCEEDED(hr), "Failed to get the implicit swapchain (%08x)\n", hr);
-    if(swapchain0) IDirect3DSwapChain9_Release(swapchain0);
+    /* Check if the back buffer count was modified */
+    hr = IDirect3DSwapChain9_GetPresentParameters(swapchain0, &d3dpp);
+    ok(d3dpp.BackBufferCount == 1, "Got unexpected back buffer count %u.\n", d3dpp.BackBufferCount);
+    IDirect3DSwapChain9_Release(swapchain0);
 
     /* Check if there is a back buffer */
     hr = IDirect3DSwapChain9_GetBackBuffer(swapchain0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);
@@ -332,23 +297,23 @@ static void test_swapchain(void)
     if(backbuffer) IDirect3DSurface9_Release(backbuffer);
 
     /* Try to get a nonexistent swapchain */
-    hr = IDirect3DDevice9_GetSwapChain(pDevice, 1, &swapchainX);
+    hr = IDirect3DDevice9_GetSwapChain(device, 1, &swapchainX);
     ok(hr == D3DERR_INVALIDCALL, "GetSwapChain on an nonexistent swapchain returned (%08x)\n", hr);
     ok(swapchainX == NULL, "Swapchain 1 is %p\n", swapchainX);
     if(swapchainX) IDirect3DSwapChain9_Release(swapchainX);
 
     /* Create a bunch of swapchains */
     d3dpp.BackBufferCount = 0;
-    hr = IDirect3DDevice9_CreateAdditionalSwapChain(pDevice, &d3dpp, &swapchain1);
+    hr = IDirect3DDevice9_CreateAdditionalSwapChain(device, &d3dpp, &swapchain1);
     ok(SUCCEEDED(hr), "Failed to create a swapchain (%08x)\n", hr);
     ok(d3dpp.BackBufferCount == 1, "The back buffer count in the presentparams struct is %d\n", d3dpp.BackBufferCount);
 
     d3dpp.BackBufferCount  = 1;
-    hr = IDirect3DDevice9_CreateAdditionalSwapChain(pDevice, &d3dpp, &swapchain2);
+    hr = IDirect3DDevice9_CreateAdditionalSwapChain(device, &d3dpp, &swapchain2);
     ok(SUCCEEDED(hr), "Failed to create a swapchain (%08x)\n", hr);
 
     d3dpp.BackBufferCount  = 2;
-    hr = IDirect3DDevice9_CreateAdditionalSwapChain(pDevice, &d3dpp, &swapchain3);
+    hr = IDirect3DDevice9_CreateAdditionalSwapChain(device, &d3dpp, &swapchain3);
     ok(SUCCEEDED(hr), "Failed to create a swapchain (%08x)\n", hr);
     if(SUCCEEDED(hr)) {
         /* Swapchain 3, created with backbuffercount 2 */
@@ -413,28 +378,23 @@ static void test_swapchain(void)
      * it should fail, apparently GetSwapChain only returns implicit swapchains
      */
     swapchainX = (void *) 0xdeadbeef;
-    hr = IDirect3DDevice9_GetSwapChain(pDevice, 1, &swapchainX);
+    hr = IDirect3DDevice9_GetSwapChain(device, 1, &swapchainX);
     ok(hr == D3DERR_INVALIDCALL, "Failed to get the second swapchain (%08x)\n", hr);
     ok(swapchainX == NULL, "The swapchain pointer is %p\n", swapchainX);
     if(swapchainX && swapchainX != (void *) 0xdeadbeef ) IDirect3DSwapChain9_Release(swapchainX);
 
+    IDirect3DSwapChain9_Release(swapchain3);
+    IDirect3DSwapChain9_Release(swapchain2);
+    IDirect3DSwapChain9_Release(swapchain1);
+    refcount = IDirect3DDevice9_Release(device);
+    ok(!refcount, "Device has %u references left.\n", refcount);
 cleanup:
-    if(swapchain1) IDirect3DSwapChain9_Release(swapchain1);
-    if(swapchain2) IDirect3DSwapChain9_Release(swapchain2);
-    if(swapchain3) IDirect3DSwapChain9_Release(swapchain3);
-    if (pDevice)
-    {
-        UINT refcount = IDirect3DDevice9_Release(pDevice);
-        ok(!refcount, "Device has %u references left.\n", refcount);
-    }
     IDirect3D9_Release(d3d);
-    DestroyWindow(hwnd);
+    DestroyWindow(window);
 }
 
 static void test_refcount(void)
 {
-    HRESULT                      hr;
-    IDirect3DDevice9            *pDevice            = NULL;
     IDirect3DVertexBuffer9      *pVertexBuffer      = NULL;
     IDirect3DIndexBuffer9       *pIndexBuffer       = NULL;
     IDirect3DVertexDeclaration9 *pVertexDeclaration = NULL;
@@ -456,45 +416,38 @@ static void test_refcount(void)
     IDirect3DSwapChain9         *pSwapChain         = NULL;
     IDirect3DQuery9             *pQuery             = NULL;
     D3DPRESENT_PARAMETERS        d3dpp;
-    D3DDISPLAYMODE               d3ddm;
-    int                          refcount = 0, tmp;
+    IDirect3DDevice9 *device;
+    ULONG refcount = 0, tmp;
     IDirect3D9 *d3d, *d3d2;
-    HWND hwnd;
+    HWND window;
+    HRESULT hr;
 
     D3DVERTEXELEMENT9 decl[] =
     {
         D3DDECL_END()
     };
 
-    hwnd = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
-            100, 100, 160, 160, NULL, NULL, NULL, NULL);
-    ok(!!hwnd, "Failed to create a window.\n");
+    window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, NULL, NULL, NULL, NULL);
+    ok(!!window, "Failed to create a window.\n");
     d3d = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d, "Failed to create a D3D object.\n");
 
     CHECK_REFCOUNT(d3d, 1);
 
-    IDirect3D9_GetAdapterDisplayMode(d3d, D3DADAPTER_DEFAULT, &d3ddm);
-    ZeroMemory( &d3dpp, sizeof(d3dpp) );
-    d3dpp.Windowed         = TRUE;
-    d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
-    d3dpp.BackBufferFormat = d3ddm.Format;
-    d3dpp.EnableAutoDepthStencil = TRUE;
-    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
-
-    hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
-            hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice);
-    ok(hr == S_OK || hr == D3DERR_NOTAVAILABLE || broken(hr == D3DERR_INVALIDCALL),
-       "Failed to create IDirect3D9Device (%08x)\n", hr);
-    if (FAILED(hr)) goto cleanup;
+    if (!(device = create_device(d3d, window, window, TRUE)))
+    {
+        skip("Failed to create a 3D device, skipping test.\n");
+        goto cleanup;
+    }
 
-    refcount = get_refcount( (IUnknown *)pDevice );
+    refcount = get_refcount((IUnknown *)device);
     ok(refcount == 1, "Invalid device RefCount %d\n", refcount);
 
     CHECK_REFCOUNT(d3d, 2);
 
-    hr = IDirect3DDevice9_GetDirect3D(pDevice, &d3d2);
-    CHECK_CALL( hr, "GetDirect3D", pDevice, refcount );
+    hr = IDirect3DDevice9_GetDirect3D(device, &d3d2);
+    CHECK_CALL(hr, "GetDirect3D", device, refcount);
 
     ok(d3d2 == d3d, "Expected IDirect3D9 pointers to be equal.\n");
     CHECK_REFCOUNT(d3d, 3);
@@ -508,14 +461,14 @@ static void test_refcount(void)
      *   - they are not freed if refcount reaches 0.
      *   - the refcount is not forwarded to the container.
      */
-    hr = IDirect3DDevice9_GetSwapChain(pDevice, 0, &pSwapChain);
-    CHECK_CALL( hr, "GetSwapChain", pDevice, ++refcount);
+    hr = IDirect3DDevice9_GetSwapChain(device, 0, &pSwapChain);
+    CHECK_CALL(hr, "GetSwapChain", device, ++refcount);
     if (pSwapChain)
     {
         CHECK_REFCOUNT( pSwapChain, 1);
 
-        hr = IDirect3DDevice9_GetRenderTarget(pDevice, 0, &pRenderTarget);
-        CHECK_CALL( hr, "GetRenderTarget", pDevice, ++refcount);
+        hr = IDirect3DDevice9_GetRenderTarget(device, 0, &pRenderTarget);
+        CHECK_CALL(hr, "GetRenderTarget", device, ++refcount);
         CHECK_REFCOUNT( pSwapChain, 1);
         if(pRenderTarget)
         {
@@ -523,27 +476,27 @@ static void test_refcount(void)
             CHECK_REFCOUNT( pRenderTarget, 1);
 
             CHECK_ADDREF_REFCOUNT(pRenderTarget, 2);
-            CHECK_REFCOUNT(pDevice, refcount);
+            CHECK_REFCOUNT(device, refcount);
             CHECK_RELEASE_REFCOUNT(pRenderTarget, 1);
-            CHECK_REFCOUNT(pDevice, refcount);
+            CHECK_REFCOUNT(device, refcount);
 
-            hr = IDirect3DDevice9_GetRenderTarget(pDevice, 0, &pRenderTarget);
-            CHECK_CALL( hr, "GetRenderTarget", pDevice, refcount);
+            hr = IDirect3DDevice9_GetRenderTarget(device, 0, &pRenderTarget);
+            CHECK_CALL(hr, "GetRenderTarget", device, refcount);
             CHECK_REFCOUNT( pRenderTarget, 2);
             CHECK_RELEASE_REFCOUNT( pRenderTarget, 1);
             CHECK_RELEASE_REFCOUNT( pRenderTarget, 0);
-            CHECK_REFCOUNT( pDevice, --refcount);
+            CHECK_REFCOUNT(device, --refcount);
 
             /* The render target is released with the device, so AddRef with refcount=0 is fine here. */
             CHECK_ADDREF_REFCOUNT(pRenderTarget, 1);
-            CHECK_REFCOUNT(pDevice, ++refcount);
+            CHECK_REFCOUNT(device, ++refcount);
             CHECK_RELEASE_REFCOUNT(pRenderTarget, 0);
-            CHECK_REFCOUNT(pDevice, --refcount);
+            CHECK_REFCOUNT(device, --refcount);
         }
 
         /* Render target and back buffer are identical. */
-        hr = IDirect3DDevice9_GetBackBuffer(pDevice, 0, 0, 0, &pBackBuffer);
-        CHECK_CALL( hr, "GetBackBuffer", pDevice, ++refcount);
+        hr = IDirect3DDevice9_GetBackBuffer(device, 0, 0, 0, &pBackBuffer);
+        CHECK_CALL(hr, "GetBackBuffer", device, ++refcount);
         if(pBackBuffer)
         {
             CHECK_RELEASE_REFCOUNT(pBackBuffer, 0);
@@ -551,58 +504,58 @@ static void test_refcount(void)
             pRenderTarget, pBackBuffer);
             pBackBuffer = NULL;
         }
-        CHECK_REFCOUNT( pDevice, --refcount);
+        CHECK_REFCOUNT(device, --refcount);
 
-        hr = IDirect3DDevice9_GetDepthStencilSurface(pDevice, &pStencilSurface);
-        CHECK_CALL( hr, "GetDepthStencilSurface", pDevice, ++refcount);
+        hr = IDirect3DDevice9_GetDepthStencilSurface(device, &pStencilSurface);
+        CHECK_CALL(hr, "GetDepthStencilSurface", device, ++refcount);
         CHECK_REFCOUNT( pSwapChain, 1);
         if(pStencilSurface)
         {
-            CHECK_SURFACE_CONTAINER( pStencilSurface, IID_IDirect3DDevice9, pDevice);
+            CHECK_SURFACE_CONTAINER(pStencilSurface, IID_IDirect3DDevice9, device);
             CHECK_REFCOUNT( pStencilSurface, 1);
 
             CHECK_ADDREF_REFCOUNT(pStencilSurface, 2);
-            CHECK_REFCOUNT(pDevice, refcount);
+            CHECK_REFCOUNT(device, refcount);
             CHECK_RELEASE_REFCOUNT(pStencilSurface, 1);
-            CHECK_REFCOUNT(pDevice, refcount);
+            CHECK_REFCOUNT(device, refcount);
 
             CHECK_RELEASE_REFCOUNT( pStencilSurface, 0);
-            CHECK_REFCOUNT( pDevice, --refcount);
+            CHECK_REFCOUNT(device, --refcount);
 
             /* The stencil surface is released with the device, so AddRef with refcount=0 is fine here. */
             CHECK_ADDREF_REFCOUNT(pStencilSurface, 1);
-            CHECK_REFCOUNT(pDevice, ++refcount);
+            CHECK_REFCOUNT(device, ++refcount);
             CHECK_RELEASE_REFCOUNT(pStencilSurface, 0);
-            CHECK_REFCOUNT(pDevice, --refcount);
+            CHECK_REFCOUNT(device, --refcount);
             pStencilSurface = NULL;
         }
 
         CHECK_RELEASE_REFCOUNT( pSwapChain, 0);
-        CHECK_REFCOUNT( pDevice, --refcount);
+        CHECK_REFCOUNT(device, --refcount);
 
         /* The implicit swapchwin is released with the device, so AddRef with refcount=0 is fine here. */
         CHECK_ADDREF_REFCOUNT(pSwapChain, 1);
-        CHECK_REFCOUNT(pDevice, ++refcount);
+        CHECK_REFCOUNT(device, ++refcount);
         CHECK_RELEASE_REFCOUNT(pSwapChain, 0);
-        CHECK_REFCOUNT(pDevice, --refcount);
+        CHECK_REFCOUNT(device, --refcount);
         pSwapChain = NULL;
     }
 
     /* Buffers */
-    hr = IDirect3DDevice9_CreateIndexBuffer( pDevice, 16, 0, D3DFMT_INDEX32, D3DPOOL_DEFAULT, &pIndexBuffer, NULL );
-    CHECK_CALL( hr, "CreateIndexBuffer", pDevice, ++refcount );
+    hr = IDirect3DDevice9_CreateIndexBuffer(device, 16, 0, D3DFMT_INDEX32, D3DPOOL_DEFAULT, &pIndexBuffer, NULL);
+    CHECK_CALL(hr, "CreateIndexBuffer", device, ++refcount );
     if(pIndexBuffer)
     {
         tmp = get_refcount( (IUnknown *)pIndexBuffer );
 
-        hr = IDirect3DDevice9_SetIndices(pDevice, pIndexBuffer);
+        hr = IDirect3DDevice9_SetIndices(device, pIndexBuffer);
         CHECK_CALL( hr, "SetIndices", pIndexBuffer, tmp);
-        hr = IDirect3DDevice9_SetIndices(pDevice, NULL);
+        hr = IDirect3DDevice9_SetIndices(device, NULL);
         CHECK_CALL( hr, "SetIndices", pIndexBuffer, tmp);
     }
 
-    hr = IDirect3DDevice9_CreateVertexBuffer( pDevice, 16, 0, D3DFVF_XYZ, D3DPOOL_DEFAULT, &pVertexBuffer, NULL );
-    CHECK_CALL( hr, "CreateVertexBuffer", pDevice, ++refcount );
+    hr = IDirect3DDevice9_CreateVertexBuffer(device, 16, 0, D3DFVF_XYZ, D3DPOOL_DEFAULT, &pVertexBuffer, NULL);
+    CHECK_CALL(hr, "CreateVertexBuffer", device, ++refcount);
     if(pVertexBuffer)
     {
         IDirect3DVertexBuffer9 *pVBuf = (void*)~0;
@@ -611,40 +564,40 @@ static void test_refcount(void)
 
         tmp = get_refcount( (IUnknown *)pVertexBuffer );
 
-        hr = IDirect3DDevice9_SetStreamSource(pDevice, 0, pVertexBuffer, 0, 3 * sizeof(float));
+        hr = IDirect3DDevice9_SetStreamSource(device, 0, pVertexBuffer, 0, 3 * sizeof(float));
         CHECK_CALL( hr, "SetStreamSource", pVertexBuffer, tmp);
-        hr = IDirect3DDevice9_SetStreamSource(pDevice, 0, NULL, 0, 0);
+        hr = IDirect3DDevice9_SetStreamSource(device, 0, NULL, 0, 0);
         CHECK_CALL( hr, "SetStreamSource", pVertexBuffer, tmp);
 
-        hr = IDirect3DDevice9_GetStreamSource(pDevice, 0, &pVBuf, &offset, &stride);
+        hr = IDirect3DDevice9_GetStreamSource(device, 0, &pVBuf, &offset, &stride);
         ok(SUCCEEDED(hr), "GetStreamSource did not succeed with NULL stream!\n");
         ok(pVBuf==NULL, "pVBuf not NULL (%p)!\n", pVBuf);
         ok(stride==3*sizeof(float), "stride not 3 floats (got %u)!\n", stride);
         ok(offset==0, "offset not 0 (got %u)!\n", offset);
     }
     /* Shaders */
-    hr = IDirect3DDevice9_CreateVertexDeclaration( pDevice, decl, &pVertexDeclaration );
-    CHECK_CALL( hr, "CreateVertexDeclaration", pDevice, ++refcount );
-    hr = IDirect3DDevice9_CreateVertexShader( pDevice, simple_vs, &pVertexShader );
-    CHECK_CALL( hr, "CreateVertexShader", pDevice, ++refcount );
-    hr = IDirect3DDevice9_CreatePixelShader( pDevice, simple_ps, &pPixelShader );
-    CHECK_CALL( hr, "CreatePixelShader", pDevice, ++refcount );
+    hr = IDirect3DDevice9_CreateVertexDeclaration(device, decl, &pVertexDeclaration);
+    CHECK_CALL(hr, "CreateVertexDeclaration", device, ++refcount);
+    hr = IDirect3DDevice9_CreateVertexShader(device, simple_vs, &pVertexShader);
+    CHECK_CALL(hr, "CreateVertexShader", device, ++refcount);
+    hr = IDirect3DDevice9_CreatePixelShader(device, simple_ps, &pPixelShader);
+    CHECK_CALL(hr, "CreatePixelShader", device, ++refcount);
     /* Textures */
-    hr = IDirect3DDevice9_CreateTexture( pDevice, 32, 32, 3, 0, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pTexture, NULL );
-    CHECK_CALL( hr, "CreateTexture", pDevice, ++refcount );
+    hr = IDirect3DDevice9_CreateTexture(device, 32, 32, 3, 0, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pTexture, NULL);
+    CHECK_CALL(hr, "CreateTexture", device, ++refcount);
     if (pTexture)
     {
         tmp = get_refcount( (IUnknown *)pTexture );
 
         /* SetTexture should not increase refcounts */
-        hr = IDirect3DDevice9_SetTexture(pDevice, 0, (IDirect3DBaseTexture9 *) pTexture);
-        CHECK_CALL( hr, "SetTexture", pTexture, tmp);
-        hr = IDirect3DDevice9_SetTexture(pDevice, 0, NULL);
-        CHECK_CALL( hr, "SetTexture", pTexture, tmp);
+        hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *)pTexture);
+        CHECK_CALL(hr, "SetTexture", pTexture, tmp);
+        hr = IDirect3DDevice9_SetTexture(device, 0, NULL);
+        CHECK_CALL(hr, "SetTexture", pTexture, tmp);
 
         /* This should not increment device refcount */
         hr = IDirect3DTexture9_GetSurfaceLevel( pTexture, 1, &pTextureLevel );
-        CHECK_CALL( hr, "GetSurfaceLevel", pDevice, refcount );
+        CHECK_CALL(hr, "GetSurfaceLevel", device, refcount);
         /* But should increment texture's refcount */
         CHECK_REFCOUNT( pTexture, tmp+1 );
         /* Because the texture and surface refcount are identical */
@@ -659,17 +612,18 @@ static void test_refcount(void)
             CHECK_REFCOUNT        ( pTextureLevel, tmp   );
         }
     }
-    hr = IDirect3DDevice9_CreateCubeTexture( pDevice, 32, 0, 0, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pCubeTexture, NULL );
-    CHECK_CALL( hr, "CreateCubeTexture", pDevice, ++refcount );
-    hr = IDirect3DDevice9_CreateVolumeTexture( pDevice, 32, 32, 2, 0, 0, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pVolumeTexture, NULL );
-    CHECK_CALL( hr, "CreateVolumeTexture", pDevice, ++refcount );
+    hr = IDirect3DDevice9_CreateCubeTexture(device, 32, 0, 0, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pCubeTexture, NULL);
+    CHECK_CALL(hr, "CreateCubeTexture", device, ++refcount);
+    hr = IDirect3DDevice9_CreateVolumeTexture(device, 32, 32, 2, 0, 0,
+            D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pVolumeTexture, NULL);
+    CHECK_CALL(hr, "CreateVolumeTexture", device, ++refcount);
     if (pVolumeTexture)
     {
         tmp = get_refcount( (IUnknown *)pVolumeTexture );
 
         /* This should not increment device refcount */
         hr = IDirect3DVolumeTexture9_GetVolumeLevel(pVolumeTexture, 0, &pVolumeLevel);
-        CHECK_CALL( hr, "GetVolumeLevel", pDevice, refcount );
+        CHECK_CALL(hr, "GetVolumeLevel", device, refcount);
         /* But should increment volume texture's refcount */
         CHECK_REFCOUNT( pVolumeTexture, tmp+1 );
         /* Because the volume texture and volume refcount are identical */
@@ -685,143 +639,146 @@ static void test_refcount(void)
         }
     }
     /* Surfaces */
-    hr = IDirect3DDevice9_CreateDepthStencilSurface( pDevice, 32, 32, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0, TRUE, &pStencilSurface, NULL );
-    CHECK_CALL( hr, "CreateDepthStencilSurface", pDevice, ++refcount );
+    hr = IDirect3DDevice9_CreateDepthStencilSurface(device, 32, 32,
+            D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0, TRUE, &pStencilSurface, NULL);
+    CHECK_CALL(hr, "CreateDepthStencilSurface", device, ++refcount);
     CHECK_REFCOUNT( pStencilSurface, 1 );
-    hr = IDirect3DDevice9_CreateOffscreenPlainSurface( pDevice, 32, 32, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pOffscreenSurface, NULL );
-    CHECK_CALL( hr, "CreateOffscreenPlainSurface", pDevice, ++refcount );
+    hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 32, 32,
+            D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &pOffscreenSurface, NULL);
+    CHECK_CALL(hr, "CreateOffscreenPlainSurface", device, ++refcount);
     CHECK_REFCOUNT( pOffscreenSurface, 1 );
-    hr = IDirect3DDevice9_CreateRenderTarget( pDevice, 32, 32, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &pRenderTarget3, NULL );
-    CHECK_CALL( hr, "CreateRenderTarget", pDevice, ++refcount );
+    hr = IDirect3DDevice9_CreateRenderTarget(device, 32, 32,
+            D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &pRenderTarget3, NULL);
+    CHECK_CALL(hr, "CreateRenderTarget", device, ++refcount);
     CHECK_REFCOUNT( pRenderTarget3, 1 );
     /* Misc */
-    hr = IDirect3DDevice9_CreateStateBlock( pDevice, D3DSBT_ALL, &pStateBlock );
-    CHECK_CALL( hr, "CreateStateBlock", pDevice, ++refcount );
-    hr = IDirect3DDevice9_CreateAdditionalSwapChain( pDevice, &d3dpp, &pSwapChain );
-    CHECK_CALL( hr, "CreateAdditionalSwapChain", pDevice, ++refcount );
+    hr = IDirect3DDevice9_CreateStateBlock(device, D3DSBT_ALL, &pStateBlock);
+    CHECK_CALL(hr, "CreateStateBlock", device, ++refcount);
+
+    memset(&d3dpp, 0, sizeof(d3dpp));
+    d3dpp.Windowed = TRUE;
+    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
+    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
+    d3dpp.EnableAutoDepthStencil = TRUE;
+    d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
+    hr = IDirect3DDevice9_CreateAdditionalSwapChain(device, &d3dpp, &pSwapChain);
+    CHECK_CALL(hr, "CreateAdditionalSwapChain", device, ++refcount);
     if(pSwapChain)
     {
         /* check implicit back buffer */
         hr = IDirect3DSwapChain9_GetBackBuffer(pSwapChain, 0, 0, &pBackBuffer);
-        CHECK_CALL( hr, "GetBackBuffer", pDevice, ++refcount);
+        CHECK_CALL(hr, "GetBackBuffer", device, ++refcount);
         CHECK_REFCOUNT( pSwapChain, 1);
         if(pBackBuffer)
         {
             CHECK_SURFACE_CONTAINER( pBackBuffer, IID_IDirect3DSwapChain9, pSwapChain);
             CHECK_REFCOUNT( pBackBuffer, 1);
             CHECK_RELEASE_REFCOUNT( pBackBuffer, 0);
-            CHECK_REFCOUNT( pDevice, --refcount);
+            CHECK_REFCOUNT(device, --refcount);
 
             /* The back buffer is released with the swapchain, so AddRef with refcount=0 is fine here. */
             CHECK_ADDREF_REFCOUNT(pBackBuffer, 1);
-            CHECK_REFCOUNT(pDevice, ++refcount);
+            CHECK_REFCOUNT(device, ++refcount);
             CHECK_RELEASE_REFCOUNT(pBackBuffer, 0);
-            CHECK_REFCOUNT(pDevice, --refcount);
+            CHECK_REFCOUNT(device, --refcount);
             pBackBuffer = NULL;
         }
         CHECK_REFCOUNT( pSwapChain, 1);
     }
-    hr = IDirect3DDevice9_CreateQuery( pDevice, D3DQUERYTYPE_EVENT, &pQuery );
-    CHECK_CALL( hr, "CreateQuery", pDevice, ++refcount );
+    hr = IDirect3DDevice9_CreateQuery(device, D3DQUERYTYPE_EVENT, &pQuery);
+    CHECK_CALL(hr, "CreateQuery", device, ++refcount);
 
-    hr = IDirect3DDevice9_BeginStateBlock( pDevice );
-    CHECK_CALL( hr, "BeginStateBlock", pDevice, refcount );
-    hr = IDirect3DDevice9_EndStateBlock( pDevice, &pStateBlock1 );
-    CHECK_CALL( hr, "EndStateBlock", pDevice, ++refcount );
+    hr = IDirect3DDevice9_BeginStateBlock(device);
+    CHECK_CALL(hr, "BeginStateBlock", device, refcount);
+    hr = IDirect3DDevice9_EndStateBlock(device, &pStateBlock1);
+    CHECK_CALL(hr, "EndStateBlock", device, ++refcount);
 
     /* The implicit render target is not freed if refcount reaches 0.
      * Otherwise GetRenderTarget would re-allocate it and the pointer would change.*/
-    hr = IDirect3DDevice9_GetRenderTarget(pDevice, 0, &pRenderTarget2);
-    CHECK_CALL( hr, "GetRenderTarget", pDevice, ++refcount);
+    hr = IDirect3DDevice9_GetRenderTarget(device, 0, &pRenderTarget2);
+    CHECK_CALL(hr, "GetRenderTarget", device, ++refcount);
     if(pRenderTarget2)
     {
         CHECK_RELEASE_REFCOUNT(pRenderTarget2, 0);
         ok(pRenderTarget == pRenderTarget2, "RenderTarget=%p and RenderTarget2=%p should be the same.\n",
            pRenderTarget, pRenderTarget2);
-        CHECK_REFCOUNT( pDevice, --refcount);
+        CHECK_REFCOUNT(device, --refcount);
         pRenderTarget2 = NULL;
     }
     pRenderTarget = NULL;
 
 cleanup:
-    CHECK_RELEASE(pDevice,              pDevice, --refcount);
+    CHECK_RELEASE(device,               device, --refcount);
 
     /* Buffers */
-    CHECK_RELEASE(pVertexBuffer,        pDevice, --refcount);
-    CHECK_RELEASE(pIndexBuffer,         pDevice, --refcount);
+    CHECK_RELEASE(pVertexBuffer,        device, --refcount);
+    CHECK_RELEASE(pIndexBuffer,         device, --refcount);
     /* Shaders */
-    CHECK_RELEASE(pVertexDeclaration,   pDevice, --refcount);
-    CHECK_RELEASE(pVertexShader,        pDevice, --refcount);
-    CHECK_RELEASE(pPixelShader,         pDevice, --refcount);
+    CHECK_RELEASE(pVertexDeclaration,   device, --refcount);
+    CHECK_RELEASE(pVertexShader,        device, --refcount);
+    CHECK_RELEASE(pPixelShader,         device, --refcount);
     /* Textures */
-    CHECK_RELEASE(pTextureLevel,        pDevice, --refcount);
-    CHECK_RELEASE(pCubeTexture,         pDevice, --refcount);
-    CHECK_RELEASE(pVolumeTexture,       pDevice, --refcount);
+    CHECK_RELEASE(pTextureLevel,        device, --refcount);
+    CHECK_RELEASE(pCubeTexture,         device, --refcount);
+    CHECK_RELEASE(pVolumeTexture,       device, --refcount);
     /* Surfaces */
-    CHECK_RELEASE(pStencilSurface,      pDevice, --refcount);
-    CHECK_RELEASE(pOffscreenSurface,    pDevice, --refcount);
-    CHECK_RELEASE(pRenderTarget3,       pDevice, --refcount);
+    CHECK_RELEASE(pStencilSurface,      device, --refcount);
+    CHECK_RELEASE(pOffscreenSurface,    device, --refcount);
+    CHECK_RELEASE(pRenderTarget3,       device, --refcount);
     /* Misc */
-    CHECK_RELEASE(pStateBlock,          pDevice, --refcount);
-    CHECK_RELEASE(pSwapChain,           pDevice, --refcount);
-    CHECK_RELEASE(pQuery,               pDevice, --refcount);
+    CHECK_RELEASE(pStateBlock,          device, --refcount);
+    CHECK_RELEASE(pSwapChain,           device, --refcount);
+    CHECK_RELEASE(pQuery,               device, --refcount);
     /* This will destroy device - cannot check the refcount here */
     if (pStateBlock1)         CHECK_RELEASE_REFCOUNT( pStateBlock1, 0);
     CHECK_RELEASE_REFCOUNT(d3d, 0);
-    DestroyWindow( hwnd );
+    DestroyWindow(window);
 }
 
 static void test_cursor(void)
 {
-    HRESULT                      hr;
-    IDirect3DDevice9            *pDevice            = NULL;
-    D3DPRESENT_PARAMETERS        d3dpp;
-    D3DDISPLAYMODE               d3ddm;
-    CURSORINFO                   info;
     IDirect3DSurface9 *cursor = NULL;
+    IDirect3DDevice9 *device;
+    CURSORINFO info;
     IDirect3D9 *d3d;
+    ULONG refcount;
     HCURSOR cur;
-    HWND hwnd;
+    HWND window;
+    HRESULT hr;
 
     memset(&info, 0, sizeof(info));
     info.cbSize = sizeof(info);
     ok(GetCursorInfo(&info), "GetCursorInfo failed\n");
     cur = info.hCursor;
 
-    hwnd = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
-            100, 100, 160, 160, NULL, NULL, NULL, NULL);
-    ok(!!hwnd, "Failed to create a window.\n");
+    window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, NULL, NULL, NULL, NULL);
+    ok(!!window, "Failed to create a window.\n");
     d3d = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d, "Failed to create a D3D object.\n");
+    if (!(device = create_device(d3d, window, window, TRUE)))
+    {
+        skip("Failed to create a 3D device, skipping test.\n");
+        goto cleanup;
+    }
 
-    IDirect3D9_GetAdapterDisplayMode(d3d, D3DADAPTER_DEFAULT, &d3ddm);
-    ZeroMemory( &d3dpp, sizeof(d3dpp) );
-    d3dpp.Windowed         = TRUE;
-    d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
-    d3dpp.BackBufferFormat = d3ddm.Format;
-
-    hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
-            hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice);
-    ok(hr == S_OK || hr == D3DERR_NOTAVAILABLE || broken(hr == D3DERR_INVALIDCALL),
-       "Failed to create IDirect3D9Device (%08x)\n", hr);
-    if (FAILED(hr)) goto cleanup;
-
-    IDirect3DDevice9_CreateOffscreenPlainSurface(pDevice, 32, 32, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &cursor, 0);
-    ok(cursor != NULL, "IDirect3DDevice9_CreateOffscreenPlainSurface failed with %08x\n", hr);
+    hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 32, 32,
+            D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &cursor, NULL);
+    ok(SUCCEEDED(hr), "Failed to create cursor surface, hr %#x.\n", hr);
 
     /* Initially hidden */
-    hr = IDirect3DDevice9_ShowCursor(pDevice, TRUE);
+    hr = IDirect3DDevice9_ShowCursor(device, TRUE);
     ok(hr == FALSE, "IDirect3DDevice9_ShowCursor returned %08x\n", hr);
 
     /* Not enabled without a surface*/
-    hr = IDirect3DDevice9_ShowCursor(pDevice, TRUE);
+    hr = IDirect3DDevice9_ShowCursor(device, TRUE);
     ok(hr == FALSE, "IDirect3DDevice9_ShowCursor returned %08x\n", hr);
 
     /* Fails */
-    hr = IDirect3DDevice9_SetCursorProperties(pDevice, 0, 0, NULL);
+    hr = IDirect3DDevice9_SetCursorProperties(device, 0, 0, NULL);
     ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice9_SetCursorProperties returned %08x\n", hr);
 
-    hr = IDirect3DDevice9_SetCursorProperties(pDevice, 0, 0, cursor);
+    hr = IDirect3DDevice9_SetCursorProperties(device, 0, 0, cursor);
     ok(hr == D3D_OK, "IDirect3DDevice9_SetCursorProperties returned %08x\n", hr);
 
     IDirect3DSurface9_Release(cursor);
@@ -833,11 +790,11 @@ static void test_cursor(void)
     ok(info.hCursor == cur, "The cursor handle is %p\n", info.hCursor); /* unchanged */
 
     /* Still hidden */
-    hr = IDirect3DDevice9_ShowCursor(pDevice, TRUE);
+    hr = IDirect3DDevice9_ShowCursor(device, TRUE);
     ok(hr == FALSE, "IDirect3DDevice9_ShowCursor returned %08x\n", hr);
 
     /* Enabled now*/
-    hr = IDirect3DDevice9_ShowCursor(pDevice, TRUE);
+    hr = IDirect3DDevice9_ShowCursor(device, TRUE);
     ok(hr == TRUE, "IDirect3DDevice9_ShowCursor returned %08x\n", hr);
 
     /* GDI cursor unchanged */
@@ -847,14 +804,11 @@ static void test_cursor(void)
     ok(info.flags & CURSOR_SHOWING, "The gdi cursor is hidden (%08x)\n", info.flags);
     ok(info.hCursor == cur, "The cursor handle is %p\n", info.hCursor); /* unchanged */
 
+    refcount = IDirect3DDevice9_Release(device);
+    ok(!refcount, "Device has %u references left.\n", refcount);
 cleanup:
-    if (pDevice)
-    {
-        UINT refcount = IDirect3DDevice9_Release(pDevice);
-        ok(!refcount, "Device has %u references left.\n", refcount);
-    }
     IDirect3D9_Release(d3d);
-    DestroyWindow( hwnd );
+    DestroyWindow(window);
 }
 
 static void test_reset(void)
@@ -1438,232 +1392,182 @@ static void test_display_modes(void)
 
 static void test_scene(void)
 {
-    HRESULT                      hr;
-    IDirect3DDevice9            *pDevice            = NULL;
-    D3DPRESENT_PARAMETERS        d3dpp;
-    D3DDISPLAYMODE               d3ddm;
-    IDirect3DSurface9            *pSurface1 = NULL, *pSurface2 = NULL, *pSurface3 = NULL, *pRenderTarget = NULL;
-    IDirect3DSurface9            *pBackBuffer = NULL, *pDepthStencil = NULL;
+    IDirect3DSurface9 *surface1, *surface2, *surface3;
+    IDirect3DSurface9 *backBuffer, *rt, *ds;
     RECT rect = {0, 0, 128, 128};
+    IDirect3DDevice9 *device;
     IDirect3D9 *d3d;
+    ULONG refcount;
     D3DCAPS9 caps;
-    HWND hwnd;
+    HWND window;
+    HRESULT hr;
 
-    hwnd = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
-            100, 100, 160, 160, NULL, NULL, NULL, NULL);
-    ok(!!hwnd, "Failed to create a window.\n");
+    window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, NULL, NULL, NULL, NULL);
+    ok(!!window, "Failed to create a window.\n");
     d3d = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d, "Failed to create a D3D object.\n");
-
-    IDirect3D9_GetAdapterDisplayMode(d3d, D3DADAPTER_DEFAULT, &d3ddm);
-    ZeroMemory( &d3dpp, sizeof(d3dpp) );
-    d3dpp.Windowed         = TRUE;
-    d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
-    d3dpp.BackBufferWidth  = 800;
-    d3dpp.BackBufferHeight = 600;
-    d3dpp.BackBufferFormat = d3ddm.Format;
-    d3dpp.EnableAutoDepthStencil = TRUE;
-    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
-
-    hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL /* no NULLREF here */,
-            hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice);
-    ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE || broken(hr == D3DERR_INVALIDCALL), "IDirect3D9_CreateDevice failed with %08x\n", hr);
-    if(!pDevice)
+    if (!(device = create_device(d3d, window, window, TRUE)))
     {
-        skip("Failed to create a d3d device\n");
+        skip("Failed to create a 3D device, skipping test.\n");
         goto cleanup;
     }
 
     /* Get the caps, they will be needed to tell if an operation is supposed to be valid */
     memset(&caps, 0, sizeof(caps));
-    hr = IDirect3DDevice9_GetDeviceCaps(pDevice, &caps);
+    hr = IDirect3DDevice9_GetDeviceCaps(device, &caps);
     ok(hr == D3D_OK, "IDirect3DDevice9_GetCaps failed with %08x\n", hr);
-    if(FAILED(hr)) goto cleanup;
 
     /* Test an EndScene without BeginScene. Should return an error */
-    hr = IDirect3DDevice9_EndScene(pDevice);
+    hr = IDirect3DDevice9_EndScene(device);
     ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice9_EndScene returned %08x\n", hr);
 
     /* Test a normal BeginScene / EndScene pair, this should work */
-    hr = IDirect3DDevice9_BeginScene(pDevice);
+    hr = IDirect3DDevice9_BeginScene(device);
     ok(hr == D3D_OK, "IDirect3DDevice9_BeginScene failed with %08x\n", hr);
-    if(SUCCEEDED(hr))
-    {
-        hr = IDirect3DDevice9_EndScene(pDevice);
-        ok(hr == D3D_OK, "IDirect3DDevice9_EndScene failed with %08x\n", hr);
-    }
+    hr = IDirect3DDevice9_EndScene(device);
+    ok(hr == D3D_OK, "IDirect3DDevice9_EndScene failed with %08x\n", hr);
 
     /* Test another EndScene without having begun a new scene. Should return an error */
-    hr = IDirect3DDevice9_EndScene(pDevice);
+    hr = IDirect3DDevice9_EndScene(device);
     ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice9_EndScene returned %08x\n", hr);
 
     /* Two nested BeginScene and EndScene calls */
-    hr = IDirect3DDevice9_BeginScene(pDevice);
+    hr = IDirect3DDevice9_BeginScene(device);
     ok(hr == D3D_OK, "IDirect3DDevice9_BeginScene failed with %08x\n", hr);
-    hr = IDirect3DDevice9_BeginScene(pDevice);
+    hr = IDirect3DDevice9_BeginScene(device);
     ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice9_BeginScene returned %08x\n", hr);
-    hr = IDirect3DDevice9_EndScene(pDevice);
+    hr = IDirect3DDevice9_EndScene(device);
     ok(hr == D3D_OK, "IDirect3DDevice9_EndScene failed with %08x\n", hr);
-    hr = IDirect3DDevice9_EndScene(pDevice);
+    hr = IDirect3DDevice9_EndScene(device);
     ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice9_EndScene returned %08x\n", hr);
 
     /* Create some surfaces to test stretchrect between the scenes */
-    hr = IDirect3DDevice9_CreateOffscreenPlainSurface(pDevice, 128, 128, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pSurface1, NULL);
+    hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 128, 128,
+            D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &surface1, NULL);
     ok(hr == D3D_OK, "IDirect3DDevice9_CreateOffscreenPlainSurface failed with %08x\n", hr);
-    hr = IDirect3DDevice9_CreateOffscreenPlainSurface(pDevice, 128, 128, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pSurface2, NULL);
+    hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 128, 128,
+            D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &surface2, NULL);
     ok(hr == D3D_OK, "IDirect3DDevice9_CreateOffscreenPlainSurface failed with %08x\n", hr);
-    hr = IDirect3DDevice9_CreateDepthStencilSurface(pDevice, 800, 600, D3DFMT_D16, D3DMULTISAMPLE_NONE, 0, FALSE, &pSurface3, NULL);
+    hr = IDirect3DDevice9_CreateDepthStencilSurface(device, 800, 600,
+            D3DFMT_D16, D3DMULTISAMPLE_NONE, 0, FALSE, &surface3, NULL);
     ok(hr == D3D_OK, "IDirect3DDevice9_CreateDepthStencilSurface failed with %08x\n", hr);
-    hr = IDirect3DDevice9_CreateRenderTarget(pDevice, 128, 128, d3ddm.Format, D3DMULTISAMPLE_NONE, 0, FALSE, &pRenderTarget, NULL);
+    hr = IDirect3DDevice9_CreateRenderTarget(device, 128, 128,
+            D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, FALSE, &rt, NULL);
     ok(hr == D3D_OK, "IDirect3DDevice9_CreateRenderTarget failed with %08x\n", hr);
 
-    hr = IDirect3DDevice9_GetBackBuffer(pDevice, 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
+    hr = IDirect3DDevice9_GetBackBuffer(device, 0, 0, D3DBACKBUFFER_TYPE_MONO, &backBuffer);
     ok(hr == D3D_OK, "IDirect3DDevice9_GetBackBuffer failed with %08x\n", hr);
-    hr = IDirect3DDevice9_GetDepthStencilSurface(pDevice, &pDepthStencil);
+    hr = IDirect3DDevice9_GetDepthStencilSurface(device, &ds);
     ok(hr == D3D_OK, "IDirect3DDevice9_GetBackBuffer failed with %08x\n", hr);
 
     /* First make sure a simple StretchRect call works */
-    if(pSurface1 && pSurface2) {
-        hr = IDirect3DDevice9_StretchRect(pDevice, pSurface1, NULL, pSurface2, NULL, 0);
-        ok( hr == D3D_OK, "IDirect3DDevice9_StretchRect failed with %08x\n", hr);
-    }
-    if(pBackBuffer && pRenderTarget) {
-        hr = IDirect3DDevice9_StretchRect(pDevice, pBackBuffer, &rect, pRenderTarget, NULL, 0);
-        ok( hr == D3D_OK, "IDirect3DDevice9_StretchRect failed with %08x\n", hr);
-    }
-    if(pDepthStencil && pSurface3) {
-        HRESULT expected;
-        if(0) /* Disabled for now because it crashes in wine */ {
-            expected = caps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES ? D3D_OK : D3DERR_INVALIDCALL;
-            hr = IDirect3DDevice9_StretchRect(pDevice, pDepthStencil, NULL, pSurface3, NULL, 0);
-            ok( hr == expected, "IDirect3DDevice9_StretchRect returned %08x, expected %08x\n", hr, expected);
-        }
+    hr = IDirect3DDevice9_StretchRect(device, surface1, NULL, surface2, NULL, 0);
+    ok(hr == D3D_OK, "IDirect3DDevice9_StretchRect failed with %08x\n", hr);
+    hr = IDirect3DDevice9_StretchRect(device, backBuffer, &rect, rt, NULL, 0);
+    ok(hr == D3D_OK, "IDirect3DDevice9_StretchRect failed with %08x\n", hr);
+    if (0) /* Disabled for now because it crashes in wine */
+    {
+        HRESULT expected = caps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES ? D3D_OK : D3DERR_INVALIDCALL;
+        hr = IDirect3DDevice9_StretchRect(device, ds, NULL, surface3, NULL, 0);
+        ok(hr == expected, "Got unexpected hr %#x, expected %#x.\n", hr, expected);
     }
 
-    /* Now try it in a BeginScene - EndScene pair. Seems to be allowed in a beginScene - Endscene pair
-     * with normal surfaces and render targets, but not depth stencil surfaces.
-     */
-    hr = IDirect3DDevice9_BeginScene(pDevice);
-    ok( hr == D3D_OK, "IDirect3DDevice9_BeginScene failed with %08x\n", hr);
+    /* Now try it in a BeginScene - EndScene pair. Seems to be allowed in a
+     * BeginScene - Endscene pair with normal surfaces and render targets, but
+     * not depth stencil surfaces. */
+    hr = IDirect3DDevice9_BeginScene(device);
+    ok(hr == D3D_OK, "IDirect3DDevice9_BeginScene failed with %08x\n", hr);
 
-    if(pSurface1 && pSurface2)
-    {
-        hr = IDirect3DDevice9_StretchRect(pDevice, pSurface1, NULL, pSurface2, NULL, 0);
-        ok( hr == D3D_OK, "IDirect3DDevice9_StretchRect failed with %08x\n", hr);
-    }
-    if(pBackBuffer && pRenderTarget)
-    {
-        hr = IDirect3DDevice9_StretchRect(pDevice, pBackBuffer, &rect, pRenderTarget, NULL, 0);
-        ok( hr == D3D_OK, "IDirect3DDevice9_StretchRect failed with %08x\n", hr);
-    }
-    if(pDepthStencil && pSurface3)
-    {
-        /* This is supposed to fail inside a BeginScene - EndScene pair. */
-        hr = IDirect3DDevice9_StretchRect(pDevice, pDepthStencil, NULL, pSurface3, NULL, 0);
-        ok( hr == D3DERR_INVALIDCALL, "IDirect3DDevice9_StretchRect returned %08x, expected D3DERR_INVALIDCALL\n", hr);
-    }
+    hr = IDirect3DDevice9_StretchRect(device, surface1, NULL, surface2, NULL, 0);
+    ok(hr == D3D_OK, "IDirect3DDevice9_StretchRect failed with %08x\n", hr);
+    hr = IDirect3DDevice9_StretchRect(device, backBuffer, &rect, rt, NULL, 0);
+    ok(hr == D3D_OK, "IDirect3DDevice9_StretchRect failed with %08x\n", hr);
+    /* This is supposed to fail inside a BeginScene - EndScene pair. */
+    hr = IDirect3DDevice9_StretchRect(device, ds, NULL, surface3, NULL, 0);
+    ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice9_StretchRect returned %08x, expected D3DERR_INVALIDCALL\n", hr);
 
-    hr = IDirect3DDevice9_EndScene(pDevice);
-    ok( hr == D3D_OK, "IDirect3DDevice9_EndScene failed with %08x\n", hr);
+    hr = IDirect3DDevice9_EndScene(device);
+    ok(hr == D3D_OK, "IDirect3DDevice9_EndScene failed with %08x\n", hr);
 
     /* Does a SetRenderTarget influence BeginScene / EndScene ?
      * Set a new render target, then see if it started a new scene. Flip the rt back and see if that maybe
      * ended the scene. Expected result is that the scene is not affected by SetRenderTarget
      */
-    hr = IDirect3DDevice9_SetRenderTarget(pDevice, 0, pRenderTarget);
+    hr = IDirect3DDevice9_SetRenderTarget(device, 0, rt);
     ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderTarget failed with %08x\n", hr);
-    hr = IDirect3DDevice9_BeginScene(pDevice);
+    hr = IDirect3DDevice9_BeginScene(device);
     ok( hr == D3D_OK, "IDirect3DDevice9_BeginScene failed with %08x\n", hr);
-    hr = IDirect3DDevice9_SetRenderTarget(pDevice, 0, pBackBuffer);
+    hr = IDirect3DDevice9_SetRenderTarget(device, 0, backBuffer);
     ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderTarget failed with %08x\n", hr);
-    hr = IDirect3DDevice9_EndScene(pDevice);
+    hr = IDirect3DDevice9_EndScene(device);
     ok( hr == D3D_OK, "IDirect3DDevice9_EndScene failed with %08x\n", hr);
 
+    IDirect3DSurface9_Release(rt);
+    IDirect3DSurface9_Release(ds);
+    IDirect3DSurface9_Release(backBuffer);
+    IDirect3DSurface9_Release(surface1);
+    IDirect3DSurface9_Release(surface2);
+    IDirect3DSurface9_Release(surface3);
+    refcount = IDirect3DDevice9_Release(device);
+    ok(!refcount, "Device has %u references left.\n", refcount);
 cleanup:
-    if(pRenderTarget) IDirect3DSurface9_Release(pRenderTarget);
-    if(pDepthStencil) IDirect3DSurface9_Release(pDepthStencil);
-    if(pBackBuffer) IDirect3DSurface9_Release(pBackBuffer);
-    if(pSurface1) IDirect3DSurface9_Release(pSurface1);
-    if(pSurface2) IDirect3DSurface9_Release(pSurface2);
-    if(pSurface3) IDirect3DSurface9_Release(pSurface3);
-    if (pDevice)
-    {
-        UINT refcount = IDirect3DDevice9_Release(pDevice);
-        ok(!refcount, "Device has %u references left.\n", refcount);
-    }
     IDirect3D9_Release(d3d);
-    DestroyWindow(hwnd);
+    DestroyWindow(window);
 }
 
 static void test_limits(void)
 {
-    HRESULT                      hr;
-    IDirect3DDevice9            *pDevice            = NULL;
-    D3DPRESENT_PARAMETERS        d3dpp;
-    D3DDISPLAYMODE               d3ddm;
-    IDirect3DTexture9           *pTexture           = NULL;
+    IDirect3DTexture9 *texture;
+    IDirect3DDevice9 *device;
     IDirect3D9 *d3d;
-    HWND hwnd;
-    int i;
+    unsigned int i;
+    ULONG refcount;
+    HWND window;
+    HRESULT hr;
 
-    hwnd = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
-            100, 100, 160, 160, NULL, NULL, NULL, NULL);
-    ok(!!hwnd, "Failed to create a window.\n");
+    window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, NULL, NULL, NULL, NULL);
+    ok(!!window, "Failed to create a window.\n");
     d3d = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d, "Failed to create a D3D object.\n");
-
-    IDirect3D9_GetAdapterDisplayMode(d3d, D3DADAPTER_DEFAULT, &d3ddm);
-    ZeroMemory( &d3dpp, sizeof(d3dpp) );
-    d3dpp.Windowed         = TRUE;
-    d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
-    d3dpp.BackBufferWidth  = 800;
-    d3dpp.BackBufferHeight = 600;
-    d3dpp.BackBufferFormat = d3ddm.Format;
-    d3dpp.EnableAutoDepthStencil = TRUE;
-    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
-
-    hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL /* no NULLREF here */,
-            hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice);
-    ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE || broken(hr == D3DERR_INVALIDCALL), "IDirect3D9_CreateDevice failed with %08x\n", hr);
-    if(!pDevice)
+    if (!(device = create_device(d3d, window, window, TRUE)))
     {
-        skip("Failed to create a d3d device\n");
+        skip("Failed to create a 3D device, skipping test.\n");
         goto cleanup;
     }
 
-    hr = IDirect3DDevice9_CreateTexture(pDevice, 16, 16, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pTexture, NULL);
+    hr = IDirect3DDevice9_CreateTexture(device, 16, 16, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &texture, NULL);
     ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture failed with %08x\n", hr);
-    if(!pTexture) goto cleanup;
 
     /* There are 16 pixel samplers. We should be able to access all of them */
-    for(i = 0; i < 16; i++) {
-        hr = IDirect3DDevice9_SetTexture(pDevice, i, (IDirect3DBaseTexture9 *) pTexture);
+    for (i = 0; i < 16; ++i)
+    {
+        hr = IDirect3DDevice9_SetTexture(device, i, (IDirect3DBaseTexture9 *)texture);
         ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture for sampler %d failed with %08x\n", i, hr);
-        hr = IDirect3DDevice9_SetTexture(pDevice, i, NULL);
+        hr = IDirect3DDevice9_SetTexture(device, i, NULL);
         ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture for sampler %d failed with %08x\n", i, hr);
-        hr = IDirect3DDevice9_SetSamplerState(pDevice, i, D3DSAMP_SRGBTEXTURE, TRUE);
+        hr = IDirect3DDevice9_SetSamplerState(device, i, D3DSAMP_SRGBTEXTURE, TRUE);
         ok(hr == D3D_OK, "IDirect3DDevice9_SetSamplerState for sampler %d failed with %08x\n", i, hr);
     }
 
     /* Now test all 8 textures stage states */
-    for(i = 0; i < 8; i++) {
-        hr = IDirect3DDevice9_SetTextureStageState(pDevice, i, D3DTSS_COLOROP, D3DTOP_ADD);
+    for (i = 0; i < 8; ++i)
+    {
+        hr = IDirect3DDevice9_SetTextureStageState(device, i, D3DTSS_COLOROP, D3DTOP_ADD);
         ok(hr == D3D_OK, "IDirect3DDevice9_SetTextureStageState for texture %d failed with %08x\n", i, hr);
     }
 
-    /* Investigations show that accessing higher samplers / textures stage states does not return an error either. Writing
-     * to too high samplers(approximately sampler 40) causes memory corruption in windows, so there is no bounds checking
-     * but how do I test that?
-     */
+    /* Investigations show that accessing higher samplers / textures stage
+     * states does not return an error either. Writing to too high samplers
+     * (approximately sampler 40) causes memory corruption in Windows, so
+     * there is no bounds checking. */
+    IDirect3DTexture9_Release(texture);
+    refcount = IDirect3D9_Release(device);
+    ok(!refcount, "Device has %u references left.\n", refcount);
 cleanup:
-    if(pTexture) IDirect3DTexture9_Release(pTexture);
-    if (pDevice)
-    {
-        UINT refcount = IDirect3D9_Release(pDevice);
-        ok(!refcount, "Device has %u references left.\n", refcount);
-    }
     IDirect3D9_Release(d3d);
-    DestroyWindow(hwnd);
+    DestroyWindow(window);
 }
 
 static void test_depthstenciltest(void)
@@ -1895,32 +1799,24 @@ static void test_draw_indexed(void)
         D3DDECL_END()
     };
 
-    IDirect3DVertexDeclaration9 *vertex_declaration = NULL;
-    IDirect3DVertexBuffer9 *vertex_buffer = NULL;
-    IDirect3DIndexBuffer9 *index_buffer = NULL;
-    D3DPRESENT_PARAMETERS present_parameters;
-    IDirect3DDevice9 *device = NULL;
+    IDirect3DVertexDeclaration9 *vertex_declaration;
+    IDirect3DVertexBuffer9 *vertex_buffer;
+    IDirect3DIndexBuffer9 *index_buffer;
+    IDirect3DDevice9 *device;
     IDirect3D9 *d3d9;
+    ULONG refcount;
+    HWND window;
     HRESULT hr;
-    HWND hwnd;
     void *ptr;
 
-    hwnd = CreateWindowA("d3d9_test_wc", "d3d9_test", 0,
-            0, 0, 10, 10, 0, 0, 0, 0);
-    ok(!!hwnd, "Failed to create a window.\n");
+    window = CreateWindowA("d3d9_test_wc", "d3d9_test", 0,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ok(!!window, "Failed to create a window.\n");
     d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d9, "Failed to create a D3D object.\n");
-
-    ZeroMemory(&present_parameters, sizeof(present_parameters));
-    present_parameters.Windowed = TRUE;
-    present_parameters.hDeviceWindow = hwnd;
-    present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
-
-    hr = IDirect3D9_CreateDevice(d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
-            NULL, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &present_parameters, &device);
-    if (FAILED(hr) || !device)
+    if (!(device = create_device(d3d9, window, window, TRUE)))
     {
-        skip("Failed to create device\n");
+        skip("Failed to create a 3D device, skipping test.\n");
         goto cleanup;
     }
 
@@ -1983,24 +1879,20 @@ static void test_draw_indexed(void)
     IDirect3DVertexBuffer9_Release(vertex_buffer);
     IDirect3DIndexBuffer9_Release(index_buffer);
     IDirect3DVertexDeclaration9_Release(vertex_declaration);
-
+    refcount = IDirect3DDevice9_Release(device);
+    ok(!refcount, "Device has %u references left.\n", refcount);
 cleanup:
-    if (device)
-    {
-        UINT refcount = IDirect3DDevice9_Release(device);
-        ok(!refcount, "Device has %u references left.\n", refcount);
-    }
     IDirect3D9_Release(d3d9);
-    DestroyWindow(hwnd);
+    DestroyWindow(window);
 }
 
 static void test_null_stream(void)
 {
     IDirect3DVertexBuffer9 *buffer = NULL;
-    D3DPRESENT_PARAMETERS present_parameters;
-    IDirect3DDevice9 *device = NULL;
+    IDirect3DDevice9 *device;
     IDirect3D9 *d3d9;
-    HWND hwnd;
+    ULONG refcount;
+    HWND window;
     HRESULT hr;
     IDirect3DVertexShader9 *shader = NULL;
     IDirect3DVertexDeclaration9 *decl = NULL;
@@ -2017,23 +1909,14 @@ static void test_null_stream(void)
         D3DDECL_END()
     };
 
-    hwnd = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
-            100, 100, 160, 160, NULL, NULL, NULL, NULL);
-    ok(!!hwnd, "Failed to create a window.\n");
+    window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, NULL, NULL, NULL, NULL);
+    ok(!!window, "Failed to create a window.\n");
     d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d9, "Failed to create a D3D object.\n");
-
-    ZeroMemory(&present_parameters, sizeof(present_parameters));
-    present_parameters.Windowed = TRUE;
-    present_parameters.hDeviceWindow = hwnd;
-    present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
-
-    hr = IDirect3D9_CreateDevice( d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL /* no NULLREF here */, hwnd,
-                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING, &present_parameters, &device );
-    ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE || broken(hr == D3DERR_INVALIDCALL), "IDirect3D9_CreateDevice failed with %08x\n", hr);
-    if(!device)
+    if (!(device = create_device(d3d9, window, window, TRUE)))
     {
-        skip("Failed to create a d3d device\n");
+        skip("Failed to create a 3D device, skipping test.\n");
         goto cleanup;
     }
 
@@ -2080,46 +1963,36 @@ static void test_null_stream(void)
 
 cleanup:
     if (buffer) IDirect3DVertexBuffer9_Release(buffer);
-    if(decl) IDirect3DVertexDeclaration9_Release(decl);
-    if(shader) IDirect3DVertexShader9_Release(shader);
+    if (decl) IDirect3DVertexDeclaration9_Release(decl);
+    if (shader) IDirect3DVertexShader9_Release(shader);
     if (device)
     {
-        UINT refcount = IDirect3DDevice9_Release(device);
+        refcount = IDirect3DDevice9_Release(device);
         ok(!refcount, "Device has %u references left.\n", refcount);
     }
     IDirect3D9_Release(d3d9);
-    DestroyWindow(hwnd);
+    DestroyWindow(window);
 }
 
 static void test_lights(void)
 {
-    D3DPRESENT_PARAMETERS present_parameters;
-    IDirect3DDevice9 *device = NULL;
+    IDirect3DDevice9 *device;
     IDirect3D9 *d3d9;
-    HWND hwnd;
+    ULONG refcount;
+    HWND window;
     HRESULT hr;
     unsigned int i;
     BOOL enabled;
     D3DCAPS9 caps;
 
-    hwnd = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
-            100, 100, 160, 160, NULL, NULL, NULL, NULL);
-    ok(!!hwnd, "Failed to create a window.\n");
+    window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, NULL, NULL, NULL, NULL);
+    ok(!!window, "Failed to create a window.\n");
     d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d9, "Failed to create a D3D object.\n");
-
-    ZeroMemory(&present_parameters, sizeof(present_parameters));
-    present_parameters.Windowed = TRUE;
-    present_parameters.hDeviceWindow = hwnd;
-    present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
-
-    hr = IDirect3D9_CreateDevice( d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
-                                  D3DCREATE_HARDWARE_VERTEXPROCESSING, &present_parameters, &device );
-    ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE || hr == D3DERR_INVALIDCALL,
-       "IDirect3D9_CreateDevice failed with %08x\n", hr);
-    if(!device)
+    if (!(device = create_device(d3d9, window, window, TRUE)))
     {
-        skip("Failed to create a d3d device\n");
+        skip("Failed to create a 3D device, skipping test.\n");
         goto cleanup;
     }
 
@@ -2149,95 +2022,72 @@ static void test_lights(void)
         ok(hr == D3D_OK, "Disabling light %u failed with %08x\n", i, hr);
     }
 
+    refcount = IDirect3DDevice9_Release(device);
+    ok(!refcount, "Device has %u references left.\n", refcount);
 cleanup:
-    if (device)
-    {
-        UINT refcount = IDirect3DDevice9_Release(device);
-        ok(!refcount, "Device has %u references left.\n", refcount);
-    }
     IDirect3D9_Release(d3d9);
-    DestroyWindow(hwnd);
+    DestroyWindow(window);
 }
 
 static void test_set_stream_source(void)
 {
-    D3DPRESENT_PARAMETERS present_parameters;
-    IDirect3DDevice9 *device = NULL;
+    IDirect3DVertexBuffer9 *vb;
+    IDirect3DDevice9 *device;
     IDirect3D9 *d3d9;
-    HWND hwnd;
+    ULONG refcount;
+    HWND window;
     HRESULT hr;
-    IDirect3DVertexBuffer9 *pVertexBuffer = NULL;
 
-    hwnd = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
-            100, 100, 160, 160, NULL, NULL, NULL, NULL);
-    ok(!!hwnd, "Failed to create a window.\n");
+    window = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, NULL, NULL, NULL, NULL);
+    ok(!!window, "Failed to create a window.\n");
     d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d9, "Failed to create a D3D object.\n");
-
-    ZeroMemory(&present_parameters, sizeof(present_parameters));
-    present_parameters.Windowed = TRUE;
-    present_parameters.hDeviceWindow = hwnd;
-    present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
-
-    hr = IDirect3D9_CreateDevice( d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
-                                  D3DCREATE_HARDWARE_VERTEXPROCESSING, &present_parameters, &device );
-    ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE || hr == D3DERR_INVALIDCALL,
-       "IDirect3D9_CreateDevice failed with %08x\n", hr);
-    if(!device)
-    {
-        hr = IDirect3D9_CreateDevice( d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hwnd,
-                                      D3DCREATE_HARDWARE_VERTEXPROCESSING, &present_parameters, &device );
-        ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE || hr == D3DERR_INVALIDCALL,
-           "IDirect3D9_CreateDevice failed with %08x\n", hr);
-        if(!device)
-        {
-            skip("Failed to create a d3d device\n");
-            goto cleanup;
-        }
+    if (!(device = create_device(d3d9, window, window, TRUE)))
+    {
+        skip("Failed to create a 3D device, skipping test.\n");
+        goto cleanup;
     }
 
-    hr = IDirect3DDevice9_CreateVertexBuffer( device, 512, 0, 0, D3DPOOL_DEFAULT, &pVertexBuffer, NULL );
-    ok(hr == D3D_OK, "Failed to create a vertex buffer, hr = %08x\n", hr);
-    if (SUCCEEDED(hr)) {
-        /* Some cards(Geforce 7400 at least) accept non-aligned offsets, others(radeon 9000 verified) reject it,
-         * so accept both results. Wine currently rejects this to be able to optimize the vbo conversion, but writes
-         * a WARN
-         */
-        hr = IDirect3DDevice9_SetStreamSource(device, 0, pVertexBuffer, 0, 32);
-        ok(hr == D3D_OK, "Failed to set the stream source, offset 0, hr = %08x\n", hr);
-        hr = IDirect3DDevice9_SetStreamSource(device, 0, pVertexBuffer, 1, 32);
-        ok(hr == D3DERR_INVALIDCALL || hr == D3D_OK, "Unexpected result when setting the stream source, offset 1, hr = %08x\n", hr);
-        hr = IDirect3DDevice9_SetStreamSource(device, 0, pVertexBuffer, 2, 32);
-        ok(hr == D3DERR_INVALIDCALL || hr == D3D_OK, "Unexpected result when setting the stream source, offset 2, hr = %08x\n", hr);
-        hr = IDirect3DDevice9_SetStreamSource(device, 0, pVertexBuffer, 3, 32);
-        ok(hr == D3DERR_INVALIDCALL || hr == D3D_OK, "Unexpected result when setting the stream source, offset 3, hr = %08x\n", hr);
-        hr = IDirect3DDevice9_SetStreamSource(device, 0, pVertexBuffer, 4, 32);
-        ok(hr == D3D_OK, "Failed to set the stream source, offset 4, hr = %08x\n", hr);
-    }
+    hr = IDirect3DDevice9_CreateVertexBuffer(device, 512, 0, 0, D3DPOOL_DEFAULT, &vb, NULL);
+    ok(SUCCEEDED(hr), "Failed to create a vertex buffer, hr %#x.\n", hr);
+
+    /* Some cards (GeForce 7400 at least) accept non-aligned offsets, others
+     * (Radeon 9000 verified) reject them, so accept both results. Wine
+     * currently rejects this to be able to optimize the vbo conversion, but
+     * writes a WARN. */
+    hr = IDirect3DDevice9_SetStreamSource(device, 0, vb, 0, 32);
+    ok(SUCCEEDED(hr), "Failed to set the stream source, hr %#x.\n", hr);
+    hr = IDirect3DDevice9_SetStreamSource(device, 0, vb, 1, 32);
+    ok(hr == D3DERR_INVALIDCALL || hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+    hr = IDirect3DDevice9_SetStreamSource(device, 0, vb, 2, 32);
+    ok(hr == D3DERR_INVALIDCALL || hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+    hr = IDirect3DDevice9_SetStreamSource(device, 0, vb, 3, 32);
+    ok(hr == D3DERR_INVALIDCALL || hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+    hr = IDirect3DDevice9_SetStreamSource(device, 0, vb, 4, 32);
+    ok(SUCCEEDED(hr), "Failed to set the stream source, hr %#x.\n", hr);
+
     /* Try to set the NULL buffer with an offset and stride 0 */
     hr = IDirect3DDevice9_SetStreamSource(device, 0, NULL, 0, 0);
-    ok(hr == D3D_OK, "Failed to set the stream source, offset 0, hr = %08x\n", hr);
+    ok(SUCCEEDED(hr), "Failed to set the stream source, hr %#x.\n", hr);
     hr = IDirect3DDevice9_SetStreamSource(device, 0, NULL, 1, 0);
-    ok(hr == D3DERR_INVALIDCALL || hr == D3D_OK, "Unexpected result when setting the stream source, offset 1, hr = %08x\n", hr);
+    ok(hr == D3DERR_INVALIDCALL || hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
     hr = IDirect3DDevice9_SetStreamSource(device, 0, NULL, 2, 0);
-    ok(hr == D3DERR_INVALIDCALL || hr == D3D_OK, "Unexpected result when setting the stream source, offset 2, hr = %08x\n", hr);
+    ok(hr == D3DERR_INVALIDCALL || hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
     hr = IDirect3DDevice9_SetStreamSource(device, 0, NULL, 3, 0);
-    ok(hr == D3DERR_INVALIDCALL || hr == D3D_OK, "Unexpected result when setting the stream source, offset 3, hr = %08x\n", hr);
+    ok(hr == D3DERR_INVALIDCALL || hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
     hr = IDirect3DDevice9_SetStreamSource(device, 0, NULL, 4, 0);
-    ok(hr == D3D_OK, "Failed to set the stream source, offset 4, hr = %08x\n", hr);
+    ok(SUCCEEDED(hr), "Failed to set the stream source, hr %#x.\n", hr);
 
     hr = IDirect3DDevice9_SetStreamSource(device, 0, NULL, 0, 0);
-    ok(hr == D3D_OK, "Failed to set the stream source, offset 4, hr = %08x\n", hr);
+    ok(SUCCEEDED(hr), "Failed to set the stream source, hr %#x.\n", hr);
 
+    IDirect3DVertexBuffer9_Release(vb);
+    refcount = IDirect3DDevice9_Release(device);
+    ok(!refcount, "Device has %u references left.\n", refcount);
 cleanup:
-    if (pVertexBuffer) IDirect3DVertexBuffer9_Release(pVertexBuffer);
-    if (device)
-    {
-        UINT refcount = IDirect3DDevice9_Release(device);
-        ok(!refcount, "Device has %u references left.\n", refcount);
-    }
     IDirect3D9_Release(d3d9);
-    DestroyWindow(hwnd);
+    DestroyWindow(window);
 }
 
 /* Direct3D9 offers 4 display formats: R5G6B5, X1R5G5B5, X8R8G8B8 and
@@ -2416,66 +2266,39 @@ err_out:
 
 static void test_multi_device(void)
 {
-    IDirect3DDevice9 *device1 = NULL, *device2 = NULL;
-    D3DPRESENT_PARAMETERS present_parameters;
-    HWND hwnd1 = NULL, hwnd2 = NULL;
+    IDirect3DDevice9 *device1, *device2;
+    HWND window1, window2;
     IDirect3D9 *d3d9;
     ULONG refcount;
-    HRESULT hr;
-
 
-    hwnd1 = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
-            100, 100, 160, 160, NULL, NULL, NULL, NULL);
-    ok(!!hwnd1, "Failed to create a window.\n");
+    window1 = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, NULL, NULL, NULL, NULL);
+    ok(!!window1, "Failed to create a window.\n");
     d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d9, "Failed to create a D3D object.\n");
-
-    memset(&present_parameters, 0, sizeof(present_parameters));
-    present_parameters.Windowed = TRUE;
-    present_parameters.hDeviceWindow = hwnd1;
-    present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
-
-    hr = IDirect3D9_CreateDevice(d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd1,
-            D3DCREATE_SOFTWARE_VERTEXPROCESSING, &present_parameters, &device1);
-    IDirect3D9_Release(d3d9);
-    d3d9 = NULL;
-    if (FAILED(hr)) {
-        skip("Failed to create a device\n");
-        goto fail;
+    if (!(device1 = create_device(d3d9, window1, window1, TRUE)))
+    {
+        skip("Failed to create a 3D device, skipping test.\n");
+        IDirect3D9_Release(d3d9);
+        DestroyWindow(window1);
+        return;
     }
+    IDirect3D9_Release(d3d9);
 
-    hwnd2 = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
-            100, 100, 160, 160, NULL, NULL, NULL, NULL);
-    ok(!!hwnd2, "Failed to create a window.\n");
+    window2 = CreateWindowA("d3d9_test_wc", "d3d9_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, NULL, NULL, NULL, NULL);
+    ok(!!window2, "Failed to create a window.\n");
     d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
     ok(!!d3d9, "Failed to create a D3D object.\n");
-
-    memset(&present_parameters, 0, sizeof(present_parameters));
-    present_parameters.Windowed = TRUE;
-    present_parameters.hDeviceWindow = hwnd2;
-    present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
-
-    hr = IDirect3D9_CreateDevice(d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd2,
-            D3DCREATE_SOFTWARE_VERTEXPROCESSING, &present_parameters, &device2);
-    ok(SUCCEEDED(hr), "Failed to create a device, hr %#x\n", hr);
+    device2 = create_device(d3d9, window2, window2, TRUE);
     IDirect3D9_Release(d3d9);
-    d3d9 = NULL;
-    if (FAILED(hr)) goto fail;
 
-fail:
-    if (d3d9) IDirect3D9_Release(d3d9);
-    if (device1)
-    {
-        refcount = IDirect3DDevice9_Release(device1);
-        ok(!refcount, "Device has %u references left.\n", refcount);
-    }
-    if (device2)
-    {
-        refcount = IDirect3DDevice9_Release(device2);
-        ok(!refcount, "Device has %u references left.\n", refcount);
-    }
-    if (hwnd1) DestroyWindow(hwnd1);
-    if (hwnd2) DestroyWindow(hwnd2);
+    refcount = IDirect3DDevice9_Release(device2);
+    ok(!refcount, "Device has %u references left.\n", refcount);
+    refcount = IDirect3DDevice9_Release(device1);
+    ok(!refcount, "Device has %u references left.\n", refcount);
+    DestroyWindow(window2);
+    DestroyWindow(window1);
 }
 
 static HWND filter_messages;
-- 
1.7.10.4




More information about the wine-patches mailing list