vkd3d: Remove manual tracking of host barriers.

Just emit host barrier on submit unconditionally.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2020-11-17 15:32:38 +01:00
parent 0f25b827e0
commit 3e15a3f06a
4 changed files with 5 additions and 68 deletions

View File

@ -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;
}
}

View File

@ -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. */
}
}

View File

@ -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)
{

View File

@ -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;