/// <summary> /// Insert a memory dependency. /// </summary> /// <param name="sourceStageMask"> /// </param> /// <param name="destinationStageMask"> /// </param> /// <param name="sourceAccessMask"> /// </param> /// <param name="destinationAccessMask"> /// </param> /// <param name="oldLayout"> /// </param> /// <param name="newLayout"> /// </param> /// <param name="sourceQueueFamilyIndex"> /// </param> /// <param name="destinationQueueFamilyIndex"> /// </param> /// <param name="image"> /// </param> /// <param name="subresourceRange"> /// </param> /// <param name="dependencyFlags"> /// </param> public unsafe void PipelineBarrier(PipelineStageFlags sourceStageMask, PipelineStageFlags destinationStageMask, AccessFlags sourceAccessMask, AccessFlags destinationAccessMask, ImageLayout oldLayout, ImageLayout newLayout, uint sourceQueueFamilyIndex, uint destinationQueueFamilyIndex, Image image, ImageSubresourceRange subresourceRange, DependencyFlags dependencyFlags = DependencyFlags.None) { try { Interop.ImageMemoryBarrier marshalledImageMemoryBarrier = default; marshalledImageMemoryBarrier.SType = StructureType.ImageMemoryBarrier; marshalledImageMemoryBarrier.Next = null; marshalledImageMemoryBarrier.SourceAccessMask = sourceAccessMask; marshalledImageMemoryBarrier.DestinationAccessMask = destinationAccessMask; marshalledImageMemoryBarrier.OldLayout = oldLayout; marshalledImageMemoryBarrier.NewLayout = newLayout; marshalledImageMemoryBarrier.SourceQueueFamilyIndex = sourceQueueFamilyIndex; marshalledImageMemoryBarrier.DestinationQueueFamilyIndex = destinationQueueFamilyIndex; marshalledImageMemoryBarrier.Image = image.handle; marshalledImageMemoryBarrier.SubresourceRange = subresourceRange; Interop.VkCommandBufferPipelineBarrierDelegate commandDelegate = commandCache.GetCommandDelegate <Interop.VkCommandBufferPipelineBarrierDelegate>("vkCmdPipelineBarrier", ""); commandDelegate(this.handle, sourceStageMask, destinationStageMask, dependencyFlags, 0, null, 0, null, 1, &marshalledImageMemoryBarrier); } finally { Interop.HeapUtil.FreeAll(); } }
public static unsafe void InsertBufferBarrier( VulkanRenderer gd, CommandBuffer commandBuffer, VkBuffer buffer, AccessFlags srcAccessMask, AccessFlags dstAccessMask, PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, int offset, int size) { BufferMemoryBarrier memoryBarrier = new BufferMemoryBarrier() { SType = StructureType.BufferMemoryBarrier, SrcAccessMask = srcAccessMask, DstAccessMask = dstAccessMask, SrcQueueFamilyIndex = Vk.QueueFamilyIgnored, DstQueueFamilyIndex = Vk.QueueFamilyIgnored, Buffer = buffer, Offset = (ulong)offset, Size = (ulong)size }; gd.Api.CmdPipelineBarrier( commandBuffer, srcStageMask, dstStageMask, 0, 0, null, 1, memoryBarrier, 0, null); }
public SubpassDependency2 ( StructureType sType = StructureType.SubpassDependency2, void *pNext = default, uint srcSubpass = default, uint dstSubpass = default, PipelineStageFlags srcStageMask = default, PipelineStageFlags dstStageMask = default, AccessFlags srcAccessMask = default, AccessFlags dstAccessMask = default, DependencyFlags dependencyFlags = default, int viewOffset = default ) { SType = sType; PNext = pNext; SrcSubpass = srcSubpass; DstSubpass = dstSubpass; SrcStageMask = srcStageMask; DstStageMask = dstStageMask; SrcAccessMask = srcAccessMask; DstAccessMask = dstAccessMask; DependencyFlags = dependencyFlags; ViewOffset = viewOffset; }
/// <summary> /// /// </summary> public SubpassDependency(uint sourceSubpass, uint destinationSubpass, PipelineStageFlags sourceStageMask, PipelineStageFlags destinationStageMask, AccessFlags sourceAccessMask, AccessFlags destinationAccessMask, DependencyFlags dependencyFlags) { this.SourceSubpass = sourceSubpass; this.DestinationSubpass = destinationSubpass; this.SourceStageMask = sourceStageMask; this.DestinationStageMask = destinationStageMask; this.SourceAccessMask = sourceAccessMask; this.DestinationAccessMask = destinationAccessMask; this.DependencyFlags = dependencyFlags; }
public void CmdWaitEvent(Event pEvent, PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, MemoryBarrier pMemoryBarrier, BufferMemoryBarrier pBufferMemoryBarrier, ImageMemoryBarrier pImageMemoryBarrier) { unsafe { fixed(UInt64 *ptrpEvent = &pEvent.m) { Interop.NativeMethods.vkCmdWaitEvents(this.m, (UInt32)(pEvent != null ? 1 : 0), ptrpEvent, srcStageMask, dstStageMask, (UInt32)(pMemoryBarrier != null ? 1 : 0), pMemoryBarrier != null ? pMemoryBarrier.m : (Interop.MemoryBarrier *) default(IntPtr), (UInt32)(pBufferMemoryBarrier != null ? 1 : 0), pBufferMemoryBarrier != null ? pBufferMemoryBarrier.m : (Interop.BufferMemoryBarrier *) default(IntPtr), (UInt32)(pImageMemoryBarrier != null ? 1 : 0), pImageMemoryBarrier != null ? pImageMemoryBarrier.m : (Interop.ImageMemoryBarrier *) default(IntPtr)); } } }
public QueueFamilyCheckpointPropertiesNV ( StructureType sType = StructureType.QueueFamilyCheckpointPropertiesNV, void *pNext = default, PipelineStageFlags checkpointExecutionStageMask = default ) { SType = sType; PNext = pNext; CheckpointExecutionStageMask = checkpointExecutionStageMask; }
public CheckpointDataNV ( StructureType sType = StructureType.CheckpointDataNV, void *pNext = default, PipelineStageFlags stage = default, void *pCheckpointMarker = default ) { SType = sType; PNext = pNext; Stage = stage; PCheckpointMarker = pCheckpointMarker; }
public void CmdWaitEvents(Event[] pEvents, PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, MemoryBarrier[] pMemoryBarriers, BufferMemoryBarrier[] pBufferMemoryBarriers, ImageMemoryBarrier[] pImageMemoryBarriers) { unsafe { var arraypEvents = pEvents == null ? IntPtr.Zero : Marshal.AllocHGlobal(pEvents.Length * sizeof(UInt64)); var lenpEvents = pEvents == null ? 0 : pEvents.Length; if (pEvents != null) { for (int i = 0; i < pEvents.Length; i++) { ((UInt64 *)arraypEvents) [i] = (pEvents [i].m); } } var arraypMemoryBarriers = pMemoryBarriers == null ? IntPtr.Zero : Marshal.AllocHGlobal(pMemoryBarriers.Length * sizeof(Interop.MemoryBarrier)); var lenpMemoryBarriers = pMemoryBarriers == null ? 0 : pMemoryBarriers.Length; if (pMemoryBarriers != null) { for (int i = 0; i < pMemoryBarriers.Length; i++) { ((Interop.MemoryBarrier *)arraypMemoryBarriers) [i] = *(pMemoryBarriers [i].m); } } var arraypBufferMemoryBarriers = pBufferMemoryBarriers == null ? IntPtr.Zero : Marshal.AllocHGlobal(pBufferMemoryBarriers.Length * sizeof(Interop.BufferMemoryBarrier)); var lenpBufferMemoryBarriers = pBufferMemoryBarriers == null ? 0 : pBufferMemoryBarriers.Length; if (pBufferMemoryBarriers != null) { for (int i = 0; i < pBufferMemoryBarriers.Length; i++) { ((Interop.BufferMemoryBarrier *)arraypBufferMemoryBarriers) [i] = *(pBufferMemoryBarriers [i].m); } } var arraypImageMemoryBarriers = pImageMemoryBarriers == null ? IntPtr.Zero : Marshal.AllocHGlobal(pImageMemoryBarriers.Length * sizeof(Interop.ImageMemoryBarrier)); var lenpImageMemoryBarriers = pImageMemoryBarriers == null ? 0 : pImageMemoryBarriers.Length; if (pImageMemoryBarriers != null) { for (int i = 0; i < pImageMemoryBarriers.Length; i++) { ((Interop.ImageMemoryBarrier *)arraypImageMemoryBarriers) [i] = *(pImageMemoryBarriers [i].m); } } Interop.NativeMethods.vkCmdWaitEvents(this.m, (uint)lenpEvents, (UInt64 *)arraypEvents, srcStageMask, dstStageMask, (uint)lenpMemoryBarriers, (Interop.MemoryBarrier *)arraypMemoryBarriers, (uint)lenpBufferMemoryBarriers, (Interop.BufferMemoryBarrier *)arraypBufferMemoryBarriers, (uint)lenpImageMemoryBarriers, (Interop.ImageMemoryBarrier *)arraypImageMemoryBarriers); Marshal.FreeHGlobal(arraypEvents); Marshal.FreeHGlobal(arraypMemoryBarriers); Marshal.FreeHGlobal(arraypBufferMemoryBarriers); Marshal.FreeHGlobal(arraypImageMemoryBarriers); } }
public SubpassDependency ( uint srcSubpass = default, uint dstSubpass = default, PipelineStageFlags srcStageMask = default, PipelineStageFlags dstStageMask = default, AccessFlags srcAccessMask = default, AccessFlags dstAccessMask = default, DependencyFlags dependencyFlags = default ) { SrcSubpass = srcSubpass; DstSubpass = dstSubpass; SrcStageMask = srcStageMask; DstStageMask = dstStageMask; SrcAccessMask = srcAccessMask; DstAccessMask = dstAccessMask; DependencyFlags = dependencyFlags; }
public static unsafe void InsertImageBarrier( Vk api, CommandBuffer commandBuffer, Image image, AccessFlags srcAccessMask, AccessFlags dstAccessMask, PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, ImageAspectFlags aspectFlags, int firstLayer, int firstLevel, int layers, int levels) { ImageMemoryBarrier memoryBarrier = new ImageMemoryBarrier() { SType = StructureType.ImageMemoryBarrier, SrcAccessMask = srcAccessMask, DstAccessMask = dstAccessMask, SrcQueueFamilyIndex = Vk.QueueFamilyIgnored, DstQueueFamilyIndex = Vk.QueueFamilyIgnored, Image = image, OldLayout = ImageLayout.General, NewLayout = ImageLayout.General, SubresourceRange = new ImageSubresourceRange(aspectFlags, (uint)firstLevel, (uint)levels, (uint)firstLayer, (uint)layers) }; api.CmdPipelineBarrier( commandBuffer, srcStageMask, dstStageMask, 0, 0, null, 0, null, 1, memoryBarrier); }
public void CmdPipelineBarrier(PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, DependencyFlags dependencyFlags, MemoryBarrier[] pMemoryBarriers, BufferMemoryBarrier[] pBufferMemoryBarriers, ImageMemoryBarrier[] pImageMemoryBarriers) { unsafe { var arraypMemoryBarriers = pMemoryBarriers == null ? IntPtr.Zero : Marshal.AllocHGlobal(pMemoryBarriers.Length * sizeof(Interop.MemoryBarrier)); var lenpMemoryBarriers = pMemoryBarriers == null ? 0 : pMemoryBarriers.Length; if (pMemoryBarriers != null) { for (int i = 0; i < pMemoryBarriers.Length; i++) { ((Interop.MemoryBarrier *)arraypMemoryBarriers) [i] = *(pMemoryBarriers [i].m); } } var arraypBufferMemoryBarriers = pBufferMemoryBarriers == null ? IntPtr.Zero : Marshal.AllocHGlobal(pBufferMemoryBarriers.Length * sizeof(Interop.BufferMemoryBarrier)); var lenpBufferMemoryBarriers = pBufferMemoryBarriers == null ? 0 : pBufferMemoryBarriers.Length; if (pBufferMemoryBarriers != null) { for (int i = 0; i < pBufferMemoryBarriers.Length; i++) { ((Interop.BufferMemoryBarrier *)arraypBufferMemoryBarriers) [i] = *(pBufferMemoryBarriers [i].m); } } var arraypImageMemoryBarriers = pImageMemoryBarriers == null ? IntPtr.Zero : Marshal.AllocHGlobal(pImageMemoryBarriers.Length * sizeof(Interop.ImageMemoryBarrier)); var lenpImageMemoryBarriers = pImageMemoryBarriers == null ? 0 : pImageMemoryBarriers.Length; if (pImageMemoryBarriers != null) { for (int i = 0; i < pImageMemoryBarriers.Length; i++) { ((Interop.ImageMemoryBarrier *)arraypImageMemoryBarriers) [i] = *(pImageMemoryBarriers [i].m); } } Interop.NativeMethods.vkCmdPipelineBarrier(this.m, srcStageMask, dstStageMask, dependencyFlags, (uint)lenpMemoryBarriers, (Interop.MemoryBarrier *)arraypMemoryBarriers, (uint)lenpBufferMemoryBarriers, (Interop.BufferMemoryBarrier *)arraypBufferMemoryBarriers, (uint)lenpImageMemoryBarriers, (Interop.ImageMemoryBarrier *)arraypImageMemoryBarriers); Marshal.FreeHGlobal(arraypMemoryBarriers); Marshal.FreeHGlobal(arraypBufferMemoryBarriers); Marshal.FreeHGlobal(arraypImageMemoryBarriers); } }
internal static unsafe extern void vkCmdResetEvent(CommandBuffer commandBuffer, Event @event, PipelineStageFlags stageMask);
internal static unsafe extern void vkCmdResetEvent(IntPtr commandBuffer, UInt64 @event, PipelineStageFlags stageMask);
public partial void CmdWriteBufferMarker([Count(Count = 0)] CommandBuffer commandBuffer, [Count(Count = 0)] PipelineStageFlags pipelineStage, [Count(Count = 0)] Buffer dstBuffer, [Count(Count = 0)] ulong dstOffset, [Count(Count = 0)] uint marker);
internal static unsafe extern void vkCmdWriteTimestamp(CommandBuffer commandBuffer, PipelineStageFlags pipelineStage, QueryPool queryPool, uint query);
public void CmdResetEvent(Event @event, PipelineStageFlags stageMask) { unsafe { Interop.NativeMethods.vkCmdResetEvent(this.m, @event != null ? @event.m : default(UInt64), stageMask); } }
public unsafe void WaitEvents(uint eventCount, Event events, PipelineStageFlags sourceStageMask, PipelineStageFlags destinationStageMask, uint memoryBarrierCount, MemoryBarrier* memoryBarriers, uint bufferMemoryBarrierCount, BufferMemoryBarrier* bufferMemoryBarriers, uint imageMemoryBarrierCount, ImageMemoryBarrier* imageMemoryBarriers) { vkCmdWaitEvents(this, eventCount, &events, sourceStageMask, destinationStageMask, memoryBarrierCount, memoryBarriers, bufferMemoryBarrierCount, bufferMemoryBarriers, imageMemoryBarrierCount, imageMemoryBarriers); }
internal static unsafe extern void vkCmdWriteTimestamp(CommandBuffer commandBuffer, PipelineStageFlags pipelineStage, QueryPool queryPool, UInt32 query);
public void CmdWriteBufferMarkerAMD(PipelineStageFlags pipelineStage, VulkanBuffer dstBuffer, DeviceSize dstOffset, UInt32 marker) { unsafe { Interop.NativeMethods.vkCmdWriteBufferMarkerAMD(this.m, pipelineStage, dstBuffer != null ? dstBuffer.m : default(UInt64), dstOffset, marker); } }
public void CmdWriteTimestamp(PipelineStageFlags pipelineStage, QueryPool queryPool, UInt32 query) { unsafe { Interop.NativeMethods.vkCmdWriteTimestamp(this.m, pipelineStage, queryPool != null ? queryPool.m : default(UInt64), query); } }
public void CmdPipelineBarrier(PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, DependencyFlags dependencyFlag, MemoryBarrier pMemoryBarrier, BufferMemoryBarrier pBufferMemoryBarrier, ImageMemoryBarrier pImageMemoryBarrier) { unsafe { Interop.NativeMethods.vkCmdPipelineBarrier(this.m, srcStageMask, dstStageMask, dependencyFlag, (UInt32)(pMemoryBarrier != null ? 1 : 0), pMemoryBarrier != null ? pMemoryBarrier.m : (Interop.MemoryBarrier *) default(IntPtr), (UInt32)(pBufferMemoryBarrier != null ? 1 : 0), pBufferMemoryBarrier != null ? pBufferMemoryBarrier.m : (Interop.BufferMemoryBarrier *) default(IntPtr), (UInt32)(pImageMemoryBarrier != null ? 1 : 0), pImageMemoryBarrier != null ? pImageMemoryBarrier.m : (Interop.ImageMemoryBarrier *) default(IntPtr)); } }
internal static unsafe extern void vkCmdSetEvent(CommandBuffer commandBuffer, Event @event, PipelineStageFlags stageMask);
internal void TransitionImageLayout(Image image, Format format, ImageLayout oldLayout, ImageLayout newLayout) { PipelineStageFlags sourceStage = PipelineStageFlags.TopOfPipe; PipelineStageFlags destinationStage = PipelineStageFlags.TopOfPipe; AccessFlags MapAccessMask(ImageLayout layout, ref PipelineStageFlags stage) { switch (layout) { case ImageLayout.Undefined: return(AccessFlags.None); case ImageLayout.Preinitialized: stage = PipelineStageFlags.Host; return(AccessFlags.HostWrite); case ImageLayout.TransferSourceOptimal: stage = PipelineStageFlags.Transfer; return(AccessFlags.TransferRead); case ImageLayout.TransferDestinationOptimal: stage = PipelineStageFlags.Transfer; return(AccessFlags.TransferWrite); case ImageLayout.ShaderReadOnlyOptimal: stage = PipelineStageFlags.VertexShader | PipelineStageFlags.FragmentShader; return(AccessFlags.ShaderRead); case ImageLayout.DepthStencilAttachmentOptimal: stage = PipelineStageFlags.EarlyFragmentTests | PipelineStageFlags.LateFragmentTests; return(AccessFlags.DepthStencilAttachmentRead | AccessFlags.DepthStencilAttachmentWrite); } throw new System.Exception($"Unsupported layout transition '{layout}'"); } var commandBuffer = this.BeginSingleTimeCommand(this.barrierCommandPool); var barrier = new ImageMemoryBarrier { OldLayout = oldLayout, NewLayout = newLayout, SourceAccessMask = MapAccessMask(oldLayout, ref sourceStage), DestinationAccessMask = MapAccessMask(newLayout, ref destinationStage), SourceQueueFamilyIndex = Constants.QueueFamilyIgnored, DestinationQueueFamilyIndex = Constants.QueueFamilyIgnored, Image = image, SubresourceRange = new ImageSubresourceRange { AspectMask = newLayout == ImageLayout.DepthStencilAttachmentOptimal ? ImageAspectFlags.Depth : ImageAspectFlags.Color, BaseMipLevel = 0, LevelCount = 1, BaseArrayLayer = 0, LayerCount = 1 } }; commandBuffer[0].PipelineBarrier(sourceStage, destinationStage, null, null, barrier); this.EndSingleTimeCommand(commandBuffer, this.barrierCommandPool, this.barrierQueue); }
internal static unsafe extern void vkCmdWaitEvents(CommandBuffer commandBuffer, UInt32 eventCount, IntPtr pEvents, PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, UInt32 memoryBarrierCount, MemoryBarrier *MemoryBarriers, UInt32 bufferMemoryBarrierCount, BufferMemoryBarrier *BufferMemoryBarriers, UInt32 imageMemoryBarrierCount, ImageMemoryBarrier *ImageMemoryBarriers);
internal static unsafe extern void vkCmdPipelineBarrier(CommandBuffer commandBuffer, PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, DependencyFlags dependencyFlags, UInt32 memoryBarrierCount, MemoryBarrier *MemoryBarriers, UInt32 bufferMemoryBarrierCount, BufferMemoryBarrier *BufferMemoryBarriers, UInt32 imageMemoryBarrierCount, ImageMemoryBarrier *ImageMemoryBarriers);
public unsafe void SetEvent(Event @event, PipelineStageFlags stageMask) { vkCmdSetEvent(this, @event, stageMask); }
public unsafe void WriteTimestamp(PipelineStageFlags pipelineStage, QueryPool queryPool, uint query) { vkCmdWriteTimestamp(this, pipelineStage, queryPool, query); }
public static extern unsafe void vkCmdWaitEvents(IntPtr commandBuffer, uint eventCount, ulong *pEvents, PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, uint memoryBarrierCount, MemoryBarrier *pMemoryBarriers, uint bufferMemoryBarrierCount, BufferMemoryBarrier *pBufferMemoryBarriers, uint imageMemoryBarrierCount, ImageMemoryBarrier *pImageMemoryBarriers);
public static extern void vkCmdResetEvent(IntPtr commandBuffer, ulong @event, PipelineStageFlags stageMask);
public static extern void vkCmdWriteTimestamp(IntPtr commandBuffer, PipelineStageFlags pipelineStage, ulong queryPool, uint query);
public static extern unsafe void vkCmdPipelineBarrier(IntPtr commandBuffer, PipelineStageFlags srcStageMask, PipelineStageFlags dstStageMask, DependencyFlags dependencyFlags, uint memoryBarrierCount, MemoryBarrier *pMemoryBarriers, uint bufferMemoryBarrierCount, BufferMemoryBarrier *pBufferMemoryBarriers, uint imageMemoryBarrierCount, ImageMemoryBarrier *pImageMemoryBarriers);
internal static unsafe extern void vkCmdPipelineBarrier(CommandBuffer commandBuffer, PipelineStageFlags sourceStageMask, PipelineStageFlags destinationStageMask, DependencyFlags dependencyFlags, uint memoryBarrierCount, MemoryBarrier* memoryBarriers, uint bufferMemoryBarrierCount, BufferMemoryBarrier* bufferMemoryBarriers, uint imageMemoryBarrierCount, ImageMemoryBarrier* imageMemoryBarriers);
public unsafe void PipelineBarrier(PipelineStageFlags sourceStageMask, PipelineStageFlags destinationStageMask, DependencyFlags dependencyFlags, uint memoryBarrierCount, MemoryBarrier* memoryBarriers, uint bufferMemoryBarrierCount, BufferMemoryBarrier* bufferMemoryBarriers, uint imageMemoryBarrierCount, ImageMemoryBarrier* imageMemoryBarriers) { vkCmdPipelineBarrier(this, sourceStageMask, destinationStageMask, dependencyFlags, memoryBarrierCount, memoryBarriers, bufferMemoryBarrierCount, bufferMemoryBarriers, imageMemoryBarrierCount, imageMemoryBarriers); }
internal static unsafe extern void vkCmdWaitEvents(CommandBuffer commandBuffer, uint eventCount, Event* events, PipelineStageFlags sourceStageMask, PipelineStageFlags destinationStageMask, uint memoryBarrierCount, MemoryBarrier* memoryBarriers, uint bufferMemoryBarrierCount, BufferMemoryBarrier* bufferMemoryBarriers, uint imageMemoryBarrierCount, ImageMemoryBarrier* imageMemoryBarriers);