Henri Verbeet : wined3d: Make buffer_add_dirty_area() never fail.

Alexandre Julliard julliard at winehq.org
Thu Aug 15 13:12:46 CDT 2013


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Aug 13 08:51:45 2013 +0200

wined3d: Make buffer_add_dirty_area() never fail.

---

 dlls/wined3d/buffer.c |   94 +++++++++++++++++++++---------------------------
 1 files changed, 41 insertions(+), 53 deletions(-)

diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 3f692e2..f2ba88e 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -34,41 +34,43 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
 #define VB_MAXFULLCONVERSIONS 5       /* Number of full conversions before we stop converting */
 #define VB_RESETFULLCONVS     20      /* Reset full conversion counts after that number of draws */
 
-static inline BOOL buffer_add_dirty_area(struct wined3d_buffer *This, UINT offset, UINT size)
+static void buffer_add_dirty_area(struct wined3d_buffer *buffer, UINT offset, UINT size)
 {
-    if (!This->buffer_object) return TRUE;
+    if (!buffer->buffer_object)
+        return;
 
-    if (This->maps_size <= This->modified_areas)
-    {
-        void *new = HeapReAlloc(GetProcessHeap(), 0, This->maps,
-                                This->maps_size * 2 * sizeof(*This->maps));
-        if (!new)
-        {
-            ERR("Out of memory\n");
-            return FALSE;
-        }
-        else
-        {
-            This->maps = new;
-            This->maps_size *= 2;
-        }
-    }
+    if (!offset && !size)
+        goto invalidate_all;
 
-    if(offset > This->resource.size || offset + size > This->resource.size)
+    if (offset > buffer->resource.size || offset + size > buffer->resource.size)
     {
-        WARN("Invalid range dirtified, marking entire buffer dirty\n");
-        offset = 0;
-        size = This->resource.size;
+        WARN("Invalid range specified, invalidating entire buffer.\n");
+        goto invalidate_all;
     }
-    else if(!offset && !size)
+
+    if (buffer->modified_areas >= buffer->maps_size)
     {
-        size = This->resource.size;
+        struct wined3d_map_range *new;
+
+        if (!(new = HeapReAlloc(GetProcessHeap(), 0, buffer->maps, 2 * buffer->maps_size * sizeof(*buffer->maps))))
+        {
+            ERR("Failed to allocate maps array, invalidating entire buffer.\n");
+            goto invalidate_all;
+        }
+
+        buffer->maps = new;
+        buffer->maps_size *= 2;
     }
 
-    This->maps[This->modified_areas].offset = offset;
-    This->maps[This->modified_areas].size = size;
-    This->modified_areas++;
-    return TRUE;
+    buffer->maps[buffer->modified_areas].offset = offset;
+    buffer->maps[buffer->modified_areas].size = size;
+    ++buffer->modified_areas;
+    return;
+
+invalidate_all:
+    buffer->modified_areas = 1;
+    buffer->maps[0].offset = 0;
+    buffer->maps[0].size = buffer->resource.size;
 }
 
 static inline void buffer_clear_dirty_areas(struct wined3d_buffer *This)
@@ -184,13 +186,9 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This, const struc
     This->buffer_object_size = This->resource.size;
     This->buffer_object_usage = gl_usage;
 
-    if(This->flags & WINED3D_BUFFER_DOUBLEBUFFER)
+    if (This->flags & WINED3D_BUFFER_DOUBLEBUFFER)
     {
-        if(!buffer_add_dirty_area(This, 0, 0))
-        {
-            ERR("buffer_add_dirty_area failed, this is not expected\n");
-            goto fail;
-        }
+        buffer_add_dirty_area(This, 0, 0);
     }
     else
     {
@@ -808,14 +806,10 @@ void CDECL wined3d_buffer_preload(struct wined3d_buffer *buffer)
             return;
         }
 
-        /* The declaration changed, reload the whole buffer */
-        WARN("Reloading buffer because of decl change\n");
-        buffer_clear_dirty_areas(buffer);
-        if (!buffer_add_dirty_area(buffer, 0, 0))
-        {
-            ERR("buffer_add_dirty_area failed, this is not expected\n");
-            return;
-        }
+        /* The declaration changed, reload the whole buffer. */
+        WARN("Reloading buffer because of a vertex declaration change.\n");
+        buffer_add_dirty_area(buffer, 0, 0);
+
         /* Avoid unfenced updates, we might overwrite more areas of the buffer than the application
          * cleared for unsynchronized updates
          */
@@ -996,20 +990,14 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN
     TRACE("buffer %p, offset %u, size %u, data %p, flags %#x\n", buffer, offset, size, data, flags);
 
     flags = buffer_sanitize_flags(buffer, flags);
+    /* DISCARD invalidates the entire buffer, regardless of the specified
+     * offset and size. Some applications also depend on the entire buffer
+     * being uploaded in that case. Two such applications are Port Royale
+     * and Darkstar One. */
     if (flags & WINED3D_MAP_DISCARD)
-    {
-        /* DISCARD invalidates the entire buffer, regardless of the specified
-         * offset and size. Some applications also depend on the entire buffer
-         * being uploaded in that case. Two such applications are Port Royale
-         * and Darkstar One. */
-        if (!buffer_add_dirty_area(buffer, 0, 0))
-            return E_OUTOFMEMORY;
-    }
+        buffer_add_dirty_area(buffer, 0, 0);
     else if (!(flags & WINED3D_MAP_READONLY))
-    {
-        if (!buffer_add_dirty_area(buffer, offset, size))
-            return E_OUTOFMEMORY;
-    }
+        buffer_add_dirty_area(buffer, offset, size);
 
     count = ++buffer->resource.map_count;
 




More information about the wine-cvs mailing list