Skip to content

Commit 8fc0fa3

Browse files
vkd3d: Add config option for copy_buffer_sync.
Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
1 parent 5b2f42d commit 8fc0fa3

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

include/vkd3d.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ extern "C" {
107107
#define VKD3D_CONFIG_FLAG_SMALL_VRAM_REBAR (1ull << 49)
108108
#define VKD3D_CONFIG_FLAG_NO_STAGGERED_SUBMIT (1ull << 50)
109109
#define VKD3D_CONFIG_FLAG_CLEAR_UAV_SYNC (1ull << 51)
110+
#define VKD3D_CONFIG_FLAG_COPY_BUFFER_SYNC (1ull << 52)
110111

111112
struct vkd3d_instance;
112113

libs/vkd3d/command.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7451,6 +7451,28 @@ static void STDMETHODCALLTYPE d3d12_command_list_Dispatch(d3d12_command_list_ifa
74517451
d3d12_command_list_check_compute_barrier(list);
74527452
}
74537453

7454+
static void d3d12_command_list_full_transfer_barrier(struct d3d12_command_list *list)
7455+
{
7456+
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
7457+
VkMemoryBarrier2 vk_barrier;
7458+
VkDependencyInfo dep_info;
7459+
7460+
memset(&vk_barrier, 0, sizeof(vk_barrier));
7461+
memset(&dep_info, 0, sizeof(dep_info));
7462+
vk_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2;
7463+
7464+
dep_info.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO;
7465+
dep_info.memoryBarrierCount = 1;
7466+
dep_info.pMemoryBarriers = &vk_barrier;
7467+
vk_barrier.srcStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT;
7468+
vk_barrier.srcAccessMask = VK_ACCESS_2_TRANSFER_WRITE_BIT;
7469+
vk_barrier.dstStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
7470+
vk_barrier.dstAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT | VK_ACCESS_2_MEMORY_READ_BIT;
7471+
7472+
VK_CALL(vkCmdPipelineBarrier2(list->cmd.vk_command_buffer, &dep_info));
7473+
d3d12_command_list_debug_mark_barrier(list, &dep_info);
7474+
}
7475+
74547476
static void STDMETHODCALLTYPE d3d12_command_list_CopyBufferRegion(d3d12_command_list_iface *iface,
74557477
ID3D12Resource *dst, UINT64 dst_offset, ID3D12Resource *src, UINT64 src_offset, UINT64 byte_count)
74567478
{
@@ -7505,6 +7527,12 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyBufferRegion(d3d12_command_
75057527
d3d12_command_list_debug_mark_execution(list, VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT);
75067528
VK_CALL(vkCmdCopyBuffer2(list->cmd.vk_command_buffer, &copy_info));
75077529

7530+
if (vkd3d_config_flags & VKD3D_CONFIG_FLAG_COPY_BUFFER_SYNC)
7531+
{
7532+
list->tracked_copy_buffer_count = 0;
7533+
d3d12_command_list_full_transfer_barrier(list);
7534+
}
7535+
75087536
VKD3D_BREADCRUMB_COMMAND(COPY);
75097537
}
75107538

@@ -8418,6 +8446,12 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyResource(d3d12_command_list
84188446
!!(dst_resource->flags & VKD3D_RESOURCE_RESERVED));
84198447
d3d12_command_list_debug_mark_execution(list, VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT);
84208448
VK_CALL(vkCmdCopyBuffer2(list->cmd.vk_command_buffer, &copy_info));
8449+
8450+
if (vkd3d_config_flags & VKD3D_CONFIG_FLAG_COPY_BUFFER_SYNC)
8451+
{
8452+
list->tracked_copy_buffer_count = 0;
8453+
d3d12_command_list_full_transfer_barrier(list);
8454+
}
84218455
}
84228456
else
84238457
{

libs/vkd3d/device.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,7 @@ static const struct vkd3d_debug_option vkd3d_config_options[] =
959959
{"small_vram_rebar", VKD3D_CONFIG_FLAG_SMALL_VRAM_REBAR},
960960
{"no_staggered_submit", VKD3D_CONFIG_FLAG_NO_STAGGERED_SUBMIT},
961961
{"clear_uav_sync", VKD3D_CONFIG_FLAG_CLEAR_UAV_SYNC},
962+
{"copy_buffer_sync", VKD3D_CONFIG_FLAG_COPY_BUFFER_SYNC},
962963
};
963964

964965
static void vkd3d_config_flags_init_once(void)

0 commit comments

Comments
 (0)