コード例 #1
0
ファイル: ClusterRenderer.cs プロジェクト: Gaiaxis/SharpGame
        protected void ClearBuffers(CommandBuffer cmd_buf, int imageIndex)
        {
            var queryPool = query_pool[imageIndex];

            // clean up buffers
            unsafe
            {
                VkBufferMemoryBarrier *transfer_barriers = stackalloc VkBufferMemoryBarrier[]
                {
                    new VkBufferMemoryBarrier(gridFlags, VkAccessFlags.ShaderRead | VkAccessFlags.ShaderWrite, VkAccessFlags.TransferWrite),
                    new VkBufferMemoryBarrier(gridLightCounts, VkAccessFlags.ShaderRead | VkAccessFlags.ShaderWrite, VkAccessFlags.TransferWrite),
                    new VkBufferMemoryBarrier(gridLightCountOffsets, VkAccessFlags.ShaderRead | VkAccessFlags.ShaderWrite, VkAccessFlags.TransferWrite),
                    new VkBufferMemoryBarrier(lightList, VkAccessFlags.ShaderRead | VkAccessFlags.ShaderWrite, VkAccessFlags.TransferWrite)
                };

                //cmd_buf.WriteTimestamp(PipelineStageFlags.TopOfPipe, queryPool, QUERY_TRANSFER * 2);

                cmd_buf.PipelineBarrier(VkPipelineStageFlags.FragmentShader,
                                        VkPipelineStageFlags.Transfer,
                                        VkDependencyFlags.ByRegion,
                                        0, null,
                                        4,
                                        transfer_barriers,
                                        0, null);

                cmd_buf.FillBuffer(gridFlags, 0, Vulkan.WholeSize, 0);
                cmd_buf.FillBuffer(lightBounds, 0, Vulkan.WholeSize, 0);
                cmd_buf.FillBuffer(gridLightCounts, 0, Vulkan.WholeSize, 0);
                cmd_buf.FillBuffer(gridLightCountOffsets, 0, Vulkan.WholeSize, 0);
                cmd_buf.FillBuffer(gridLightCountTotal, 0, Vulkan.WholeSize, 0);
                cmd_buf.FillBuffer(lightList, 0, Vulkan.WholeSize, 0);
                cmd_buf.FillBuffer(gridLightCountsCompare, 0, Vulkan.WholeSize, 0);

                VkBufferMemoryBarrier *transfer_barriers1 = stackalloc VkBufferMemoryBarrier[]
                {
                    new VkBufferMemoryBarrier(gridFlags, VkAccessFlags.TransferWrite, VkAccessFlags.ShaderRead | VkAccessFlags.ShaderWrite),
                    new VkBufferMemoryBarrier(gridLightCounts, VkAccessFlags.TransferWrite, VkAccessFlags.ShaderRead | VkAccessFlags.ShaderWrite),
                    new VkBufferMemoryBarrier(gridLightCountOffsets, VkAccessFlags.TransferWrite, VkAccessFlags.ShaderRead | VkAccessFlags.ShaderWrite),
                    new VkBufferMemoryBarrier(lightList, VkAccessFlags.TransferWrite, VkAccessFlags.ShaderRead | VkAccessFlags.ShaderWrite)
                };

                cmd_buf.PipelineBarrier(VkPipelineStageFlags.Transfer,
                                        VkPipelineStageFlags.FragmentShader,
                                        VkDependencyFlags.ByRegion,
                                        0, null,
                                        4,
                                        transfer_barriers1,
                                        0, null);

                //cmd_buf.WriteTimestamp(PipelineStageFlags.Transfer, queryPool, QUERY_TRANSFER * 2 + 1);
            }
        }
コード例 #2
0
        internal void Copy_Buffer(VkBuffer sourceBuffer, VkBuffer destinationBuffer, VkBufferCopy bufferCopy)
        {
            VkBufferMemoryBarrier *bufferBarriers = stackalloc VkBufferMemoryBarrier[2];

            bufferBarriers[0x0] = new()
            {
                sType = VkStructureType.BufferMemoryBarrier,
                pNext = null,
            };

            bufferBarriers[0x1] = new()
            {
                sType = VkStructureType.BufferMemoryBarrier,
                pNext = null,
            };
            //vkCmdPipelineBarrier()
            vkCmdCopyBuffer(handle, sourceBuffer, destinationBuffer, 1, &bufferCopy);
        }
コード例 #3
0
        protected unsafe void ComputeLight(ComputePass renderPass, RenderContext rc, CommandBuffer cmd_buf)
        {
            tile_count_x = ((uint)View.ViewRect.extent.width - 1) / TILE_WIDTH + 1;
            tile_count_y = ((uint)View.ViewRect.extent.height - 1) / TILE_HEIGHT + 1;

            cmd_buf.ResetQueryPool(QueryPool, 4, 6);
            //cmd_buf.WriteTimestamp(PipelineStageFlags.TopOfPipe, QueryPool, QUERY_CALC_LIGHT_GRIDS * 2);

            VkBufferMemoryBarrier *barriers = stackalloc VkBufferMemoryBarrier[2];

            barriers[0] = new VkBufferMemoryBarrier(light_pos_ranges.Buffer, VkAccessFlags.HostWrite, VkAccessFlags.ShaderRead);

            cmd_buf.PipelineBarrier(VkPipelineStageFlags.Host, VkPipelineStageFlags.ComputeShader, VkDependencyFlags.ByRegion, 0, null, 1, barriers, 0, null);

            // --------------------- calc light grids ---------------------

            // reads grid_flags, light_pos_ranges
            // writes light_bounds, grid_light_counts

            {
                var pass = clusterLight.Pass[0];
                cmd_buf.BindComputePipeline(pass);
                cmd_buf.BindComputeResourceSet(pass.PipelineLayout, 1, computeSet0);
                cmd_buf.BindComputeResourceSet(pass.PipelineLayout, 2, computeSet1);
                cmd_buf.Dispatch((num_lights - 1) / 32 + 1, 1, 1);

                //   cmd_buf.WriteTimestamp(PipelineStageFlags.ComputeShader, QueryPool, QUERY_CALC_LIGHT_GRIDS * 2 + 1);

                barriers[0] = new VkBufferMemoryBarrier(lightBounds, VkAccessFlags.ShaderRead | VkAccessFlags.ShaderWrite,
                                                        VkAccessFlags.ShaderRead | VkAccessFlags.ShaderWrite);
                barriers[1]        = barriers[0];
                barriers[1].buffer = gridLightCounts;
                cmd_buf.PipelineBarrier(VkPipelineStageFlags.ComputeShader,
                                        VkPipelineStageFlags.ComputeShader,
                                        VkDependencyFlags.ByRegion,
                                        0, null, 2, barriers, 0, null);
            }

            // --------------------- calc grid offsets ---------------------

            // reads grid_flags, grid_light_counts
            // writes grid_light_count_total, grid_light_offsets
            {
                //    cmd_buf.WriteTimestamp(PipelineStageFlags.TopOfPipe, QueryPool, QUERY_CALC_GRID_OFFSETS * 2);

                var pass = clusterLight.Pass[1];
                cmd_buf.BindComputePipeline(pass);
                cmd_buf.BindComputeResourceSet(pass.PipelineLayout, 1, computeSet0);
                cmd_buf.BindComputeResourceSet(pass.PipelineLayout, 2, computeSet1);

                cmd_buf.Dispatch((tile_count_x - 1) / 16 + 1, (tile_count_y - 1) / 16 + 1, TILE_COUNT_Z);

                //    cmd_buf.WriteTimestamp(PipelineStageFlags.ComputeShader, QueryPool, QUERY_CALC_GRID_OFFSETS * 2 + 1);

                barriers[0].buffer = gridLightCountTotal;
                barriers[1].buffer = gridLightCountOffsets;
                cmd_buf.PipelineBarrier(VkPipelineStageFlags.ComputeShader,
                                        VkPipelineStageFlags.ComputeShader,
                                        VkDependencyFlags.ByRegion,
                                        0, null, 1, barriers, 0, null);
            }

            // --------------------- calc light list ---------------------

            // reads grid_flags, light_bounds, grid_light_counts, grid_light_offsets
            // writes grid_light_counts_compare, light_list
            {
                //   cmd_buf.WriteTimestamp(PipelineStageFlags.TopOfPipe, QueryPool, QUERY_CALC_LIGHT_LIST * 2);

                var pass = clusterLight.Pass[2];

                cmd_buf.BindComputePipeline(pass);
                cmd_buf.BindComputeResourceSet(pass.PipelineLayout, 1, computeSet0);
                cmd_buf.BindComputeResourceSet(pass.PipelineLayout, 2, computeSet1);
                cmd_buf.Dispatch((num_lights - 1) / 32 + 1, 1, 1);

                //    cmd_buf.WriteTimestamp(PipelineStageFlags.FragmentShader, QueryPool, QUERY_CALC_LIGHT_LIST * 2 + 1);
            }
        }
コード例 #4
0
 internal extern static unsafe void vkCmdPipelineBarrier(IntPtr commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, UInt32 memoryBarrierCount, VkMemoryBarrier *pMemoryBarriers, UInt32 bufferMemoryBarrierCount, VkBufferMemoryBarrier *pBufferMemoryBarriers, UInt32 imageMemoryBarrierCount, VkImageMemoryBarrier *pImageMemoryBarriers);
コード例 #5
0
 internal extern static unsafe void vkCmdWaitEvents(IntPtr commandBuffer, UInt32 eventCount, UInt64 *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, UInt32 memoryBarrierCount, VkMemoryBarrier *pMemoryBarriers, UInt32 bufferMemoryBarrierCount, VkBufferMemoryBarrier *pBufferMemoryBarriers, UInt32 imageMemoryBarrierCount, VkImageMemoryBarrier *pImageMemoryBarriers);
コード例 #6
0
        public void CmdPipelineBarrier(MgPipelineStageFlagBits srcStageMask, MgPipelineStageFlagBits dstStageMask, MgDependencyFlagBits dependencyFlags, MgMemoryBarrier[] pMemoryBarriers, MgBufferMemoryBarrier[] pBufferMemoryBarriers, MgImageMemoryBarrier[] pImageMemoryBarriers)
        {
            unsafe
            {
                var memBarrierCount = pMemoryBarriers != null ? (uint)pMemoryBarriers.Length : 0U;
                var pMemBarriers    = stackalloc VkMemoryBarrier[(int)memBarrierCount];

                for (var i = 0; i < memBarrierCount; ++i)
                {
                    pMemBarriers[i] = new VkMemoryBarrier
                    {
                        sType         = VkStructureType.StructureTypeMemoryBarrier,
                        pNext         = IntPtr.Zero,
                        srcAccessMask = (VkAccessFlags)pMemoryBarriers[i].SrcAccessMask,
                        dstAccessMask = (VkAccessFlags)pMemoryBarriers[i].DstAccessMask,
                    };
                }


                uint bufBarrierCount = pBufferMemoryBarriers != null ? (uint)pBufferMemoryBarriers.Length : 0U;
                var  pBufBarriers    = stackalloc VkBufferMemoryBarrier[(int)bufBarrierCount];
                for (var j = 0; j < bufBarrierCount; ++j)
                {
                    var current = pBufferMemoryBarriers[j];
                    var bBuffer = (VkBuffer)current.Buffer;
                    Debug.Assert(bBuffer != null);

                    pBufBarriers[j] = new VkBufferMemoryBarrier
                    {
                        sType               = VkStructureType.StructureTypeBufferMemoryBarrier,
                        pNext               = IntPtr.Zero,
                        dstAccessMask       = (VkAccessFlags)current.DstAccessMask,
                        srcAccessMask       = (VkAccessFlags)current.SrcAccessMask,
                        srcQueueFamilyIndex = current.SrcQueueFamilyIndex,
                        dstQueueFamilyIndex = current.DstQueueFamilyIndex,
                        buffer              = bBuffer.Handle,
                        offset              = current.Offset,
                        size = current.Size,
                    };
                }


                uint imgBarriersCount = pImageMemoryBarriers != null ? (uint)pImageMemoryBarriers.Length : 0U;
                var  pImgBarriers     = stackalloc VkImageMemoryBarrier[(int)imgBarriersCount];

                for (var k = 0; k < imgBarriersCount; ++k)
                {
                    var current = pImageMemoryBarriers[k];
                    var bImage  = (VkImage)current.Image;
                    Debug.Assert(bImage != null);

                    pImgBarriers[k] = new VkImageMemoryBarrier
                    {
                        sType               = VkStructureType.StructureTypeImageMemoryBarrier,
                        pNext               = IntPtr.Zero,
                        dstAccessMask       = (VkAccessFlags)current.DstAccessMask,
                        srcAccessMask       = (VkAccessFlags)current.SrcAccessMask,
                        oldLayout           = (VkImageLayout)current.OldLayout,
                        newLayout           = (VkImageLayout)current.NewLayout,
                        srcQueueFamilyIndex = current.SrcQueueFamilyIndex,
                        dstQueueFamilyIndex = current.DstQueueFamilyIndex,
                        image               = bImage.Handle,
                        subresourceRange    = new VkImageSubresourceRange
                        {
                            aspectMask     = (VkImageAspectFlags)current.SubresourceRange.AspectMask,
                            baseArrayLayer = current.SubresourceRange.BaseArrayLayer,
                            baseMipLevel   = current.SubresourceRange.BaseMipLevel,
                            layerCount     = current.SubresourceRange.LayerCount,
                            levelCount     = current.SubresourceRange.LevelCount,
                        }
                    };
                }

                VkMemoryBarrier *      mems   = memBarrierCount > 0 ? pMemBarriers : null;
                VkBufferMemoryBarrier *bufs   = bufBarrierCount > 0 ? pBufBarriers : null;
                VkImageMemoryBarrier * images = imgBarriersCount > 0 ? pImgBarriers : null;


                Interops.vkCmdPipelineBarrier(Handle,
                                              (VkPipelineStageFlags)srcStageMask,
                                              (VkPipelineStageFlags)dstStageMask,
                                              (VkDependencyFlags)dependencyFlags,
                                              memBarrierCount,
                                              mems,
                                              bufBarrierCount,
                                              bufs,
                                              imgBarriersCount,
                                              images);
            }
        }
コード例 #7
0
        public void CmdWaitEvents(IMgEvent[] pEvents, MgPipelineStageFlagBits srcStageMask, MgPipelineStageFlagBits dstStageMask, MgMemoryBarrier[] pMemoryBarriers, MgBufferMemoryBarrier[] pBufferMemoryBarriers, MgImageMemoryBarrier[] pImageMemoryBarriers)
        {
            unsafe
            {
                var eventHandles = stackalloc UInt64[pEvents.Length];
                var eventCount   = (uint)pEvents.Length;
                for (var i = 0; i < eventCount; ++i)
                {
                    var bEvent = (VkEvent)pEvents[i];
                    Debug.Assert(bEvent != null);
                    eventHandles[i] = bEvent.Handle;
                }

                var memBarrierCount           = 0U;
                VkMemoryBarrier *pMemBarriers = null;
                if (pMemoryBarriers != null)
                {
                    memBarrierCount = (uint)pMemoryBarriers.Length;
                    var tempMem = stackalloc VkMemoryBarrier[pMemoryBarriers.Length];
                    for (var i = 0; i < memBarrierCount; ++i)
                    {
                        tempMem[i] = new VkMemoryBarrier
                        {
                            sType         = VkStructureType.StructureTypeMemoryBarrier,
                            pNext         = IntPtr.Zero,
                            srcAccessMask = (VkAccessFlags)pMemoryBarriers[i].SrcAccessMask,
                            dstAccessMask = (VkAccessFlags)pMemoryBarriers[i].DstAccessMask,
                        };
                    }
                    pMemBarriers = tempMem;
                }

                uint bufBarrierCount = 0;
                VkBufferMemoryBarrier *pBufBarriers = null;
                if (pBufferMemoryBarriers != null)
                {
                    bufBarrierCount = (uint)pBufferMemoryBarriers.Length;
                    var tempBuf = stackalloc VkBufferMemoryBarrier[pBufferMemoryBarriers.Length];
                    for (var i = 0; i < bufBarrierCount; ++i)
                    {
                        var current = pBufferMemoryBarriers[i];
                        var bBuffer = (VkBuffer)current.Buffer;
                        Debug.Assert(bBuffer != null);

                        tempBuf[i] = new VkBufferMemoryBarrier
                        {
                            sType               = VkStructureType.StructureTypeBufferMemoryBarrier,
                            pNext               = IntPtr.Zero,
                            dstAccessMask       = (VkAccessFlags)current.DstAccessMask,
                            srcAccessMask       = (VkAccessFlags)current.SrcAccessMask,
                            srcQueueFamilyIndex = current.SrcQueueFamilyIndex,
                            dstQueueFamilyIndex = current.DstQueueFamilyIndex,
                            buffer              = bBuffer.Handle,
                            offset              = current.Offset,
                            size = current.Size,
                        };
                    }
                    pBufBarriers = tempBuf;
                }

                uint imgBarriersCount = 0;
                VkImageMemoryBarrier *pImgBarriers = null;

                if (pImageMemoryBarriers != null)
                {
                    imgBarriersCount = (uint)pImageMemoryBarriers.Length;
                    var tempImg = stackalloc VkImageMemoryBarrier[pImageMemoryBarriers.Length];
                    for (var i = 0; i < bufBarrierCount; ++i)
                    {
                        var current = pImageMemoryBarriers[i];
                        var bImage  = (VkImage)current.Image;
                        Debug.Assert(bImage != null);

                        tempImg[i] = new VkImageMemoryBarrier
                        {
                            sType               = VkStructureType.StructureTypeImageMemoryBarrier,
                            pNext               = IntPtr.Zero,
                            dstAccessMask       = (VkAccessFlags)current.DstAccessMask,
                            srcAccessMask       = (VkAccessFlags)current.SrcAccessMask,
                            oldLayout           = (Magnesium.Vulkan.VkImageLayout)current.OldLayout,
                            newLayout           = (Magnesium.Vulkan.VkImageLayout)current.NewLayout,
                            srcQueueFamilyIndex = current.SrcQueueFamilyIndex,
                            dstQueueFamilyIndex = current.DstQueueFamilyIndex,
                            image               = bImage.Handle,
                            subresourceRange    = new VkImageSubresourceRange
                            {
                                aspectMask     = (Magnesium.Vulkan.VkImageAspectFlags)current.SubresourceRange.AspectMask,
                                baseArrayLayer = current.SubresourceRange.BaseArrayLayer,
                                baseMipLevel   = current.SubresourceRange.BaseMipLevel,
                                layerCount     = current.SubresourceRange.LayerCount,
                                levelCount     = current.SubresourceRange.LevelCount,
                            }
                        };
                    }
                    pImgBarriers = tempImg;
                }

                Interops.vkCmdWaitEvents(
                    this.Handle,
                    eventCount,
                    eventHandles,
                    (VkPipelineStageFlags)srcStageMask,
                    (VkPipelineStageFlags)dstStageMask,
                    memBarrierCount,
                    pMemBarriers,
                    bufBarrierCount,
                    pBufBarriers,
                    imgBarriersCount,
                    pImgBarriers);
            }
        }
コード例 #8
0
 public void PipelineBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint memoryBarrierCount, VkMemoryBarrier *memoryBarriers, uint bufferMemoryBarrierCount, VkBufferMemoryBarrier *bufferMemoryBarriers, VkImageMemoryBarrier[] imageMemoryBarriers)
 {
 }
コード例 #9
0
 public void PipelineBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint memoryBarrierCount, VkMemoryBarrier *memoryBarriers, uint bufferMemoryBarrierCount, VkBufferMemoryBarrier *bufferMemoryBarriers, VkImageMemoryBarrier imageMemoryBarriers)
 {
     vkCmdPipelineBarrier(handle, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, memoryBarriers, bufferMemoryBarrierCount, null, 1, &imageMemoryBarriers);
 }