[PATCH 1/5] wined3d: Create the device state block when the device is created.

Henri Verbeet hverbeet at codeweavers.com
Sun Dec 4 08:50:12 CST 2011


---
 dlls/wined3d/device.c |   61 +++++++++++++++++++++---------------------------
 1 files changed, 27 insertions(+), 34 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 1226390..e96e3c4 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -843,8 +843,19 @@ ULONG CDECL wined3d_device_decref(struct wined3d_device *device)
 
     if (!refcount)
     {
+        struct wined3d_stateblock *stateblock;
         UINT i;
 
+        if (wined3d_stateblock_decref(device->updateStateBlock)
+                && device->updateStateBlock != device->stateBlock)
+            FIXME("Something's still holding the update stateblock.\n");
+        device->updateStateBlock = NULL;
+
+        stateblock = device->stateBlock;
+        device->stateBlock = NULL;
+        if (wined3d_stateblock_decref(stateblock))
+            FIXME("Something's still holding the stateblock.\n");
+
         for (i = 0; i < sizeof(device->multistate_funcs) / sizeof(device->multistate_funcs[0]); ++i)
         {
             HeapFree(GetProcessHeap(), 0, device->multistate_funcs[i]);
@@ -1214,18 +1225,6 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device,
     if (!device->adapter->opengl)
         return WINED3DERR_INVALIDCALL;
 
-    TRACE("Creating stateblock.\n");
-    hr = wined3d_stateblock_create(device, WINED3DSBT_INIT, &device->stateBlock);
-    if (FAILED(hr))
-    {
-        WARN("Failed to create stateblock\n");
-        goto err_out;
-    }
-
-    TRACE("Created stateblock %p.\n", device->stateBlock);
-    device->updateStateBlock = device->stateBlock;
-    wined3d_stateblock_incref(device->updateStateBlock);
-
     device->valid_rt_mask = 0;
     for (i = 0; i < gl_info->limits.buffers; ++i)
         device->valid_rt_mask |= (1 << i);
@@ -1360,11 +1359,6 @@ err_out:
     device->swapchain_count = 0;
     if (swapchain)
         wined3d_swapchain_decref(swapchain);
-    if (device->stateBlock)
-    {
-        wined3d_stateblock_decref(device->stateBlock);
-        device->stateBlock = NULL;
-    }
     if (device->blit_priv)
         device->blitter->free_private(device);
     if (device->fragment_priv)
@@ -1472,23 +1466,6 @@ HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device)
         device->depth_blt_texture = 0;
     }
 
-    /* Release the update stateblock */
-    if (wined3d_stateblock_decref(device->updateStateBlock))
-    {
-        if (device->updateStateBlock != device->stateBlock)
-            FIXME("Something's still holding the update stateblock.\n");
-    }
-    device->updateStateBlock = NULL;
-
-    {
-        struct wined3d_stateblock *stateblock = device->stateBlock;
-        device->stateBlock = NULL;
-
-        /* Release the stateblock */
-        if (wined3d_stateblock_decref(stateblock))
-            FIXME("Something's still holding the stateblock.\n");
-    }
-
     /* Destroy the shader backend. Note that this has to happen after all shaders are destroyed. */
     device->blitter->free_private(device);
     device->frag_pipe->free_private(device);
@@ -5980,6 +5957,22 @@ HRESULT device_init(struct wined3d_device *device, struct wined3d *wined3d,
     }
     device->blitter = adapter->blitter;
 
+    hr = wined3d_stateblock_create(device, WINED3DSBT_INIT, &device->stateBlock);
+    if (FAILED(hr))
+    {
+        WARN("Failed to create stateblock.\n");
+        for (i = 0; i < sizeof(device->multistate_funcs) / sizeof(device->multistate_funcs[0]); ++i)
+        {
+            HeapFree(GetProcessHeap(), 0, device->multistate_funcs[i]);
+        }
+        wined3d_decref(device->wined3d);
+        return hr;
+    }
+
+    TRACE("Created stateblock %p.\n", device->stateBlock);
+    device->updateStateBlock = device->stateBlock;
+    wined3d_stateblock_incref(device->updateStateBlock);
+
     return WINED3D_OK;
 }
 
-- 
1.7.3.4




More information about the wine-patches mailing list