WINED3D: Update refcounts when storing references in IWineD3DStateBlockImpl_Capture

H. Verbeet hverbeet at gmail.com
Sun Feb 5 13:49:57 CST 2006


IWineD3DStateBlockImpl_Capture stores references to objects, but
doesn't update their reference counts. Sometimes that causes objects
to be freed prematurely or not at all. This patch fixes the problem
for shaders and vertexdeclarations. However, there are probably other
objects that should be fixed as well.

Changelog:
  - Update refcounts when storing references in IWineD3DStateBlockImpl_Capture
  - Move TRACEs to the top of their code blocks.
-------------- next part --------------
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index c1e3e94..1ef2a52 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -148,8 +148,16 @@ HRESULT WINAPI IWineD3DStateBlockImpl_Ca
 
         /* Recorded => Only update 'changed' values */
         if (This->vertexShader != targetStateBlock->vertexShader) {
+            TRACE("Updating vertex shader from %p to %p\n", This->vertexShader, targetStateBlock->vertexShader);
+
+            if (targetStateBlock->vertexShader) {
+                IWineD3DVertexShader_AddRef(targetStateBlock->vertexShader);
+            }
+            if (This->vertexShader) {
+                IWineD3DVertexShader_Release(This->vertexShader);
+            }
+
             This->vertexShader = targetStateBlock->vertexShader;
-            TRACE("Updating vertex shader to %p\n", targetStateBlock->vertexShader);
         }
 
         /* Vertex Shader Constants */
@@ -204,8 +212,16 @@ HRESULT WINAPI IWineD3DStateBlockImpl_Ca
 
         /* Recorded => Only update 'changed' values */
         if (This->pixelShader != targetStateBlock->pixelShader) {
+            TRACE("Updating pixel shader from %p to %p\n", This->pixelShader, targetStateBlock->pixelShader);
+
+            if (targetStateBlock->pixelShader) {
+                IWineD3DPixelShader_AddRef(targetStateBlock->pixelShader);
+            }
+            if (This->pixelShader) {
+                IWineD3DPixelShader_Release(This->pixelShader);
+            }
+
             This->pixelShader = targetStateBlock->pixelShader;
-            TRACE("Updating pixrl shader to %p\n", targetStateBlock->pixelShader);
         }
 
         /* Pixel Shader Constants */
@@ -244,6 +260,15 @@ HRESULT WINAPI IWineD3DStateBlockImpl_Ca
         }
 
         if(This->set.vertexDecl && This->vertexDecl != targetStateBlock->vertexDecl){
+            TRACE("Updating vertex declaration from %p to %p\n", This->vertexDecl, targetStateBlock->vertexDecl);
+
+            if (targetStateBlock->vertexDecl) {
+                IWineD3DVertexDeclaration_AddRef(targetStateBlock->vertexDecl);
+            }
+            if (This->vertexDecl) {
+                IWineD3DVertexDeclaration_Release(This->vertexDecl);
+            }
+
             This->vertexDecl = targetStateBlock->vertexDecl;
         }
 




More information about the wine-patches mailing list