[PATCH 1/5] wined3d: Merge wined3d_buffer_gl_map() and buffer_resource_sub_resource_map().

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


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

diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index b8c5117f89e..9566d1c4409 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -964,19 +964,40 @@ struct wined3d_resource * CDECL wined3d_buffer_get_resource(struct wined3d_buffe
     return &buffer->resource;
 }
 
-static HRESULT wined3d_buffer_gl_map(struct wined3d_buffer_gl *buffer_gl,
-        unsigned int offset, unsigned int size, BYTE **data, DWORD flags)
+static HRESULT buffer_resource_sub_resource_map(struct wined3d_resource *resource, unsigned int sub_resource_idx,
+        struct wined3d_map_desc *map_desc, const struct wined3d_box *box, uint32_t flags)
 {
-    struct wined3d_device *device = buffer_gl->b.resource.device;
+    struct wined3d_buffer *buffer = buffer_from_resource(resource);
+    struct wined3d_device *device = resource->device;
     struct wined3d_context *context;
+    unsigned int offset, size;
+    uint8_t *base;
     LONG count;
-    BYTE *base;
 
-    TRACE("buffer_gl %p, offset %u, size %u, data %p, flags %#x.\n", buffer_gl, offset, size, data, flags);
+    TRACE("resource %p, sub_resource_idx %u, map_desc %p, box %s, flags %#x.\n",
+            resource, sub_resource_idx, map_desc, debug_box(box), flags);
+
+    if (sub_resource_idx)
+    {
+        WARN("Invalid sub_resource_idx %u.\n", sub_resource_idx);
+        return E_INVALIDARG;
+    }
+
+    if (box)
+    {
+        offset = box->left;
+        size = box->right - box->left;
+    }
+    else
+    {
+        offset = size = 0;
+    }
+
+    map_desc->row_pitch = map_desc->slice_pitch = resource->size;
 
-    count = ++buffer_gl->b.resource.map_count;
+    count = ++resource->map_count;
 
-    if (buffer_gl->b.buffer_object)
+    if (buffer->buffer_object)
     {
         unsigned int dirty_offset = offset, dirty_size = size;
         struct wined3d_bo_address addr;
@@ -992,36 +1013,36 @@ static HRESULT wined3d_buffer_gl_map(struct wined3d_buffer_gl *buffer_gl,
         }
 
         if (((flags & WINED3D_MAP_WRITE) && !(flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_DISCARD)))
-                || (!(flags & WINED3D_MAP_WRITE) && (buffer_gl->b.locations & WINED3D_LOCATION_SYSMEM))
-                || buffer_gl->b.flags & WINED3D_BUFFER_PIN_SYSMEM)
+                || (!(flags & WINED3D_MAP_WRITE) && (buffer->locations & WINED3D_LOCATION_SYSMEM))
+                || buffer->flags & WINED3D_BUFFER_PIN_SYSMEM)
         {
-            if (!(buffer_gl->b.locations & WINED3D_LOCATION_SYSMEM))
+            if (!(buffer->locations & WINED3D_LOCATION_SYSMEM))
             {
                 context = context_acquire(device, NULL, 0);
-                wined3d_buffer_load_location(&buffer_gl->b, context, WINED3D_LOCATION_SYSMEM);
+                wined3d_buffer_load_location(buffer, context, WINED3D_LOCATION_SYSMEM);
                 context_release(context);
             }
 
             if (flags & WINED3D_MAP_WRITE)
-                wined3d_buffer_invalidate_range(&buffer_gl->b, WINED3D_LOCATION_BUFFER, dirty_offset, dirty_size);
+                wined3d_buffer_invalidate_range(buffer, WINED3D_LOCATION_BUFFER, dirty_offset, dirty_size);
         }
         else
         {
             context = context_acquire(device, NULL, 0);
 
             if (flags & WINED3D_MAP_DISCARD)
-                wined3d_buffer_validate_location(&buffer_gl->b, WINED3D_LOCATION_BUFFER);
+                wined3d_buffer_validate_location(buffer, WINED3D_LOCATION_BUFFER);
             else
-                wined3d_buffer_load_location(&buffer_gl->b, context, WINED3D_LOCATION_BUFFER);
+                wined3d_buffer_load_location(buffer, context, WINED3D_LOCATION_BUFFER);
 
             if (flags & WINED3D_MAP_WRITE)
             {
-                wined3d_buffer_invalidate_location(&buffer_gl->b, WINED3D_LOCATION_SYSMEM);
-                buffer_invalidate_bo_range(&buffer_gl->b, dirty_offset, dirty_size);
+                wined3d_buffer_invalidate_location(buffer, WINED3D_LOCATION_SYSMEM);
+                buffer_invalidate_bo_range(buffer, dirty_offset, dirty_size);
             }
 
-            if ((flags & WINED3D_MAP_DISCARD) && buffer_gl->b.resource.heap_memory)
-                wined3d_buffer_evict_sysmem(&buffer_gl->b);
+            if ((flags & WINED3D_MAP_DISCARD) && resource->heap_memory)
+                wined3d_buffer_evict_sysmem(buffer);
 
             if (count == 1)
             {
@@ -1032,40 +1053,39 @@ static HRESULT wined3d_buffer_gl_map(struct wined3d_buffer_gl *buffer_gl,
                  * buffer. The r600g driver only does this when the buffer is
                  * currently in use, while the proprietary NVIDIA driver
                  * appears to do this unconditionally. */
-                if (buffer_gl->b.flags & WINED3D_BUFFER_DISCARD)
+                if (buffer->flags & WINED3D_BUFFER_DISCARD)
                     flags &= ~WINED3D_MAP_DISCARD;
 
-                if (buffer_gl->b.flags & WINED3D_BUFFER_APPLESYNC)
-                    wined3d_buffer_gl_sync_apple(buffer_gl, flags, wined3d_context_gl(context));
+                if (buffer->flags & WINED3D_BUFFER_APPLESYNC)
+                    wined3d_buffer_gl_sync_apple(wined3d_buffer_gl(buffer), flags, wined3d_context_gl(context));
 
-                addr.buffer_object = buffer_gl->b.buffer_object;
+                addr.buffer_object = buffer->buffer_object;
                 addr.addr = 0;
-                buffer_gl->b.map_ptr = wined3d_context_map_bo_address(context, &addr,
-                        buffer_gl->b.resource.size, buffer_gl->b.resource.bind_flags, flags);
+                buffer->map_ptr = wined3d_context_map_bo_address(context,
+                        &addr, resource->size, resource->bind_flags, flags);
 
-                if (((DWORD_PTR)buffer_gl->b.map_ptr) & (RESOURCE_ALIGNMENT - 1))
+                if (((DWORD_PTR)buffer->map_ptr) & (RESOURCE_ALIGNMENT - 1))
                 {
-                    WARN("Pointer %p is not %u byte aligned.\n", buffer_gl->b.map_ptr, RESOURCE_ALIGNMENT);
+                    WARN("Pointer %p is not %u byte aligned.\n", buffer->map_ptr, RESOURCE_ALIGNMENT);
 
-                    wined3d_context_unmap_bo_address(context, &addr, buffer_gl->b.resource.bind_flags, 0, NULL);
-                    buffer_gl->b.map_ptr = NULL;
+                    wined3d_context_unmap_bo_address(context, &addr, resource->bind_flags, 0, NULL);
+                    buffer->map_ptr = NULL;
 
-                    if (buffer_gl->b.resource.usage & WINED3DUSAGE_DYNAMIC)
+                    if (resource->usage & WINED3DUSAGE_DYNAMIC)
                     {
-                        /* 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.
-                         */
+                        /* 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. */
                         TRACE("Dynamic buffer, dropping VBO.\n");
-                        wined3d_buffer_drop_bo(&buffer_gl->b);
+                        wined3d_buffer_drop_bo(buffer);
                     }
                     else
                     {
                         TRACE("Falling back to doublebuffered operation.\n");
-                        wined3d_buffer_load_location(&buffer_gl->b, context, WINED3D_LOCATION_SYSMEM);
-                        buffer_gl->b.flags |= WINED3D_BUFFER_PIN_SYSMEM;
+                        wined3d_buffer_load_location(buffer, context, WINED3D_LOCATION_SYSMEM);
+                        buffer->flags |= WINED3D_BUFFER_PIN_SYSMEM;
                     }
-                    TRACE("New pointer is %p.\n", buffer_gl->b.resource.heap_memory);
+                    TRACE("New pointer is %p.\n", resource->heap_memory);
                 }
             }
 
@@ -1073,14 +1093,13 @@ static HRESULT wined3d_buffer_gl_map(struct wined3d_buffer_gl *buffer_gl,
         }
 
         if (flags & WINED3D_MAP_DISCARD)
-            buffer_gl->b.flags |= WINED3D_BUFFER_DISCARD;
+            buffer->flags |= WINED3D_BUFFER_DISCARD;
     }
 
-    base = buffer_gl->b.map_ptr ? buffer_gl->b.map_ptr : buffer_gl->b.resource.heap_memory;
-    *data = base + offset;
+    base = buffer->map_ptr ? buffer->map_ptr : resource->heap_memory;
+    map_desc->data = base + offset;
 
-    TRACE("Returning memory at %p (base %p, offset %u).\n", *data, base, offset);
-    /* TODO: check Flags compatibility with buffer->currentDesc.Usage (see MSDN) */
+    TRACE("Returning memory at %p (base %p, offset %u).\n", map_desc->data, base, offset);
 
     return WINED3D_OK;
 }
@@ -1230,32 +1249,6 @@ static void buffer_resource_preload(struct wined3d_resource *resource)
     context_release(context);
 }
 
-static HRESULT buffer_resource_sub_resource_map(struct wined3d_resource *resource, unsigned int sub_resource_idx,
-        struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags)
-{
-    struct wined3d_buffer_gl *buffer_gl = wined3d_buffer_gl(buffer_from_resource(resource));
-    UINT offset, size;
-
-    if (sub_resource_idx)
-    {
-        WARN("Invalid sub_resource_idx %u.\n", sub_resource_idx);
-        return E_INVALIDARG;
-    }
-
-    if (box)
-    {
-        offset = box->left;
-        size = box->right - box->left;
-    }
-    else
-    {
-        offset = size = 0;
-    }
-
-    map_desc->row_pitch = map_desc->slice_pitch = resource->size;
-    return wined3d_buffer_gl_map(buffer_gl, offset, size, (BYTE **)&map_desc->data, flags);
-}
-
 static HRESULT buffer_resource_sub_resource_unmap(struct wined3d_resource *resource, unsigned int sub_resource_idx)
 {
     if (sub_resource_idx)
-- 
2.11.0




More information about the wine-devel mailing list