[PATCH 1/5] wined3d: Introduce wined3d_buffer_drop_bo() helper function.

Józef Kucia jkucia at codeweavers.com
Thu Jun 23 05:07:57 CDT 2016


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/wined3d/buffer.c | 51 ++++++++++++++++++++++++++-------------------------
 1 file changed, 26 insertions(+), 25 deletions(-)

diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 6f66b97..8adc2a1 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -540,6 +540,22 @@ static void buffer_unload(struct wined3d_resource *resource)
     resource_unload(resource);
 }
 
+static void wined3d_buffer_drop_bo(struct wined3d_buffer *buffer)
+{
+    struct wined3d_device *device = buffer->resource.device;
+
+    buffer->flags &= ~WINED3D_BUFFER_USE_BO;
+    buffer_unload(&buffer->resource);
+
+    /* The stream source state handler might have read the memory of
+     * the vertex buffer already and got the memory in the vbo which
+     * is not valid any longer. Dirtify the stream source to force a
+     * reload. This happens only once per changed vertexbuffer and
+     * should occur rather rarely. */
+    if (buffer->resource.bind_count)
+        device_invalidate_state(device, STATE_STREAMSRC);
+}
+
 ULONG CDECL wined3d_buffer_decref(struct wined3d_buffer *buffer)
 {
     ULONG refcount = InterlockedDecrement(&buffer->resource.ref);
@@ -789,17 +805,8 @@ void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_conte
         if (buffer->decl_change_count > VB_MAXDECLCHANGES
                 || (buffer->conversion_map && (buffer->resource.usage & WINED3DUSAGE_DYNAMIC)))
         {
-            FIXME("Too many declaration changes or converting dynamic buffer, stopping converting\n");
-
-            buffer->flags &= ~WINED3D_BUFFER_USE_BO;
-            buffer_unload(&buffer->resource);
-
-            /* The stream source state handler might have read the memory of
-             * the vertex buffer already and got the memory in the vbo which
-             * is not valid any longer. Dirtify the stream source to force a
-             * reload. This happens only once per changed vertexbuffer and
-             * should occur rather rarely. */
-            device_invalidate_state(device, STATE_STREAMSRC);
+            FIXME("Too many declaration changes or converting dynamic buffer, stopping converting.\n");
+            wined3d_buffer_drop_bo(buffer);
             return;
         }
 
@@ -824,10 +831,7 @@ void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_conte
             if (buffer->full_conversion_count > VB_MAXFULLCONVERSIONS)
             {
                 FIXME("Too many full buffer conversions, stopping converting.\n");
-                buffer->flags &= ~WINED3D_BUFFER_USE_BO;
-                buffer_unload(&buffer->resource);
-                if (buffer->resource.bind_count)
-                    device_invalidate_state(device, STATE_STREAMSRC);
+                wined3d_buffer_drop_bo(buffer);
                 return;
             }
         }
@@ -938,7 +942,7 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN
     LONG count;
     BYTE *base;
 
-    TRACE("buffer %p, offset %u, size %u, data %p, flags %#x\n", buffer, offset, size, data, flags);
+    TRACE("buffer %p, offset %u, size %u, data %p, flags %#x.\n", buffer, offset, size, data, flags);
 
     flags = wined3d_resource_sanitize_map_flags(&buffer->resource, flags);
     /* Filter redundant WINED3D_MAP_DISCARD maps. The 3DMark2001 multitexture
@@ -1003,17 +1007,14 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN
                     {
                         /* The extra copy is more expensive than not using VBOs at
                          * all on the Nvidia Linux driver, which is the only driver
-                         * that returns unaligned pointers
+                         * that returns unaligned pointers.
                          */
-                        TRACE("Dynamic buffer, dropping VBO\n");
-                        buffer->flags &= ~WINED3D_BUFFER_USE_BO;
-                        buffer_unload(&buffer->resource);
-                        if (buffer->resource.bind_count)
-                            device_invalidate_state(device, STATE_STREAMSRC);
+                        TRACE("Dynamic buffer, dropping VBO.\n");
+                        wined3d_buffer_drop_bo(buffer);
                     }
                     else
                     {
-                        TRACE("Falling back to doublebuffered operation\n");
+                        TRACE("Falling back to doublebuffered operation.\n");
                         buffer_get_sysmem(buffer, context);
                     }
                     TRACE("New pointer is %p.\n", buffer->resource.heap_memory);
@@ -1357,14 +1358,14 @@ HRESULT CDECL wined3d_buffer_create(struct wined3d_device *device, const struct
     struct wined3d_buffer *object;
     HRESULT hr;
 
-    TRACE("device %p, desc %p, data %p, parent %p, parent_ops %p, buffer %p\n",
+    TRACE("device %p, desc %p, data %p, parent %p, parent_ops %p, buffer %p.\n",
             device, desc, data, parent, parent_ops, buffer);
 
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
     if (!object)
         return E_OUTOFMEMORY;
 
-    FIXME("Ignoring access flags (pool)\n");
+    FIXME("Ignoring access flags (pool).\n");
 
     hr = buffer_init(object, device, desc->byte_width, desc->usage, WINED3DFMT_UNKNOWN,
             WINED3D_POOL_MANAGED, GL_ARRAY_BUFFER_ARB, data, parent, parent_ops);
-- 
2.7.3




More information about the wine-patches mailing list