From 3e15a3f06ab7bd1a809e90066055fd1ce96b93cd Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Tue, 17 Nov 2020 15:32:38 +0100 Subject: [PATCH] vkd3d: Remove manual tracking of host barriers. Just emit host barrier on submit unconditionally. Signed-off-by: Hans-Kristian Arntzen --- libs/vkd3d/command.c | 38 ++++---------------------------------- libs/vkd3d/debug_ring.c | 6 +----- libs/vkd3d/resource.c | 28 ---------------------------- libs/vkd3d/vkd3d_private.h | 1 - 4 files changed, 5 insertions(+), 68 deletions(-) diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 8fddd53f..c7dd48f5 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -103,12 +103,14 @@ HRESULT vkd3d_queue_create(struct d3d12_device *device, begin_info.pInheritanceInfo = NULL; VK_CALL(vkBeginCommandBuffer(object->barrier_command_buffer, &begin_info)); + /* To avoid unnecessary tracking, just emit a host barrier on every submit. */ memory_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; memory_barrier.pNext = NULL; memory_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; - memory_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + memory_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_HOST_READ_BIT; VK_CALL(vkCmdPipelineBarrier(object->barrier_command_buffer, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_HOST_BIT, 0, 1, &memory_barrier, 0, NULL, 0, NULL)); VK_CALL(vkEndCommandBuffer(object->barrier_command_buffer)); @@ -2795,7 +2797,6 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_list_Close(d3d12_command_list_ifa { struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList(iface); const struct vkd3d_vk_device_procs *vk_procs; - VkMemoryBarrier barrier; VkResult vr; TRACE("iface %p.\n", iface); @@ -2812,20 +2813,6 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_list_Close(d3d12_command_list_ifa if (list->is_predicated) VK_CALL(vkCmdEndConditionalRenderingEXT(list->vk_command_buffer)); - if (list->need_host_barrier) - { - /* Need to emit host barrier here. There is no obvious RESOURCE_STATE we can map this to. - * Rely on simple tracking to do this. */ - barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; - barrier.pNext = NULL; - barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barrier.dstAccessMask = VK_ACCESS_HOST_READ_BIT; - - VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, - 1, &barrier, 0, NULL, 0, NULL)); - } - vkd3d_shader_debug_ring_end_command_buffer(list); if ((vr = VK_CALL(vkEndCommandBuffer(list->vk_command_buffer))) < 0) @@ -2870,7 +2857,6 @@ static void d3d12_command_list_reset_state(struct d3d12_command_list *list, list->is_predicated = false; list->render_pass_suspended = false; - list->need_host_barrier = false; #ifdef VKD3D_ENABLE_RENDERDOC list->debug_capture = vkd3d_renderdoc_active() && vkd3d_renderdoc_should_capture_shader_hash(0); #else @@ -3808,10 +3794,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyBufferRegion(d3d12_command_ VK_CALL(vkCmdCopyBuffer(list->vk_command_buffer, src_resource->vk_buffer, dst_resource->vk_buffer, 1, &buffer_copy)); - - /* There is no explicit host barrier for readbacks. */ - if (d3d12_heap_needs_host_barrier_for_write(dst_resource->heap)) - list->need_host_barrier = true; } static void vk_image_subresource_layers_from_d3d12(VkImageSubresourceLayers *subresource, @@ -4376,10 +4358,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyTextureRegion(d3d12_command { FIXME("Copy type %#x -> %#x not implemented.\n", src->Type, dst->Type); } - - /* There is no explicit host barrier for readbacks. */ - if (d3d12_heap_needs_host_barrier_for_write(dst_resource->heap)) - list->need_host_barrier = true; } static void STDMETHODCALLTYPE d3d12_command_list_CopyResource(d3d12_command_list_iface *iface, @@ -4437,10 +4415,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyResource(d3d12_command_list src_resource, src_resource->format, &vk_image_copy, true); } } - - /* There is no explicit host barrier for readbacks. */ - if (d3d12_heap_needs_host_barrier_for_write(dst_resource->heap)) - list->need_host_barrier = true; } static unsigned int vkd3d_get_tile_index_from_region(const struct d3d12_sparse_info *sparse, @@ -6368,10 +6342,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveQueryData(d3d12_command_ VK_CALL(vkCmdCopyQueryPoolResults(list->vk_command_buffer, query_heap->vk_query_pool, first, count, buffer->vk_buffer, buffer->heap_offset + offset, stride, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT)); - - /* There is no explicit host barrier for readbacks. */ - if (d3d12_heap_needs_host_barrier_for_write(buffer->heap)) - list->need_host_barrier = true; } } diff --git a/libs/vkd3d/debug_ring.c b/libs/vkd3d/debug_ring.c index 9a760024..9e24bc90 100644 --- a/libs/vkd3d/debug_ring.c +++ b/libs/vkd3d/debug_ring.c @@ -312,10 +312,6 @@ void vkd3d_shader_debug_ring_end_command_buffer(struct d3d12_command_list *list) list->device->debug_ring.host_buffer, 1, &buffer_copy)); - barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barrier.dstAccessMask = VK_ACCESS_HOST_READ_BIT; - VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, - 1, &barrier, 0, NULL, 0, NULL)); + /* Host barrier is taken care of automatically. */ } } diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index 42d6150a..0e2391e6 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -624,34 +624,6 @@ static HRESULT d3d12_resource_create(struct d3d12_device *device, const D3D12_CLEAR_VALUE *optimized_clear_value, bool placed, struct d3d12_resource **resource); -bool d3d12_heap_needs_host_barrier_for_write(struct d3d12_heap *heap) -{ - if (!heap) - { - /* This is a reserved resource and we have no guarantee - * it's not mapped to something with readback. */ - return true; - } - - switch (heap->desc.Properties.Type) - { - case D3D12_HEAP_TYPE_DEFAULT: - case D3D12_HEAP_TYPE_UPLOAD: - return false; - - case D3D12_HEAP_TYPE_READBACK: - return true; - - case D3D12_HEAP_TYPE_CUSTOM: - return heap->desc.Properties.CPUPageProperty != D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE; - - default: - break; - } - - return false; -} - static HRESULT d3d12_heap_init_omnipotent_buffer(struct d3d12_heap *heap, struct d3d12_device *device, const D3D12_HEAP_DESC *desc) { diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 051302f8..3e205c61 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -1266,7 +1266,6 @@ struct d3d12_command_list bool is_recording; bool is_valid; - bool need_host_barrier; bool debug_capture; bool has_replaced_shaders; bool has_valid_index_buffer;