diff options
author | Lars Norberg | 2018-03-26 22:40:54 +0200 |
---|---|---|
committer | Lars Norberg | 2018-03-26 22:40:54 +0200 |
commit | 60a34983d19f8aabe667b20cf951ab4dda41d293 (patch) | |
tree | fba2b8424435d5853781e875fa78e86c7aac32a8 /0006-wined3d-Perform-initial-allocation-of-persistent-buf.patch | |
parent | b9ee62f46a35e7eb1a40f0c7872e48f5ec776e82 (diff) | |
download | aur-60a34983d19f8aabe667b20cf951ab4dda41d293.tar.gz |
rebased wine-pba
Diffstat (limited to '0006-wined3d-Perform-initial-allocation-of-persistent-buf.patch')
-rw-r--r-- | 0006-wined3d-Perform-initial-allocation-of-persistent-buf.patch | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/0006-wined3d-Perform-initial-allocation-of-persistent-buf.patch b/0006-wined3d-Perform-initial-allocation-of-persistent-buf.patch new file mode 100644 index 000000000000..2777b6a5324e --- /dev/null +++ b/0006-wined3d-Perform-initial-allocation-of-persistent-buf.patch @@ -0,0 +1,92 @@ +From 71b7b3340d147bf7a9b5567c080b32ccd3a39dc6 Mon Sep 17 00:00:00 2001 +From: Andrew Comminos <andrew@comminos.com> +Date: Thu, 8 Mar 2018 22:42:03 -0800 +Subject: [PATCH 6/9] wined3d: Perform initial allocation of persistent buffers + asynchronously. + +--- + dlls/wined3d/buffer.c | 30 ++++++++++++++++++++---------- + 1 file changed, 20 insertions(+), 10 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index a2ac411b5e..c492fcc8c6 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -272,7 +272,7 @@ fail: + } + + /* Context activation is done by the caller. */ +-static BOOL buffer_alloc_persistent_map(struct wined3d_buffer *buffer, struct wined3d_context *context) ++static BOOL buffer_alloc_persistent_map(struct wined3d_buffer *buffer) + { + struct wined3d_device *device = buffer->resource.device; + struct wined3d_buffer_heap *heap; +@@ -688,7 +688,7 @@ static BOOL wined3d_buffer_prepare_location(struct wined3d_buffer *buffer, + WARN("Trying to map a persistent region for buffer %p without WINED3D_BUFFER_PERSISTENT.\n", buffer); + return FALSE; + } +- return buffer_alloc_persistent_map(buffer, context); ++ return buffer_alloc_persistent_map(buffer); + + default: + ERR("Invalid location %s.\n", wined3d_debug_location(location)); +@@ -1116,7 +1116,7 @@ static HRESULT wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UI + const struct wined3d_gl_info *gl_info; + context = context_acquire(device, NULL, 0); + +- FIXME_(d3d_perf)("Fences not used for persistent buffer maps on CS thread, using glFinish.\n"); ++ FIXME_(d3d_perf)("Fences not used for persistent buffer maps on CS thread, using glFinish (flags: %x)\n", flags); + + gl_info = context->gl_info; + gl_info->gl_ops.gl.p_glFinish(); +@@ -1394,8 +1394,20 @@ static HRESULT buffer_resource_sub_resource_map(struct wined3d_resource *resourc + + // Support immediate mapping of persistent buffers off the command thread, + // which require no GL calls to interface with. +- if (buffer->locations & WINED3D_LOCATION_PERSISTENT_MAP) ++ if (buffer->flags & WINED3D_BUFFER_PERSISTENT) + { ++ // Attempt to load a persistent map without syncing, if possible. ++ if (!(buffer->locations & WINED3D_LOCATION_PERSISTENT_MAP)) ++ { ++ wined3d_resource_wait_idle(resource); ++ if (!buffer_alloc_persistent_map(buffer)) ++ { ++ ERR_(d3d_perf)("Failed to allocate persistent buffer, falling back to sync path."); ++ return E_FAIL; ++ } ++ wined3d_buffer_validate_location(buffer, WINED3D_LOCATION_PERSISTENT_MAP); ++ } ++ + map_desc->row_pitch = map_desc->slice_pitch = buffer->desc.byte_width; + if (flags & WINED3D_MAP_DISCARD) + { +@@ -1415,6 +1427,7 @@ static HRESULT buffer_resource_sub_resource_map(struct wined3d_resource *resourc + // currently used buffer to the free pool, along with the fence that + // must be called before the buffer can be reused. + wined3d_cs_emit_discard_buffer(resource->device->cs, buffer, map_range); ++ + return WINED3D_OK; + } + else if (flags & WINED3D_MAP_NOOVERWRITE) +@@ -1425,14 +1438,11 @@ static HRESULT buffer_resource_sub_resource_map(struct wined3d_resource *resourc + struct wined3d_map_range map_range = buffer->mt_persistent_map; + map_desc->data = buffer->buffer_heap->map_ptr + map_range.offset + offset; + resource->map_count++; ++ + return WINED3D_OK; + } +- else +- { +- // TODO(acomminos): Should check mapped ranges to see if the region is writeable even though NOOVERWRITE is specified. +- WARN_(d3d_perf)("Mapping persistent buffer %p in sync with CS thread.\n", buffer); +- // XXX(acomminos): kill this early return. they're the worst. +- } ++ ++ WARN_(d3d_perf)("Mapping persistent buffer %p in sync with CS thread.\n", buffer); + } + + return E_NOTIMPL; +-- +2.16.2 + |