From 9092f557d1412c855b4d4fe3d50c5b8e2b6c99ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Sun, 19 Aug 2007 20:42:29 +0200 Subject: [PATCH] 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 6b537296788..d83061d721f 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 0362053a32b..5b50e0fd97e 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]);