/// <summary> /// Records a buffer image barrier /// </summary> /// <returns>this</returns> public void BufferMemoryBarrier(Buffer buffer, VkAccessFlag srcAccess, uint srcQueue, VkAccessFlag dstAccess, uint dstQueue = Vulkan.QueueFamilyIgnored, VkPipelineStageFlag srcStage = VkPipelineStageFlag.AllCommands, VkPipelineStageFlag dstStage = VkPipelineStageFlag.AllCommands, VkDependencyFlag depFlag = VkDependencyFlag.None, ulong offset = 0, ulong size = 0) { var temp = new VkBufferMemoryBarrier() { SType = VkStructureType.BufferMemoryBarrier, PNext = IntPtr.Zero, SrcAccessMask = srcAccess, DstAccessMask = dstAccess, Buffer = buffer.Handle, SrcQueueFamilyIndex = srcQueue, DstQueueFamilyIndex = dstQueue, Offset = offset, Size = size == 0 ? buffer.Size - offset : size }; PipelineBarrier(srcStage, dstStage, depFlag, default(VkMemoryBarrier), temp, default(VkImageMemoryBarrier)); }
/// <summary> /// To record a pipeline barrier, call: /// </summary> /// <param name="srcStageMask">is a bitmask of <c>VkPipelineStageFlagBits</c> specifying the <a href='https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#synchronization-pipeline-stages-masks'> source stage mask</a>.</param> /// <param name="dstStageMask">is a bitmask of <c>VkPipelineStageFlagBits</c> specifying the <a href='https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#synchronization-pipeline-stages-masks'> destination stage mask</a>.</param> /// <param name="dependencyFlags">is a bitmask of <c>VkDependencyFlagBits</c> specifying how execution and memory dependencies are formed.</param> /// <param name="barrier">is a pointer to an array of <see cref="VkMemoryBarrier"/> structures.</param> /// <param name="bufferBarrier">is a pointer to an array of <see cref="VkBufferMemoryBarrier"/> structures.</param> /// <param name="imageBarrier">is a pointer to an array of <see cref="VkImageMemoryBarrier"/> structures.</param> public void PipelineBarrier(VkPipelineStageFlag srcStageMask, VkPipelineStageFlag dstStageMask, VkDependencyFlag dependencyFlags, Span <VkMemoryBarrier> barrier, Span <VkBufferMemoryBarrier> bufferBarrier, Span <VkImageMemoryBarrier> imageBarrier) { Handle.PipelineBarrier(srcStageMask, dstStageMask, dependencyFlags, barrier, bufferBarrier, imageBarrier); }
/// <summary> /// To record a pipeline barrier, call: /// </summary> /// <param name="srcStageMask">is a bitmask of <c>VkPipelineStageFlagBits</c> specifying the <a href='https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#synchronization-pipeline-stages-masks'> source stage mask</a>.</param> /// <param name="dstStageMask">is a bitmask of <c>VkPipelineStageFlagBits</c> specifying the <a href='https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#synchronization-pipeline-stages-masks'> destination stage mask</a>.</param> /// <param name="dependencyFlags">is a bitmask of <c>VkDependencyFlagBits</c> specifying how execution and memory dependencies are formed.</param> /// <param name="barrier">is a pointer to an array of <see cref="VkMemoryBarrier"/> structures.</param> /// <param name="bufferBarrier">is a pointer to an array of <see cref="VkBufferMemoryBarrier"/> structures.</param> /// <param name="imageBarrier">is a pointer to an array of <see cref="VkImageMemoryBarrier"/> structures.</param> public void PipelineBarrier(VkPipelineStageFlag srcStageMask, VkPipelineStageFlag dstStageMask, VkDependencyFlag dependencyFlags, VkMemoryBarrier barrier = default(VkMemoryBarrier), VkBufferMemoryBarrier bufferBarrier = default(VkBufferMemoryBarrier), VkImageMemoryBarrier imageBarrier = default(VkImageMemoryBarrier)) { unsafe { VkCommandBuffer.vkCmdPipelineBarrier(Handle, srcStageMask, dstStageMask, dependencyFlags, barrier.SType != VkStructureType.BufferMemoryBarrier ? 0 : 1u, &barrier, bufferBarrier.SType != VkStructureType.BufferMemoryBarrier ? 0 : 1u, &bufferBarrier, imageBarrier.SType != VkStructureType.ImageMemoryBarrier ? 0 : 1u, &imageBarrier); } }
/// <summary> /// Records the an image memory barrier /// </summary> /// <param name="img">image</param> /// <param name="format">format</param> /// <param name="old">old layout</param> /// <param name="new">new layout</param> /// <param name="range">resource range</param> /// <param name="srcQueue">source queue</param> /// <param name="dstQueue">destination queue</param> /// <param name="flags">dependency flags</param> /// <returns>this</returns> public void ImageMemoryBarrier(VkImage img, VkFormat format, VkImageLayout old, VkImageLayout @new, VkImageSubresourceRange range, VkDependencyFlag flags = 0, uint srcQueue = Vulkan.QueueFamilyIgnored, uint dstQueue = Vulkan.QueueFamilyIgnored) { var spec = new VkImageMemoryBarrier() { SType = VkStructureType.ImageMemoryBarrier, PNext = IntPtr.Zero, OldLayout = old, NewLayout = @new, SrcQueueFamilyIndex = srcQueue, DstQueueFamilyIndex = dstQueue, Image = img, SubresourceRange = range, SrcAccessMask = VkAccessFlag.None, DstAccessMask = VkAccessFlag.None }; GetStageInfo(old, out VkPipelineStageFlag srcFlag, out spec.SrcAccessMask); GetStageInfo(@new, out VkPipelineStageFlag dstFlag, out spec.DstAccessMask); PipelineBarrier(srcFlag, dstFlag, flags, default(VkMemoryBarrier), default(VkBufferMemoryBarrier), spec); }
/// <summary> /// Sets the flags for this dependency. /// <seealso cref="VkSubpassDependency.DependencyFlags"/> /// </summary> /// <param name="flags">Dependency flags</param> /// <returns>this</returns> public TBuilder Flags(VkDependencyFlag flags) { _desc.DependencyFlags = flags; return((TBuilder)this); }