Henri Verbeet : wined3d: Cleanup device_resource_released().

Alexandre Julliard julliard at winehq.org
Wed Aug 18 12:09:54 CDT 2010


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Aug 17 19:03:28 2010 +0200

wined3d: Cleanup device_resource_released().

In particular, releasing a resource that's in use by the device or the
stateblock is always an internal error in either wined3d or the relevant
wined3d client library.

---

 dlls/wined3d/device.c |  132 +++++++++++++++++++++++++------------------------
 1 files changed, 67 insertions(+), 65 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 9651b51..8790046 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -6538,100 +6538,102 @@ static void device_resource_remove(IWineD3DDeviceImpl *This, IWineD3DResource *r
     list_remove(&((IWineD3DResourceImpl *) resource)->resource.resource_list_entry);
 }
 
-void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource)
+void device_resource_released(IWineD3DDeviceImpl *device, IWineD3DResource *resource)
 {
     WINED3DRESOURCETYPE type = IWineD3DResource_GetType(resource);
-    int counter;
+    unsigned int i;
 
-    TRACE("(%p) : resource %p\n", This, resource);
+    TRACE("device %p, resource %p, type %s.\n", device, resource, debug_d3dresourcetype(type));
 
-    context_resource_released(This, resource, type);
+    context_resource_released(device, resource, type);
 
-    switch (type) {
-        /* TODO: check front and back buffers, rendertargets etc..  possibly swapchains? */
-        case WINED3DRTYPE_SURFACE: {
-            unsigned int i;
+    switch (type)
+    {
+        case WINED3DRTYPE_SURFACE:
+            if (!device->d3d_initialized) break;
 
-            if (This->d3d_initialized)
+            for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i)
             {
-                for (i = 0; i < This->adapter->gl_info.limits.buffers; ++i)
+                if (device->render_targets[i] == (IWineD3DSurfaceImpl *)resource)
                 {
-                    if (This->render_targets[i] == (IWineD3DSurfaceImpl *)resource)
-                        This->render_targets[i] = NULL;
+                    ERR("Surface %p is still in use as render target %u.\n", resource, i);
+                    device->render_targets[i] = NULL;
                 }
-                if (This->depth_stencil == (IWineD3DSurfaceImpl *)resource)
-                    This->depth_stencil = NULL;
             }
 
+            if (device->depth_stencil == (IWineD3DSurfaceImpl *)resource)
+            {
+                ERR("Surface %p is still in use as depth/stencil buffer.\n", resource);
+                device->depth_stencil = NULL;
+            }
             break;
-        }
+
         case WINED3DRTYPE_TEXTURE:
         case WINED3DRTYPE_CUBETEXTURE:
         case WINED3DRTYPE_VOLUMETEXTURE:
-                for (counter = 0; counter < MAX_COMBINED_SAMPLERS; counter++) {
-                    if (This->stateBlock != NULL && This->stateBlock->textures[counter] == (IWineD3DBaseTexture *)resource) {
-                        WARN("Texture being released is still by a stateblock, Stage = %u Texture = %p\n", counter, resource);
-                        This->stateBlock->textures[counter] = NULL;
-                    }
-                    if (This->updateStateBlock != This->stateBlock ){
-                        if (This->updateStateBlock->textures[counter] == (IWineD3DBaseTexture *)resource) {
-                            WARN("Texture being released is still by a stateblock, Stage = %u Texture = %p\n", counter, resource);
-                            This->updateStateBlock->textures[counter] = NULL;
-                        }
-                    }
+            for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i)
+            {
+                if (device->stateBlock && device->stateBlock->textures[i] == (IWineD3DBaseTexture *)resource)
+                {
+                    ERR("Texture %p is still in use by stateblock %p, stage %u.\n",
+                            resource, device->stateBlock, i);
+                    device->stateBlock->textures[i] = NULL;
                 }
-        break;
-        case WINED3DRTYPE_VOLUME:
-        /* TODO: nothing really? */
-        break;
+
+                if (device->updateStateBlock != device->stateBlock
+                        && device->updateStateBlock->textures[i] == (IWineD3DBaseTexture *)resource)
+                {
+                    ERR("Texture %p is still in use by stateblock %p, stage %u.\n",
+                            resource, device->updateStateBlock, i);
+                    device->updateStateBlock->textures[i] = NULL;
+                }
+            }
+            break;
+
         case WINED3DRTYPE_BUFFER:
-        {
-            int streamNumber;
-            TRACE("Cleaning up stream pointers\n");
-
-            for(streamNumber = 0; streamNumber < MAX_STREAMS; streamNumber ++){
-                /* FINDOUT: should a warn be generated if were recording and updateStateBlock->streamSource is lost?
-                FINDOUT: should changes.streamSource[StreamNumber] be set ?
-                */
-                if (This->updateStateBlock != NULL ) { /* ==NULL when device is being destroyed */
-                    if ((IWineD3DResource *)This->updateStateBlock->streamSource[streamNumber] == resource) {
-                        FIXME("Vertex buffer released while bound to a state block, stream %d\n", streamNumber);
-                        This->updateStateBlock->streamSource[streamNumber] = 0;
-                        /* Set changed flag? */
-                    }
+            for (i = 0; i < MAX_STREAMS; ++i)
+            {
+                if (device->stateBlock && device->stateBlock->streamSource[i] == (IWineD3DBuffer *)resource)
+                {
+                    ERR("Buffer %p is still in use by stateblock %p, stream %u.\n",
+                            resource, device->stateBlock, i);
+                    device->stateBlock->streamSource[i] = NULL;
                 }
-                if (This->stateBlock != NULL ) { /* only happens if there is an error in the application, or on reset/release (because we don't manage internal tracking properly) */
-                    if ((IWineD3DResource *)This->stateBlock->streamSource[streamNumber] == resource) {
-                        TRACE("Vertex buffer released while bound to a state block, stream %d\n", streamNumber);
-                        This->stateBlock->streamSource[streamNumber] = 0;
-                    }
+
+                if (device->updateStateBlock != device->stateBlock
+                        && device->updateStateBlock->streamSource[i] == (IWineD3DBuffer *)resource)
+                {
+                    ERR("Buffer %p is still in use by stateblock %p, stream %u.\n",
+                            resource, device->updateStateBlock, i);
+                    device->updateStateBlock->streamSource[i] = NULL;
                 }
+
             }
 
-            if (This->updateStateBlock != NULL ) { /* ==NULL when device is being destroyed */
-                if (This->updateStateBlock->pIndexData == (IWineD3DBuffer *)resource) {
-                    This->updateStateBlock->pIndexData =  NULL;
-                }
+            if (device->stateBlock && device->stateBlock->pIndexData == (IWineD3DBuffer *)resource)
+            {
+                ERR("Buffer %p is still in use by stateblock %p as index buffer.\n",
+                        resource, device->stateBlock);
+                device->stateBlock->pIndexData =  NULL;
             }
-            if (This->stateBlock != NULL ) { /* ==NULL when device is being destroyed */
-                if (This->stateBlock->pIndexData == (IWineD3DBuffer *)resource) {
-                    This->stateBlock->pIndexData =  NULL;
-                }
+
+            if (device->updateStateBlock != device->stateBlock
+                    && device->updateStateBlock->pIndexData == (IWineD3DBuffer *)resource)
+            {
+                ERR("Buffer %p is still in use by stateblock %p as index buffer.\n",
+                        resource, device->updateStateBlock);
+                device->updateStateBlock->pIndexData =  NULL;
             }
-        }
-        break;
+            break;
 
         default:
-        FIXME("(%p) unknown resource type %p %u\n", This, resource, IWineD3DResource_GetType(resource));
-        break;
+            break;
     }
 
-
     /* Remove the resource from the resourceStore */
-    device_resource_remove(This, resource);
-
-    TRACE("Resource released\n");
+    device_resource_remove(device, resource);
 
+    TRACE("Resource released.\n");
 }
 
 static HRESULT WINAPI IWineD3DDeviceImpl_EnumResources(IWineD3DDevice *iface, D3DCB_ENUMRESOURCES pCallback, void *pData) {




More information about the wine-cvs mailing list