Example #1
0
        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 });
        }
Example #3
0
        /// <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();
        }
Example #4
0
        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);
        }
Example #5
0
        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;
        }
Example #6
0
 public void Visit(MemoryBarrier barrier)
 {
 }
Example #7
0
 /// <summary cref="IValueVisitor.Visit(MemoryBarrier)"/>
 public void Visit(MemoryBarrier barrier) =>
 CodeGenerator.GenerateCode(barrier);
Example #8
0
        /// <summary cref="IValueVisitor.Visit(MemoryBarrier)"/>
        public void Visit(MemoryBarrier barrier)
        {
            var command = PTXInstructions.GetMemoryBarrier(barrier.Kind);

            Command(command);
        }
Example #9
0
        /// <summary cref="IBackendCodeGenerator.GenerateCode(MemoryBarrier)"/>
        public void GenerateCode(MemoryBarrier barrier)
        {
            var command = PTXInstructions.GetMemoryBarrier(barrier.Kind);

            Command(command);
        }
Example #10
0
 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));
     }
 }
Example #11
0
 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));
         }
     }
 }
Example #12
0
 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);
Example #13
0
 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);
Example #14
0
 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);
 }
Example #15
0
 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);
 }
Example #16
0
 public void MemoryBarrier(MemoryBarrier barriers)
 {
     _glMemoryBarrier(barriers);
     CheckForError();
 }