Stefan Dösinger : wined3d: Non-primary stateblocks hold an internal reference on indexbuffers.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Aug 27 13:57:13 CDT 2007


Module: wine
Branch: master
Commit: 9092f557d1412c855b4d4fe3d50c5b8e2b6c99ba
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9092f557d1412c855b4d4fe3d50c5b8e2b6c99ba

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Sun Aug 19 20:42:29 2007 +0200

wined3d: Non-primary stateblocks hold an internal reference on indexbuffers.

---

 dlls/wined3d/device.c     |    7 +++++++
 dlls/wined3d/stateblock.c |   12 +++++++++---
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 6b53729..d83061d 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -519,6 +519,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface,
                 IWineD3DVertexBuffer_AddRef(object->streamSource[i]);
             }
         }
+        if(object->pIndexData) {
+            IWineD3DIndexBuffer_AddRef(object->pIndexData);
+        }
 
     } else if (Type == WINED3DSBT_PIXELSTATE) {
 
@@ -572,6 +575,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface,
         for(i = 0; i < MAX_STREAMS; i++) {
             object->streamSource[i] = NULL;
         }
+        object->pIndexData = NULL;
 
     } else if (Type == WINED3DSBT_VERTEXSTATE) {
 
@@ -632,6 +636,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface,
                 IWineD3DVertexBuffer_AddRef(object->streamSource[i]);
             }
         }
+        object->pIndexData = NULL;
     } else {
         FIXME("Unrecognized state block type %d\n", Type);
     }
@@ -2821,6 +2826,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetIndices(IWineD3DDevice *iface, IWine
     /* Handle recording of state blocks */
     if (This->isRecordingState) {
         TRACE("Recording... not performing anything\n");
+        if(pIndexData) IWineD3DIndexBuffer_AddRef(pIndexData);
+        if(oldIdxs) IWineD3DIndexBuffer_Release(oldIdxs);
         return WINED3D_OK;
     }
 
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 0362053..5b50e0f 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -262,7 +262,6 @@ static ULONG  WINAPI IWineD3DStateBlockImpl_Release(IWineD3DStateBlock *iface) {
                     }
                 }
             }
-            if(This->pIndexData) IWineD3DIndexBuffer_Release(This->pIndexData);
         }
 
         for (counter = 0; counter < MAX_STREAMS; counter++) {
@@ -272,6 +271,7 @@ static ULONG  WINAPI IWineD3DStateBlockImpl_Release(IWineD3DStateBlock *iface) {
                 }
             }
         }
+        if(This->pIndexData) IWineD3DIndexBuffer_Release(This->pIndexData);
 
         for(counter = 0; counter < LIGHTMAP_SIZE; counter++) {
             struct list *e1, *e2;
@@ -488,7 +488,9 @@ static HRESULT  WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface)
         if (This->changed.indices && ((This->pIndexData != targetStateBlock->pIndexData)
                         || (This->baseVertexIndex != targetStateBlock->baseVertexIndex))) {
             TRACE("Updating pindexData to %p, baseVertexIndex to %d\n",
-            targetStateBlock->pIndexData, targetStateBlock->baseVertexIndex);
+                  targetStateBlock->pIndexData, targetStateBlock->baseVertexIndex);
+            if(targetStateBlock->pIndexData) IWineD3DIndexBuffer_AddRef(targetStateBlock->pIndexData);
+            if(This->pIndexData) IWineD3DIndexBuffer_Release(This->pIndexData);
             This->pIndexData = targetStateBlock->pIndexData;
             This->baseVertexIndex = targetStateBlock->baseVertexIndex;
         }
@@ -604,7 +606,6 @@ static HRESULT  WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface)
         memcpy(This->streamOffset, targetStateBlock->streamOffset, sizeof(This->streamOffset));
         memcpy(This->streamFreq, targetStateBlock->streamFreq, sizeof(This->streamFreq));
         memcpy(This->streamFlags, targetStateBlock->streamFlags, sizeof(This->streamFlags));
-        This->pIndexData = targetStateBlock->pIndexData;
         This->baseVertexIndex = targetStateBlock->baseVertexIndex;
         memcpy(This->transforms, targetStateBlock->transforms, sizeof(This->transforms));
         record_lights(This, targetStateBlock);
@@ -623,6 +624,11 @@ static HRESULT  WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface)
         memcpy(This->samplerState, targetStateBlock->samplerState, sizeof(This->samplerState));
         This->scissorRect = targetStateBlock->scissorRect;
 
+        if(targetStateBlock->pIndexData != This->pIndexData) {
+            if(targetStateBlock->pIndexData) IWineD3DIndexBuffer_AddRef(targetStateBlock->pIndexData);
+            if(This->pIndexData) IWineD3DIndexBuffer_Release(This->pIndexData);
+            This->pIndexData = targetStateBlock->pIndexData;
+        }
         for(i = 0; i < MAX_STREAMS; i++) {
             if(targetStateBlock->streamSource[i] != This->streamSource[i]) {
                 if(targetStateBlock->streamSource[i]) IWineD3DVertexBuffer_AddRef(targetStateBlock->streamSource[i]);




More information about the wine-cvs mailing list