Skip to content

Commit 9baa0a6

Browse files
vkd3d: Add config option for copy_buffer_sync.
Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
1 parent e6088f2 commit 9baa0a6

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
@@ -7461,6 +7461,28 @@ static void STDMETHODCALLTYPE d3d12_command_list_Dispatch(d3d12_command_list_ifa
74617461
d3d12_command_list_check_compute_barrier(list);
74627462
}
74637463

7464+
static void d3d12_command_list_full_transfer_barrier(struct d3d12_command_list *list)
7465+
{
7466+
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
7467+
VkMemoryBarrier2 vk_barrier;
7468+
VkDependencyInfo dep_info;
7469+
7470+
memset(&vk_barrier, 0, sizeof(vk_barrier));
7471+
memset(&dep_info, 0, sizeof(dep_info));
7472+
vk_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2;
7473+
7474+
dep_info.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO;
7475+
dep_info.memoryBarrierCount = 1;
7476+
dep_info.pMemoryBarriers = &vk_barrier;
7477+
vk_barrier.srcStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT;
7478+
vk_barrier.srcAccessMask = VK_ACCESS_2_TRANSFER_WRITE_BIT;
7479+
vk_barrier.dstStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
7480+
vk_barrier.dstAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT | VK_ACCESS_2_MEMORY_READ_BIT;
7481+
7482+
VK_CALL(vkCmdPipelineBarrier2(list->cmd.vk_command_buffer, &dep_info));
7483+
d3d12_command_list_debug_mark_barrier(list, &dep_info);
7484+
}
7485+
74647486
static void STDMETHODCALLTYPE d3d12_command_list_CopyBufferRegion(d3d12_command_list_iface *iface,
74657487
ID3D12Resource *dst, UINT64 dst_offset, ID3D12Resource *src, UINT64 src_offset, UINT64 byte_count)
74667488
{
@@ -7515,6 +7537,12 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyBufferRegion(d3d12_command_
75157537
d3d12_command_list_debug_mark_execution(list, VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT);
75167538
VK_CALL(vkCmdCopyBuffer2(list->cmd.vk_command_buffer, &copy_info));
75177539

7540+
if (vkd3d_config_flags & VKD3D_CONFIG_FLAG_COPY_BUFFER_SYNC)
7541+
{
7542+
list->tracked_copy_buffer_count = 0;
7543+
d3d12_command_list_full_transfer_barrier(list);
7544+
}
7545+
75187546
VKD3D_BREADCRUMB_COMMAND(COPY);
75197547
}
75207548

@@ -8428,6 +8456,12 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyResource(d3d12_command_list
84288456
!!(dst_resource->flags & VKD3D_RESOURCE_RESERVED));
84298457
d3d12_command_list_debug_mark_execution(list, VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT);
84308458
VK_CALL(vkCmdCopyBuffer2(list->cmd.vk_command_buffer, &copy_info));
8459+
8460+
if (vkd3d_config_flags & VKD3D_CONFIG_FLAG_COPY_BUFFER_SYNC)
8461+
{
8462+
list->tracked_copy_buffer_count = 0;
8463+
d3d12_command_list_full_transfer_barrier(list);
8464+
}
84318465
}
84328466
else
84338467
{

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)