[PATCH 1/6] wined3d: Move volume sysmem allocation into a separate function

Stefan Dösinger stefan at codeweavers.com
Thu Aug 22 16:22:45 CDT 2013


---
 dlls/wined3d/volume.c | 46 ++++++++++++++++++++++++++++++----------------
 1 file changed, 30 insertions(+), 16 deletions(-)

diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c
index 8ef841d..e2adf05 100644
--- a/dlls/wined3d/volume.c
+++ b/dlls/wined3d/volume.c
@@ -203,6 +203,19 @@ void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context *
     wined3d_volume_load_location(volume, context, WINED3D_LOCATION_TEXTURE_RGB);
 }
 
+static BOOL volume_prepare_system_memory(struct wined3d_volume *volume)
+{
+    if (volume->resource.allocatedMemory)
+        return TRUE;
+
+    volume->resource.heap_memory = wined3d_resource_allocate_sysmem(volume->resource.size);
+    if (!volume->resource.heap_memory)
+        return FALSE;
+    volume->resource.allocatedMemory = volume->resource.heap_memory;
+    return TRUE;
+}
+
+
 static void volume_unload(struct wined3d_resource *resource)
 {
     struct wined3d_volume *volume = volume_from_resource(resource);
@@ -214,13 +227,19 @@ static void volume_unload(struct wined3d_resource *resource)
 
     TRACE("texture %p.\n", resource);
 
-    context = context_acquire(device, NULL);
-
-    wined3d_volume_load_location(volume, context, WINED3D_LOCATION_SYSMEM);
-
-    context_release(context);
-
-    wined3d_volume_invalidate_location(volume, ~WINED3D_LOCATION_SYSMEM);
+    if (volume_prepare_system_memory(volume))
+    {
+        context = context_acquire(device, NULL);
+        wined3d_volume_load_location(volume, context, WINED3D_LOCATION_SYSMEM);
+        context_release(context);
+        wined3d_volume_invalidate_location(volume, ~WINED3D_LOCATION_SYSMEM);
+    }
+    else
+    {
+        ERR("Out of memory when unloading volume %p.\n", volume);
+        wined3d_volume_validate_location(volume, WINED3D_LOCATION_DISCARDED);
+        wined3d_volume_invalidate_location(volume, ~WINED3D_LOCATION_DISCARDED);
+    }
 
     /* The texture name is managed by the container. */
     volume->flags &= ~WINED3D_VFLAG_ALLOCATED;
@@ -306,16 +325,11 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume,
     TRACE("volume %p, map_desc %p, box %p, flags %#x.\n",
             volume, map_desc, box, flags);
 
-    if (!volume->resource.allocatedMemory)
+    if (!volume_prepare_system_memory(volume))
     {
-        volume->resource.heap_memory = wined3d_resource_allocate_sysmem(volume->resource.size);
-        if (!volume->resource.heap_memory)
-        {
-            WARN("Out of memory.\n");
-            map_desc->data = NULL;
-            return E_OUTOFMEMORY;
-        }
-        volume->resource.allocatedMemory = volume->resource.heap_memory;
+        WARN("Out of memory.\n");
+        map_desc->data = NULL;
+        return E_OUTOFMEMORY;
     }
 
     if (!(volume->locations & WINED3D_LOCATION_SYSMEM))
-- 
1.8.1.5




More information about the wine-patches mailing list