wined3d: Pass map flags to wined3d_context_copy_bo_address().

This is a step towards implementing D3D11_COPY_FLAGS.
This commit is contained in:
Zebediah Figura 2023-07-17 12:48:15 -05:00 committed by Alexandre Julliard
parent 2f84616e02
commit 9373cd5e3e
9 changed files with 37 additions and 29 deletions

View file

@ -4600,9 +4600,9 @@ static void adapter_gl_unmap_bo_address(struct wined3d_context *context,
static void adapter_gl_copy_bo_address(struct wined3d_context *context, static void adapter_gl_copy_bo_address(struct wined3d_context *context,
const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src,
unsigned int range_count, const struct wined3d_range *ranges) unsigned int range_count, const struct wined3d_range *ranges, uint32_t map_flags)
{ {
wined3d_context_gl_copy_bo_address(wined3d_context_gl(context), dst, src, range_count, ranges); wined3d_context_gl_copy_bo_address(wined3d_context_gl(context), dst, src, range_count, ranges, map_flags);
} }
static void adapter_gl_flush_bo_address(struct wined3d_context *context, static void adapter_gl_flush_bo_address(struct wined3d_context *context,

View file

@ -1029,14 +1029,13 @@ static void adapter_vk_unmap_bo_address(struct wined3d_context *context,
void adapter_vk_copy_bo_address(struct wined3d_context *context, void adapter_vk_copy_bo_address(struct wined3d_context *context,
const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src,
unsigned int range_count, const struct wined3d_range *ranges) unsigned int range_count, const struct wined3d_range *ranges, uint32_t map_flags)
{ {
struct wined3d_context_vk *context_vk = wined3d_context_vk(context); struct wined3d_context_vk *context_vk = wined3d_context_vk(context);
const struct wined3d_vk_info *vk_info = context_vk->vk_info; const struct wined3d_vk_info *vk_info = context_vk->vk_info;
struct wined3d_bo_vk staging_bo, *src_bo, *dst_bo; struct wined3d_bo_vk staging_bo, *src_bo, *dst_bo;
VkAccessFlags src_access_mask, dst_access_mask; VkAccessFlags src_access_mask, dst_access_mask;
VkBufferMemoryBarrier vk_barrier[2]; VkBufferMemoryBarrier vk_barrier[2];
DWORD map_flags = WINED3D_MAP_WRITE;
const struct wined3d_range *range; const struct wined3d_range *range;
struct wined3d_bo_address staging; struct wined3d_bo_address staging;
VkCommandBuffer vk_command_buffer; VkCommandBuffer vk_command_buffer;
@ -1048,9 +1047,6 @@ void adapter_vk_copy_bo_address(struct wined3d_context *context,
src_bo = src->buffer_object ? wined3d_bo_vk(src->buffer_object) : NULL; src_bo = src->buffer_object ? wined3d_bo_vk(src->buffer_object) : NULL;
dst_bo = dst->buffer_object ? wined3d_bo_vk(dst->buffer_object) : NULL; dst_bo = dst->buffer_object ? wined3d_bo_vk(dst->buffer_object) : NULL;
if (dst_bo && !dst->addr && !ranges->offset && ranges->size == dst_bo->size)
map_flags |= WINED3D_MAP_DISCARD;
if (src_bo && dst_bo) if (src_bo && dst_bo)
{ {
if (!(vk_command_buffer = wined3d_context_vk_get_command_buffer(context_vk))) if (!(vk_command_buffer = wined3d_context_vk_get_command_buffer(context_vk)))
@ -1131,8 +1127,8 @@ void adapter_vk_copy_bo_address(struct wined3d_context *context,
staging.buffer_object = &staging_bo.b; staging.buffer_object = &staging_bo.b;
staging.addr = NULL; staging.addr = NULL;
adapter_vk_copy_bo_address(context, &staging, src, range_count, ranges); adapter_vk_copy_bo_address(context, &staging, src, range_count, ranges, WINED3D_MAP_WRITE);
adapter_vk_copy_bo_address(context, dst, &staging, range_count, ranges); adapter_vk_copy_bo_address(context, dst, &staging, range_count, ranges, WINED3D_MAP_WRITE);
wined3d_context_vk_destroy_bo(context_vk, &staging_bo); wined3d_context_vk_destroy_bo(context_vk, &staging_bo);
@ -1151,8 +1147,8 @@ void adapter_vk_copy_bo_address(struct wined3d_context *context,
staging.buffer_object = &staging_bo.b; staging.buffer_object = &staging_bo.b;
staging.addr = NULL; staging.addr = NULL;
adapter_vk_copy_bo_address(context, &staging, src, range_count, ranges); adapter_vk_copy_bo_address(context, &staging, src, range_count, ranges, WINED3D_MAP_WRITE);
adapter_vk_copy_bo_address(context, dst, &staging, range_count, ranges); adapter_vk_copy_bo_address(context, dst, &staging, range_count, ranges, WINED3D_MAP_WRITE);
wined3d_context_vk_destroy_bo(context_vk, &staging_bo); wined3d_context_vk_destroy_bo(context_vk, &staging_bo);

View file

@ -562,7 +562,7 @@ static void buffer_conversion_upload(struct wined3d_buffer *buffer, struct wined
dst.addr = NULL; dst.addr = NULL;
src.buffer_object = NULL; src.buffer_object = NULL;
src.addr = data; src.addr = data;
wined3d_context_copy_bo_address(context, &dst, &src, buffer->modified_areas, buffer->maps); wined3d_context_copy_bo_address(context, &dst, &src, buffer->modified_areas, buffer->maps, WINED3D_MAP_WRITE);
heap_free(data); heap_free(data);
} }
@ -629,7 +629,7 @@ BOOL wined3d_buffer_load_location(struct wined3d_buffer *buffer,
src.addr = NULL; src.addr = NULL;
range.offset = 0; range.offset = 0;
range.size = buffer->resource.size; range.size = buffer->resource.size;
wined3d_context_copy_bo_address(context, &dst, &src, 1, &range); wined3d_context_copy_bo_address(context, &dst, &src, 1, &range, WINED3D_MAP_WRITE);
} }
break; break;
@ -648,9 +648,19 @@ BOOL wined3d_buffer_load_location(struct wined3d_buffer *buffer,
src.addr = buffer->resource.heap_memory; src.addr = buffer->resource.heap_memory;
if (!buffer->conversion_map) if (!buffer->conversion_map)
wined3d_context_copy_bo_address(context, &dst, &src, buffer->modified_areas, buffer->maps); {
uint32_t map_flags = WINED3D_MAP_WRITE;
if (buffer->modified_areas == 1 && !buffer->maps[0].offset
&& buffer->maps[0].size == buffer->resource.size)
map_flags |= WINED3D_MAP_DISCARD;
wined3d_context_copy_bo_address(context, &dst, &src, buffer->modified_areas, buffer->maps, map_flags);
}
else else
{
buffer_conversion_upload(buffer, context); buffer_conversion_upload(buffer, context);
}
break; break;
default: default:
@ -1134,16 +1144,20 @@ static void wined3d_buffer_set_bo(struct wined3d_buffer *buffer, struct wined3d_
void wined3d_buffer_copy_bo_address(struct wined3d_buffer *dst_buffer, struct wined3d_context *context, 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) unsigned int dst_offset, const struct wined3d_const_bo_address *src_addr, unsigned int size)
{ {
uint32_t map_flags = WINED3D_MAP_WRITE;
struct wined3d_bo_address dst_addr; struct wined3d_bo_address dst_addr;
struct wined3d_range range; struct wined3d_range range;
DWORD dst_location; 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_location = wined3d_buffer_get_memory(dst_buffer, context, &dst_addr);
dst_addr.addr += dst_offset; dst_addr.addr += dst_offset;
range.offset = 0; range.offset = 0;
range.size = size; range.size = size;
wined3d_context_copy_bo_address(context, &dst_addr, (const struct wined3d_bo_address *)src_addr, 1, &range); wined3d_context_copy_bo_address(context, &dst_addr, (const struct wined3d_bo_address *)src_addr, 1, &range, map_flags);
wined3d_buffer_invalidate_range(dst_buffer, ~dst_location, dst_offset, size); wined3d_buffer_invalidate_range(dst_buffer, ~dst_location, dst_offset, size);
} }

View file

@ -3067,9 +3067,8 @@ void wined3d_context_gl_flush_bo_address(struct wined3d_context_gl *context_gl,
void wined3d_context_gl_copy_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, const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src,
unsigned int range_count, const struct wined3d_range *ranges) unsigned int range_count, const struct wined3d_range *ranges, uint32_t map_flags)
{ {
uint32_t map_flags = WINED3D_MAP_WRITE;
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
struct wined3d_bo_gl *src_bo, *dst_bo; struct wined3d_bo_gl *src_bo, *dst_bo;
BYTE *dst_ptr, *src_ptr; BYTE *dst_ptr, *src_ptr;
@ -3079,9 +3078,6 @@ void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl,
src_bo = src->buffer_object ? wined3d_bo_gl(src->buffer_object) : NULL; src_bo = src->buffer_object ? wined3d_bo_gl(src->buffer_object) : NULL;
dst_bo = dst->buffer_object ? wined3d_bo_gl(dst->buffer_object) : NULL; dst_bo = dst->buffer_object ? wined3d_bo_gl(dst->buffer_object) : NULL;
if (dst_bo && !dst->addr && !ranges->offset && ranges->size == dst_bo->size)
map_flags |= WINED3D_MAP_DISCARD;
if (dst_bo && src_bo) if (dst_bo && src_bo)
{ {
if (gl_info->supported[ARB_COPY_BUFFER]) if (gl_info->supported[ARB_COPY_BUFFER])

View file

@ -2981,7 +2981,7 @@ static void adapter_no3d_unmap_bo_address(struct wined3d_context *context,
static void adapter_no3d_copy_bo_address(struct wined3d_context *context, static void adapter_no3d_copy_bo_address(struct wined3d_context *context,
const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src,
unsigned int range_count, const struct wined3d_range *ranges) unsigned int range_count, const struct wined3d_range *ranges, uint32_t map_flags)
{ {
unsigned int i; unsigned int i;

View file

@ -867,7 +867,8 @@ BOOL wined3d_texture_load_location(struct wined3d_texture *texture,
{ {
wined3d_texture_get_bo_address(texture, sub_resource_idx, wined3d_texture_get_bo_address(texture, sub_resource_idx,
&source, (current & wined3d_texture_sysmem_locations)); &source, (current & wined3d_texture_sysmem_locations));
wined3d_context_copy_bo_address(context, &destination, &source, 1, &range); wined3d_context_copy_bo_address(context, &destination, &source, 1, &range,
WINED3D_MAP_WRITE | WINED3D_MAP_DISCARD);
} }
ret = TRUE; ret = TRUE;
} }

View file

@ -1689,7 +1689,7 @@ void wined3d_unordered_access_view_set_counter(struct wined3d_unordered_access_v
range.offset = 0; range.offset = 0;
range.size = sizeof(value); range.size = sizeof(value);
wined3d_context_copy_bo_address(context, &dst, &src, 1, &range); wined3d_context_copy_bo_address(context, &dst, &src, 1, &range, WINED3D_MAP_WRITE | WINED3D_MAP_DISCARD);
context_release(context); context_release(context);
} }
@ -2175,7 +2175,8 @@ void wined3d_unordered_access_view_vk_clear(struct wined3d_unordered_access_view
range.offset = 0; range.offset = 0;
range.size = sizeof(constants); range.size = sizeof(constants);
adapter_vk_copy_bo_address(&context_vk->c, &cb_destination_address, &cb_source_address, 1, &range); adapter_vk_copy_bo_address(&context_vk->c, &cb_destination_address,
&cb_source_address, 1, &range, WINED3D_MAP_WRITE | WINED3D_MAP_DISCARD);
buffer_info.buffer = constants_bo.vk_buffer; buffer_info.buffer = constants_bo.vk_buffer;
buffer_info.range = constants_bo.size; buffer_info.range = constants_bo.size;

View file

@ -2275,7 +2275,7 @@ void wined3d_context_gl_bind_texture(struct wined3d_context_gl *context_gl,
void wined3d_context_gl_check_fbo_status(const struct wined3d_context_gl *context_gl, GLenum target) 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, 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, const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src,
unsigned int range_count, const struct wined3d_range *ranges) DECLSPEC_HIDDEN; unsigned int range_count, const struct wined3d_range *ranges, uint32_t map_flags) DECLSPEC_HIDDEN;
void wined3d_context_gl_destroy(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN; void wined3d_context_gl_destroy(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
void wined3d_context_gl_destroy_bo(struct wined3d_context_gl *context_gl, struct wined3d_bo_gl *bo) DECLSPEC_HIDDEN; void wined3d_context_gl_destroy_bo(struct wined3d_context_gl *context_gl, struct wined3d_bo_gl *bo) DECLSPEC_HIDDEN;
void wined3d_context_gl_draw_shaded_quad(struct wined3d_context_gl *context_gl, struct wined3d_texture_gl *texture_gl, void wined3d_context_gl_draw_shaded_quad(struct wined3d_context_gl *context_gl, struct wined3d_texture_gl *texture_gl,
@ -2910,7 +2910,7 @@ struct wined3d_adapter_ops
unsigned int range_count, const struct wined3d_range *ranges); unsigned int range_count, const struct wined3d_range *ranges);
void (*adapter_copy_bo_address)(struct wined3d_context *context, void (*adapter_copy_bo_address)(struct wined3d_context *context,
const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src,
unsigned int range_count, const struct wined3d_range *ranges); unsigned int range_count, const struct wined3d_range *ranges, uint32_t map_flags);
void (*adapter_flush_bo_address)(struct wined3d_context *context, void (*adapter_flush_bo_address)(struct wined3d_context *context,
const struct wined3d_const_bo_address *data, size_t size); const struct wined3d_const_bo_address *data, size_t size);
bool (*adapter_alloc_bo)(struct wined3d_device *device, struct wined3d_resource *resource, bool (*adapter_alloc_bo)(struct wined3d_device *device, struct wined3d_resource *resource,
@ -5622,9 +5622,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, static inline void wined3d_context_copy_bo_address(struct wined3d_context *context,
const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src,
unsigned int range_count, const struct wined3d_range *ranges) unsigned int range_count, const struct wined3d_range *ranges, uint32_t map_flags)
{ {
context->device->adapter->adapter_ops->adapter_copy_bo_address(context, dst, src, range_count, ranges); context->device->adapter->adapter_ops->adapter_copy_bo_address(context, dst, src, range_count, ranges, map_flags);
} }
static inline void wined3d_context_flush_bo_address(struct wined3d_context *context, static inline void wined3d_context_flush_bo_address(struct wined3d_context *context,

View file

@ -704,7 +704,7 @@ static inline struct wined3d_adapter_vk *wined3d_adapter_vk(struct wined3d_adapt
void adapter_vk_copy_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *dst, void adapter_vk_copy_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *dst,
const struct wined3d_bo_address *src, const struct wined3d_bo_address *src,
unsigned int range_count, const struct wined3d_range *ranges) DECLSPEC_HIDDEN; unsigned int range_count, const struct wined3d_range *ranges, uint32_t map_flags) DECLSPEC_HIDDEN;
unsigned int wined3d_adapter_vk_get_memory_type_index(const struct wined3d_adapter_vk *adapter_vk, unsigned int wined3d_adapter_vk_get_memory_type_index(const struct wined3d_adapter_vk *adapter_vk,
uint32_t memory_type_mask, VkMemoryPropertyFlags flags) DECLSPEC_HIDDEN; uint32_t memory_type_mask, VkMemoryPropertyFlags flags) DECLSPEC_HIDDEN;
BOOL wined3d_adapter_vk_init_format_info(struct wined3d_adapter_vk *adapter_vk, BOOL wined3d_adapter_vk_init_format_info(struct wined3d_adapter_vk *adapter_vk,