[PATCH 2/5] wined3d: Merge wined3d_buffer_gl_unmap() and buffer_resource_sub_resource_unmap().

Henri Verbeet hverbeet at codeweavers.com
Tue Sep 24 09:20:41 CDT 2019


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/wined3d/buffer.c | 91 ++++++++++++++++++++++++---------------------------
 1 file changed, 43 insertions(+), 48 deletions(-)

diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 9566d1c4409..b8f985e8e4c 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -1104,64 +1104,71 @@ static HRESULT buffer_resource_sub_resource_map(struct wined3d_resource *resourc
     return WINED3D_OK;
 }
 
-static void wined3d_buffer_gl_unmap(struct wined3d_buffer_gl *buffer_gl)
+static HRESULT buffer_resource_sub_resource_unmap(struct wined3d_resource *resource, unsigned int sub_resource_idx)
 {
-    ULONG i;
+    struct wined3d_buffer *buffer = buffer_from_resource(resource);
+    unsigned int range_count = buffer->modified_areas;
+    struct wined3d_device *device = resource->device;
+    struct wined3d_context *context;
+    struct wined3d_bo_address addr;
+
+    TRACE("resource %p, sub_resource_idx %u.\n", resource, sub_resource_idx);
 
-    TRACE("buffer_gl %p.\n", buffer_gl);
+    if (sub_resource_idx)
+    {
+        WARN("Invalid sub_resource_idx %u.\n", sub_resource_idx);
+        return E_INVALIDARG;
+    }
 
-    /* In the case that the number of Unmap calls > the
-     * number of Map calls, d3d returns always D3D_OK.
-     * This is also needed to prevent Map from returning garbage on
-     * the next call (this will happen if the lock_count is < 0). */
-    if (!buffer_gl->b.resource.map_count)
+    if (!resource->map_count)
     {
         WARN("Unmap called without a previous map call.\n");
-        return;
+        return WINED3D_OK;
     }
 
-    if (--buffer_gl->b.resource.map_count)
+    if (--resource->map_count)
     {
-        /* Delay loading the buffer until everything is unlocked */
+        /* Delay loading the buffer until everything is unmapped. */
         TRACE("Ignoring unmap.\n");
-        return;
+        return WINED3D_OK;
     }
 
-    if (buffer_gl->b.map_ptr)
+    if (!buffer->map_ptr)
+        return WINED3D_OK;
+
+    context = context_acquire(device, NULL, 0);
+
+    if (buffer->flags & WINED3D_BUFFER_APPLESYNC)
     {
-        struct wined3d_device *device = buffer_gl->b.resource.device;
-        unsigned int range_count = buffer_gl->b.modified_areas;
-        const struct wined3d_gl_info *gl_info;
         struct wined3d_context_gl *context_gl;
-        struct wined3d_context *context;
-        struct wined3d_bo_address addr;
+        const struct wined3d_gl_info *gl_info;
+        struct wined3d_buffer_gl *buffer_gl;
+        unsigned int i;
 
-        context = context_acquire(device, NULL, 0);
+        buffer_gl = wined3d_buffer_gl(buffer);
         context_gl = wined3d_context_gl(context);
         gl_info = context_gl->gl_info;
 
-        if (buffer_gl->b.flags & WINED3D_BUFFER_APPLESYNC)
+        wined3d_buffer_gl_bind(buffer_gl, context_gl);
+        for (i = 0; i < range_count; ++i)
         {
-            wined3d_buffer_gl_bind(buffer_gl, context_gl);
-            for (i = 0; i < range_count; ++i)
-            {
-                GL_EXTCALL(glFlushMappedBufferRangeAPPLE(buffer_gl->buffer_type_hint,
-                        buffer_gl->b.maps[i].offset, buffer_gl->b.maps[i].size));
-                checkGLcall("glFlushMappedBufferRangeAPPLE");
-            }
-            range_count = 0;
+            GL_EXTCALL(glFlushMappedBufferRangeAPPLE(buffer_gl->buffer_type_hint,
+                    buffer->maps[i].offset, buffer->maps[i].size));
+            checkGLcall("glFlushMappedBufferRangeAPPLE");
         }
+        range_count = 0;
+    }
 
-        addr.buffer_object = buffer_gl->b.buffer_object;
-        addr.addr = 0;
-        wined3d_context_unmap_bo_address(context, &addr,
-                buffer_gl->b.resource.bind_flags, range_count, buffer_gl->b.maps);
+    addr.buffer_object = buffer->buffer_object;
+    addr.addr = 0;
+    wined3d_context_unmap_bo_address(context, &addr, resource->bind_flags, range_count, buffer->maps);
 
-        context_release(context);
+    context_release(context);
 
-        buffer_clear_dirty_areas(&buffer_gl->b);
-        buffer_gl->b.map_ptr = NULL;
-    }
+    buffer_clear_dirty_areas(buffer);
+    buffer->map_ptr = NULL;
+
+    return WINED3D_OK;
 }
 
 void wined3d_buffer_copy(struct wined3d_buffer *dst_buffer, unsigned int dst_offset,
@@ -1249,18 +1256,6 @@ static void buffer_resource_preload(struct wined3d_resource *resource)
     context_release(context);
 }
 
-static HRESULT buffer_resource_sub_resource_unmap(struct wined3d_resource *resource, unsigned int sub_resource_idx)
-{
-    if (sub_resource_idx)
-    {
-        WARN("Invalid sub_resource_idx %u.\n", sub_resource_idx);
-        return E_INVALIDARG;
-    }
-
-    wined3d_buffer_gl_unmap(wined3d_buffer_gl(buffer_from_resource(resource)));
-    return WINED3D_OK;
-}
-
 static const struct wined3d_resource_ops buffer_resource_ops =
 {
     buffer_resource_incref,
-- 
2.11.0




More information about the wine-devel mailing list