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); } }
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); }
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); } }
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);
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);
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); } }
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); } }
public void PipelineBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint memoryBarrierCount, VkMemoryBarrier *memoryBarriers, uint bufferMemoryBarrierCount, VkBufferMemoryBarrier *bufferMemoryBarriers, VkImageMemoryBarrier[] imageMemoryBarriers) { }
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); }