Exemplo n.º 1
0
        /// <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));
        }
Exemplo n.º 2
0
 /// <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);
 }
Exemplo n.º 3
0
 /// <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);
     }
 }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
0
 /// <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);
 }