From f06d2aa1b13ffd91db4c3af39a50cd5a0540c8ba Mon Sep 17 00:00:00 2001 From: ParantezTech <12572227+par274@users.noreply.github.com> Date: Tue, 22 Sep 2026 15:58:36 +0300 Subject: [PATCH] [Gpu] Add Vk synchronization2 helper --- .../Gpu/Vulkan/VulkanSynchronization.cs | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/SharpEmu.Libs/Gpu/Vulkan/VulkanSynchronization.cs diff --git a/src/SharpEmu.Libs/Gpu/Vulkan/VulkanSynchronization.cs b/src/SharpEmu.Libs/Gpu/Vulkan/VulkanSynchronization.cs new file mode 100644 index 0000000..d275742 --- /dev/null +++ b/src/SharpEmu.Libs/Gpu/Vulkan/VulkanSynchronization.cs @@ -0,0 +1,56 @@ +// Copyright (C) 2026 SharpEmu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +using Silk.NET.Vulkan; + +namespace SharpEmu.Libs.Gpu.Vulkan; + +internal static unsafe class VulkanSynchronization +{ + public static AccessFlags2 Access(AccessFlags access) => (AccessFlags2)(ulong)access; + + public static void PipelineBarrier( + Vk vk, + CommandBuffer command, + PipelineStageFlags sourceStages, + PipelineStageFlags destinationStages, + DependencyFlags dependencyFlags, + uint memoryBarrierCount, + MemoryBarrier2* memoryBarriers, + uint bufferMemoryBarrierCount, + BufferMemoryBarrier2* bufferMemoryBarriers, + uint imageMemoryBarrierCount, + ImageMemoryBarrier2* imageMemoryBarriers) + { + var sourceStages2 = (PipelineStageFlags2)(ulong)sourceStages; + var destinationStages2 = (PipelineStageFlags2)(ulong)destinationStages; + for (var index = 0u; index < memoryBarrierCount; index++) + { + memoryBarriers[index].SrcStageMask = sourceStages2; + memoryBarriers[index].DstStageMask = destinationStages2; + } + for (var index = 0u; index < bufferMemoryBarrierCount; index++) + { + bufferMemoryBarriers[index].SrcStageMask = sourceStages2; + bufferMemoryBarriers[index].DstStageMask = destinationStages2; + } + for (var index = 0u; index < imageMemoryBarrierCount; index++) + { + imageMemoryBarriers[index].SrcStageMask = sourceStages2; + imageMemoryBarriers[index].DstStageMask = destinationStages2; + } + + var dependencyInfo = new DependencyInfo + { + SType = StructureType.DependencyInfo, + DependencyFlags = dependencyFlags, + MemoryBarrierCount = memoryBarrierCount, + PMemoryBarriers = memoryBarriers, + BufferMemoryBarrierCount = bufferMemoryBarrierCount, + PBufferMemoryBarriers = bufferMemoryBarriers, + ImageMemoryBarrierCount = imageMemoryBarrierCount, + PImageMemoryBarriers = imageMemoryBarriers, + }; + vk.CmdPipelineBarrier2(command, &dependencyInfo); + } +}