[PATCH 2/5] wined3d: Set resource bindings to NULL before releasing them on stateblock destruction.

Henri Verbeet hverbeet at codeweavers.com
Mon Apr 18 17:07:57 CDT 2011


To prevent ERRs from device_resource_released().
---
 dlls/wined3d/stateblock.c |   22 +++++++++++++++++-----
 1 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 6e662e3..27b9831 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -474,6 +474,7 @@ ULONG CDECL wined3d_stateblock_decref(struct wined3d_stateblock *stateblock)
 
     if (!refcount)
     {
+        struct wined3d_buffer *buffer;
         int counter;
 
         if (stateblock->state.vertex_declaration)
@@ -481,23 +482,34 @@ ULONG CDECL wined3d_stateblock_decref(struct wined3d_stateblock *stateblock)
 
         for (counter = 0; counter < MAX_COMBINED_SAMPLERS; counter++)
         {
-            if (stateblock->state.textures[counter])
-                wined3d_texture_decref(stateblock->state.textures[counter]);
+            struct wined3d_texture *texture = stateblock->state.textures[counter];
+            if (texture)
+            {
+                stateblock->state.textures[counter] = NULL;
+                wined3d_texture_decref(texture);
+            }
         }
 
         for (counter = 0; counter < MAX_STREAMS; ++counter)
         {
-            struct wined3d_buffer *buffer = stateblock->state.streams[counter].buffer;
+            buffer = stateblock->state.streams[counter].buffer;
             if (buffer)
             {
+                stateblock->state.streams[counter].buffer = NULL;
                 if (wined3d_buffer_decref(buffer))
                 {
                     WARN("Buffer %p still referenced by stateblock, stream %u.\n", buffer, counter);
                 }
             }
         }
-        if (stateblock->state.index_buffer)
-            wined3d_buffer_decref(stateblock->state.index_buffer);
+
+        buffer = stateblock->state.index_buffer;
+        if (buffer)
+        {
+            stateblock->state.index_buffer = NULL;
+            wined3d_buffer_decref(buffer);
+        }
+
         if (stateblock->state.vertex_shader)
             wined3d_shader_decref(stateblock->state.vertex_shader);
         if (stateblock->state.pixel_shader)
-- 
1.7.3.4




More information about the wine-patches mailing list