From 1409ebab1f661cfaa88e90d5ec5300e881e5c583 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Wed, 19 Jan 2022 15:09:05 +0100 Subject: [PATCH] vkd3d: Consider sparse buffers to alias any other buffer. Technically cannot alias committed buffers, but :shrug: ... Signed-off-by: Hans-Kristian Arntzen --- libs/vkd3d/command.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 5d631a7f..b7ba14df 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -2201,17 +2201,25 @@ static void d3d12_command_list_reset_buffer_copy_tracking(struct d3d12_command_l } static void d3d12_command_list_mark_copy_buffer_write(struct d3d12_command_list *list, VkBuffer vk_buffer, - VkDeviceSize offset, VkDeviceSize size) + VkDeviceSize offset, VkDeviceSize size, bool sparse) { struct d3d12_buffer_copy_tracked_buffer *tracked_buffer; VkDeviceSize range_end = offset + size; unsigned int i; + if (sparse) + { + vk_buffer = VK_NULL_HANDLE; + offset = 0; + size = VK_WHOLE_SIZE; + } + for (i = 0; i < list->tracked_copy_buffer_count; i++) { tracked_buffer = &list->tracked_copy_buffers[i]; - if (tracked_buffer->vk_buffer == vk_buffer) + /* Any write to a sparse buffer will be considered to be aliasing with any other resource. */ + if (tracked_buffer->vk_buffer == vk_buffer || tracked_buffer->vk_buffer == VK_NULL_HANDLE || sparse) { if (range_end > tracked_buffer->hazard_begin && offset < tracked_buffer->hazard_end) { @@ -5700,7 +5708,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyBufferRegion(d3d12_command_ copy_info.regionCount = 1; copy_info.pRegions = &buffer_copy; - d3d12_command_list_mark_copy_buffer_write(list, copy_info.dstBuffer, buffer_copy.dstOffset, buffer_copy.size); + d3d12_command_list_mark_copy_buffer_write(list, copy_info.dstBuffer, buffer_copy.dstOffset, buffer_copy.size, + !!(dst_resource->flags & VKD3D_RESOURCE_RESERVED)); VK_CALL(vkCmdCopyBuffer2KHR(list->vk_command_buffer, ©_info)); } @@ -6419,7 +6428,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyResource(d3d12_command_list copy_info.regionCount = 1; copy_info.pRegions = &vk_buffer_copy; - d3d12_command_list_mark_copy_buffer_write(list, copy_info.dstBuffer, vk_buffer_copy.dstOffset, vk_buffer_copy.size); + d3d12_command_list_mark_copy_buffer_write(list, copy_info.dstBuffer, vk_buffer_copy.dstOffset, vk_buffer_copy.size, + !!(dst_resource->flags & VKD3D_RESOURCE_RESERVED)); VK_CALL(vkCmdCopyBuffer2KHR(list->vk_command_buffer, ©_info)); } else @@ -6619,7 +6629,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyTiles(d3d12_command_list_if copy_info.regionCount = 1; copy_info.pRegions = &buffer_copy; - d3d12_command_list_mark_copy_buffer_write(list, copy_info.dstBuffer, buffer_copy.dstOffset, buffer_copy.size); + d3d12_command_list_mark_copy_buffer_write(list, copy_info.dstBuffer, buffer_copy.dstOffset, buffer_copy.size, + !!((copy_to_buffer ? linear_res : tiled_res)->flags & VKD3D_RESOURCE_RESERVED)); VK_CALL(vkCmdCopyBuffer2KHR(list->vk_command_buffer, ©_info)); } } @@ -8881,7 +8892,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveQueryData(d3d12_command_ copy_info.regionCount = 1; copy_info.pRegions = ©_region; - d3d12_command_list_mark_copy_buffer_write(list, copy_info.dstBuffer, copy_region.dstOffset, copy_region.size); + d3d12_command_list_mark_copy_buffer_write(list, copy_info.dstBuffer, copy_region.dstOffset, copy_region.size, + !!(buffer->flags & VKD3D_RESOURCE_RESERVED)); VK_CALL(vkCmdCopyBuffer2KHR(list->vk_command_buffer, ©_info)); } else @@ -8898,7 +8910,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveQueryData(d3d12_command_ { d3d12_command_list_read_query_range(list, query_heap->vk_query_pool, start_index, query_count); d3d12_command_list_mark_copy_buffer_write(list, buffer->res.vk_buffer, - buffer->mem.offset + aligned_dst_buffer_offset, sizeof(uint64_t)); + buffer->mem.offset + aligned_dst_buffer_offset, sizeof(uint64_t), + !!(buffer->flags & VKD3D_RESOURCE_RESERVED)); VK_CALL(vkCmdCopyQueryPoolResults(list->vk_command_buffer, query_heap->vk_query_pool, start_index, query_count, buffer->res.vk_buffer, buffer->mem.offset + aligned_dst_buffer_offset, stride, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT));