public unsafe void InsertBarrier(CommandBuffer commandBuffer, bool isWrite) { // If the last access is write, we always need a barrier to be sure we will read or modify // the correct data. // If the last access is read, and current one is a write, we need to wait until the // read finishes to avoid overwriting data still in use. // Otherwise, if the last access is a read and the current one too, we don't need barriers. bool needsBarrier = isWrite || _lastAccessIsWrite; _lastAccessIsWrite = isWrite; if (needsBarrier) { MemoryBarrier memoryBarrier = new MemoryBarrier() { SType = StructureType.MemoryBarrier, SrcAccessMask = DefaultAccessFlags, DstAccessMask = DefaultAccessFlags }; _gd.Api.CmdPipelineBarrier( commandBuffer, PipelineStageFlags.PipelineStageAllCommandsBit, PipelineStageFlags.PipelineStageAllCommandsBit, DependencyFlags.DependencyDeviceGroupBit, 1, memoryBarrier, 0, null, 0, null); } }
/// <summary> /// Insert this barrier if you want to sample from a output that was rendered before this /// barrier. NOTE: Assumes you only want to sample the output in a fragment stage atm /// </summary> internal static void InsertOutputReadBarrier(CommandBuffer commandbuffer) { MemoryBarrier barrier = new MemoryBarrier( srcAccessMask: Accesses.ColorAttachmentWrite | Accesses.DepthStencilAttachmentWrite, dstAccessMask: Accesses.ShaderRead | Accesses.UniformRead); commandbuffer.CmdPipelineBarrier( srcStageMask: PipelineStages.ColorAttachmentOutput | PipelineStages.LateFragmentTests, dstStageMask: PipelineStages.FragmentShader, memoryBarriers: new [] { barrier }); }
/// <summary cref="IBackendCodeGenerator.GenerateCode(MemoryBarrier)"/> public void GenerateCode(MemoryBarrier barrier) { var fenceFlags = CLInstructions.GetMemoryFenceFlags(true); var command = CLInstructions.GetMemoryBarrier( barrier.Kind, out string memoryScope); using var statement = BeginStatement(command); statement.BeginArguments(); statement.AppendArgument(); statement.AppendCommand(fenceFlags); statement.AppendArgument(); statement.AppendCommand(memoryScope); statement.EndArguments(); }
public unsafe void Barrier() { MemoryBarrier memoryBarrier = new MemoryBarrier() { SType = StructureType.MemoryBarrier, SrcAccessMask = AccessFlags.AccessMemoryReadBit | AccessFlags.AccessMemoryWriteBit, DstAccessMask = AccessFlags.AccessMemoryReadBit | AccessFlags.AccessMemoryWriteBit }; Gd.Api.CmdPipelineBarrier( CommandBuffer, PipelineStageFlags.PipelineStageFragmentShaderBit, PipelineStageFlags.PipelineStageFragmentShaderBit, 0, 1, memoryBarrier, 0, null, 0, null); }
private static void Load_VERSION_4_2() { DrawArraysInstancedBaseInstance = GetAddress <DrawArraysInstancedBaseInstance>("glDrawArraysInstancedBaseInstance"); _DrawElementsInstancedBaseInstance = GetAddress <DrawElementsInstancedBaseInstance>("glDrawElementsInstancedBaseInstance"); _DrawElementsInstancedBaseVertexBaseInstance = GetAddress <DrawElementsInstancedBaseVertexBaseInstance>("glDrawElementsInstancedBaseVertexBaseInstance"); GetInternalformati = GetAddress <GetInternalformati>("glGetInternalformativ"); GetInternalformativ = GetAddress <GetInternalformativ>("glGetInternalformativ"); GetActiveAtomicCounterBufferi = GetAddress <GetActiveAtomicCounterBufferi>("glGetActiveAtomicCounterBufferiv"); GetActiveAtomicCounterBufferiv = GetAddress <GetActiveAtomicCounterBufferiv>("glGetActiveAtomicCounterBufferiv"); BindImageTexture = GetAddress <BindImageTexture>("glBindImageTexture"); MemoryBarrier = GetAddress <MemoryBarrier>("glMemoryBarrier"); TexStorage1D = GetAddress <TexStorage1D>("glTexStorage1D"); TexStorage2D = GetAddress <TexStorage2D>("glTexStorage2D"); TexStorage3D = GetAddress <TexStorage3D>("glTexStorage3D"); DrawTransformFeedbackInstanced = GetAddress <DrawTransformFeedbackInstanced>("glDrawTransformFeedbackInstanced"); DrawTransformFeedbackStreamInstanced = GetAddress <DrawTransformFeedbackStreamInstanced>("glDrawTransformFeedbackStreamInstanced"); VERSION_4_2 = VERSION_4_1 && DrawArraysInstancedBaseInstance != null && _DrawElementsInstancedBaseInstance != null && _DrawElementsInstancedBaseVertexBaseInstance != null && GetInternalformati != null && GetInternalformativ != null && GetActiveAtomicCounterBufferi != null && GetActiveAtomicCounterBufferiv != null && BindImageTexture != null && MemoryBarrier != null && TexStorage1D != null && TexStorage2D != null && TexStorage3D != null && DrawTransformFeedbackInstanced != null && DrawTransformFeedbackStreamInstanced != null; }
public void Visit(MemoryBarrier barrier) { }
/// <summary cref="IValueVisitor.Visit(MemoryBarrier)"/> public void Visit(MemoryBarrier barrier) => CodeGenerator.GenerateCode(barrier);
/// <summary cref="IValueVisitor.Visit(MemoryBarrier)"/> public void Visit(MemoryBarrier barrier) { var command = PTXInstructions.GetMemoryBarrier(barrier.Kind); Command(command); }
/// <summary cref="IBackendCodeGenerator.GenerateCode(MemoryBarrier)"/> public void GenerateCode(MemoryBarrier barrier) { var command = PTXInstructions.GetMemoryBarrier(barrier.Kind); Command(command); }
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)); } }
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)); } } }
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);
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 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); }
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); }
public void MemoryBarrier(MemoryBarrier barriers) { _glMemoryBarrier(barriers); CheckForError(); }