[PATCH 5/6] wined3d: Pass map flags to wined3d_context_copy_bo_address().
Zebediah Figura
z.figura12 at gmail.com
Thu Jun 17 23:19:38 CDT 2021
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/wined3d/adapter_gl.c | 6 +++---
dlls/wined3d/adapter_vk.c | 14 +++++++-------
dlls/wined3d/buffer.c | 8 ++++++--
dlls/wined3d/context_gl.c | 2 +-
dlls/wined3d/directx.c | 4 ++--
dlls/wined3d/view.c | 2 +-
dlls/wined3d/wined3d_private.h | 12 ++++++------
7 files changed, 26 insertions(+), 22 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index 902b9620f30..7c2e0460df7 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -4588,10 +4588,10 @@ static void adapter_gl_unmap_bo_address(struct wined3d_context *context,
wined3d_context_gl_unmap_bo_address(wined3d_context_gl(context), data, range_count, ranges);
}
-static void adapter_gl_copy_bo_address(struct wined3d_context *context,
- const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, size_t size)
+static void adapter_gl_copy_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *dst,
+ const struct wined3d_bo_address *src, size_t size, uint32_t map_flags)
{
- wined3d_context_gl_copy_bo_address(wined3d_context_gl(context), dst, src, size);
+ wined3d_context_gl_copy_bo_address(wined3d_context_gl(context), dst, src, size, map_flags);
}
static HRESULT adapter_gl_create_swapchain(struct wined3d_device *device,
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 9f36ee39080..7e7a6b4b0bd 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -999,8 +999,8 @@ static void adapter_vk_unmap_bo_address(struct wined3d_context *context,
wined3d_bo_vk_unmap(bo, context_vk);
}
-static void adapter_vk_copy_bo_address(struct wined3d_context *context,
- const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, size_t size)
+static void adapter_vk_copy_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *dst,
+ const struct wined3d_bo_address *src, size_t size, uint32_t map_flags)
{
struct wined3d_context_vk *context_vk = wined3d_context_vk(context);
const struct wined3d_vk_info *vk_info = context_vk->vk_info;
@@ -1084,8 +1084,8 @@ static void adapter_vk_copy_bo_address(struct wined3d_context *context,
staging.buffer_object = (uintptr_t)&staging_bo;
staging.addr = NULL;
- adapter_vk_copy_bo_address(context, &staging, src, size);
- adapter_vk_copy_bo_address(context, dst, &staging, size);
+ adapter_vk_copy_bo_address(context, &staging, src, size, WINED3D_MAP_WRITE | WINED3D_MAP_DISCARD);
+ adapter_vk_copy_bo_address(context, dst, &staging, size, map_flags);
wined3d_context_vk_destroy_bo(context_vk, &staging_bo);
@@ -1104,8 +1104,8 @@ static void adapter_vk_copy_bo_address(struct wined3d_context *context,
staging.buffer_object = (uintptr_t)&staging_bo;
staging.addr = NULL;
- adapter_vk_copy_bo_address(context, &staging, src, size);
- adapter_vk_copy_bo_address(context, dst, &staging, size);
+ adapter_vk_copy_bo_address(context, &staging, src, size, WINED3D_MAP_WRITE | WINED3D_MAP_DISCARD);
+ adapter_vk_copy_bo_address(context, dst, &staging, size, map_flags);
wined3d_context_vk_destroy_bo(context_vk, &staging_bo);
@@ -1113,7 +1113,7 @@ static void adapter_vk_copy_bo_address(struct wined3d_context *context,
}
src_ptr = adapter_vk_map_bo_address(context, src, size, WINED3D_MAP_READ);
- dst_ptr = adapter_vk_map_bo_address(context, dst, size, WINED3D_MAP_WRITE);
+ dst_ptr = adapter_vk_map_bo_address(context, dst, size, map_flags);
memcpy(dst_ptr, src_ptr, size);
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 7b8c8904961..01e1aad8bad 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -1012,13 +1012,17 @@ static HRESULT buffer_resource_sub_resource_unmap(struct wined3d_resource *resou
void wined3d_buffer_copy_bo_address(struct wined3d_buffer *dst_buffer, struct wined3d_context *context,
unsigned int dst_offset, const struct wined3d_const_bo_address *src_addr, unsigned int size)
{
+ DWORD map_flags = WINED3D_MAP_WRITE;
struct wined3d_bo_address dst_addr;
DWORD dst_location;
+ if (!dst_offset && size == dst_buffer->resource.size)
+ map_flags |= WINED3D_MAP_DISCARD;
+
dst_location = wined3d_buffer_get_memory(dst_buffer, context, &dst_addr);
dst_addr.addr += dst_offset;
- wined3d_context_copy_bo_address(context, &dst_addr, (const struct wined3d_bo_address *)src_addr, size);
+ wined3d_context_copy_bo_address(context, &dst_addr, (const struct wined3d_bo_address *)src_addr, size, map_flags);
wined3d_buffer_invalidate_range(dst_buffer, ~dst_location, dst_offset, size);
}
@@ -1526,7 +1530,7 @@ static void wined3d_buffer_vk_upload_ranges(struct wined3d_buffer *buffer, struc
src.addr = (uint8_t *)data + range->offset - data_offset;
dst.addr = (void *)(uintptr_t)range->offset;
- wined3d_context_copy_bo_address(context, &dst, &src, range->size);
+ wined3d_context_copy_bo_address(context, &dst, &src, range->size, flags);
}
return;
diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c
index 43c086ac758..3f5c492d8b7 100644
--- a/dlls/wined3d/context_gl.c
+++ b/dlls/wined3d/context_gl.c
@@ -2759,7 +2759,7 @@ void wined3d_context_gl_unmap_bo_address(struct wined3d_context_gl *context_gl,
}
void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl,
- const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, size_t size)
+ const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, size_t size, uint32_t map_flags)
{
const struct wined3d_gl_info *gl_info;
struct wined3d_bo_gl *src_bo, *dst_bo;
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index a39c6d75750..3cc06e683fc 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2785,8 +2785,8 @@ static void adapter_no3d_unmap_bo_address(struct wined3d_context *context,
ERR("Unsupported buffer object %#lx.\n", data->buffer_object);
}
-static void adapter_no3d_copy_bo_address(struct wined3d_context *context,
- const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, size_t size)
+static void adapter_no3d_copy_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *dst,
+ const struct wined3d_bo_address *src, size_t size, uint32_t map_flags)
{
if (dst->buffer_object)
ERR("Unsupported dst buffer object %#lx.\n", dst->buffer_object);
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index e8c91ec6413..3ce26fa9c98 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -1597,7 +1597,7 @@ void wined3d_unordered_access_view_set_counter(struct wined3d_unordered_access_v
dst.buffer_object = view->counter_bo;
dst.addr = NULL;
- wined3d_context_copy_bo_address(context, &dst, &src, sizeof(uint32_t));
+ wined3d_context_copy_bo_address(context, &dst, &src, sizeof(uint32_t), WINED3D_MAP_WRITE | WINED3D_MAP_DISCARD);
context_release(context);
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index da1cf638606..95d1a2f6dab 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2309,8 +2309,8 @@ void wined3d_context_gl_bind_dummy_textures(const struct wined3d_context_gl *con
void wined3d_context_gl_bind_texture(struct wined3d_context_gl *context_gl,
GLenum target, GLuint name) DECLSPEC_HIDDEN;
void wined3d_context_gl_check_fbo_status(const struct wined3d_context_gl *context_gl, GLenum target) DECLSPEC_HIDDEN;
-void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl,
- const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, size_t size) DECLSPEC_HIDDEN;
+void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl, const struct wined3d_bo_address *dst,
+ const struct wined3d_bo_address *src, size_t size, uint32_t map_flags) DECLSPEC_HIDDEN;
bool wined3d_context_gl_create_bo(struct wined3d_context_gl *context_gl, GLsizeiptr size, GLenum binding,
GLenum usage, bool coherent, GLbitfield flags, struct wined3d_bo_gl *bo) DECLSPEC_HIDDEN;
void wined3d_context_gl_destroy(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
@@ -3317,8 +3317,8 @@ struct wined3d_adapter_ops
const struct wined3d_bo_address *data, size_t size, uint32_t map_flags);
void (*adapter_unmap_bo_address)(struct wined3d_context *context, const struct wined3d_bo_address *data,
unsigned int range_count, const struct wined3d_range *ranges);
- void (*adapter_copy_bo_address)(struct wined3d_context *context,
- const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, size_t size);
+ void (*adapter_copy_bo_address)(struct wined3d_context *context, const struct wined3d_bo_address *dst,
+ const struct wined3d_bo_address *src, size_t size, uint32_t map_flags);
HRESULT (*adapter_create_swapchain)(struct wined3d_device *device,
struct wined3d_swapchain_desc *desc,
struct wined3d_swapchain_state_parent *state_parent, void *parent,
@@ -6111,9 +6111,9 @@ static inline void wined3d_context_unmap_bo_address(struct wined3d_context *cont
}
static inline void wined3d_context_copy_bo_address(struct wined3d_context *context,
- const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, size_t size)
+ const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, size_t size, uint32_t map_flags)
{
- context->device->adapter->adapter_ops->adapter_copy_bo_address(context, dst, src, size);
+ context->device->adapter->adapter_ops->adapter_copy_bo_address(context, dst, src, size, map_flags);
}
static inline void wined3d_context_vk_reference_bo(const struct wined3d_context_vk *context_vk,
--
2.30.2
More information about the wine-devel
mailing list