protected override void buildCommandBuffers() { var cmdBufInfo = new VkCommandBufferBeginInfo(); cmdBufInfo.sType = CommandBufferBeginInfo; var clearValues = new VkClearValue[2]; clearValues[0].color = defaultClearColor; clearValues[1].depthStencil = new VkClearDepthStencilValue(1.0f, 0); var info = new VkRenderPassBeginInfo(); info.sType = RenderPassBeginInfo; info.renderPass = renderPass; info.renderArea.offset.x = 0; info.renderArea.offset.y = 0; info.renderArea.extent.width = width; info.renderArea.extent.height = height; info.clearValues = clearValues; for (int i = 0; i < drawCmdBuffers.Length; ++i) { info.framebuffer = frameBuffers[i]; vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo); vkCmdBeginRenderPass(drawCmdBuffers[i], &info, VkSubpassContents.Inline); var viewport = new VkViewport(0, 0, width, height, 0.0f, 1.0f); vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); var scissor = new VkRect2D(0, 0, width, height); vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor); vkCmdBindPipeline(drawCmdBuffers[i], VkPipelineBindPoint.Graphics, pipeline); VkDeviceSize offsets = 0; VkBuffer buffer = vertexBuffer.buffer; vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &buffer, &offsets); vkCmdBindIndexBuffer(drawCmdBuffers[i], indexBuffer.buffer, 0, VkIndexType.Uint32); // Render multiple objects using different model matrices by dynamically offsetting into one uniform buffer for (uint j = 0; j < OBJECT_INSTANCES; j++) { // One dynamic offset per dynamic descriptor to offset into the ubo containing all model matrices uint dynamicOffset = j * (uint)(dynamicAlignment); // Bind the descriptor set for rendering a mesh using the dynamic offset VkDescriptorSet set = descriptorSet; vkCmdBindDescriptorSets(drawCmdBuffers[i], VkPipelineBindPoint.Graphics, pipelineLayout, 0, 1, &set, 1, &dynamicOffset); vkCmdDrawIndexed(drawCmdBuffers[i], indexCount, 1, 0, 0, 0); } vkCmdEndRenderPass(drawCmdBuffers[i]); vkEndCommandBuffer(drawCmdBuffers[i]); } }
public static void vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, out VkMemoryRequirements pMemoryRequirements) { VkPreconditions.CheckNull(device, nameof(device)); VkPreconditions.CheckNull(buffer, nameof(buffer)); GetDevice(device).GetBufferMemoryRequirements(buffer, out pMemoryRequirements); }
/// <inheritdoc/> protected internal override void OnDestroyed() { Ready = false; GraphicsDevice.RegisterBufferMemoryUsage(-SizeInBytes); if (NativeBufferView != VkBufferView.Null) { GraphicsDevice.Collect(NativeBufferView); NativeBufferView = VkBufferView.Null; } if (NativeBuffer != VkBuffer.Null) { GraphicsDevice.Collect(NativeBuffer); NativeBuffer = VkBuffer.Null; } if (NativeMemory != VkDeviceMemory.Null) { if (NativeMemoryOffset.HasValue) { VulkanMemoryPool.Free(this, NativeMemoryOffset.Value); } else { GraphicsDevice.Collect(NativeMemory); } NativeMemory = VkDeviceMemory.Null; } base.OnDestroyed(); }
public static extern void CmdDrawIndexedIndirect( VkCommandBuffer commandBuffer, VkBuffer buffer, ulong offset, uint drawCount, uint stride );
public static extern void CmdUpdateBuffer( VkCommandBuffer commandBuffer, VkBuffer dstBuffer, ulong dstOffset, ulong dataSize, IntPtr pData );
public static extern void CmdCopyBuffer( VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint regionCount, IntPtr pRegions );
private unsafe void ReleaseDevice() { EmptyTexelBufferInt.Dispose(); EmptyTexelBufferInt = null; EmptyTexelBufferFloat.Dispose(); EmptyTexelBufferFloat = null; EmptyTexture.Dispose(); EmptyTexture = null; // Wait for all queues to be idle vkDeviceWaitIdle(nativeDevice); // Destroy all remaining fences GetCompletedValue(); // Mark upload buffer for destruction if (nativeUploadBuffer != VkBuffer.Null) { vkUnmapMemory(NativeDevice, nativeUploadBufferMemory); nativeResourceCollector.Add(lastCompletedFence, nativeUploadBuffer); nativeResourceCollector.Add(lastCompletedFence, nativeUploadBufferMemory); nativeUploadBuffer = VkBuffer.Null; nativeUploadBufferMemory = VkDeviceMemory.Null; } // Release fenced resources nativeResourceCollector.Dispose(); DescriptorPools.Dispose(); vkDestroyCommandPool(nativeDevice, NativeCopyCommandPool, null); vkDestroyDevice(nativeDevice, null); }
void CopyBufferToImage(VkBuffer buffer, VkImage image, int width, int height) { VkCommandBuffer commandBuffer = BeginSingleTimeCommands(); VkBufferImageCopy region = new VkBufferImageCopy(); region.bufferOffset = 0; region.bufferRowLength = 0; region.bufferImageHeight = 0; region.imageSubresource.aspectMask = VkImageAspectFlags.ColorBit; region.imageSubresource.mipLevel = 0; region.imageSubresource.baseArrayLayer = 0; region.imageSubresource.layerCount = 1; region.imageOffset = new VkOffset3D(); region.imageExtent = new VkExtent3D { width = width, height = height, depth = 1 }; commandBuffer.CopyBufferToImage(buffer, image, VkImageLayout.TransferDstOptimal, new VkBufferImageCopy[] { region }); EndSingleTimeCommand(commandBuffer); }
private static void CreateBuffer(ulong size, ResourceType type, out VkBuffer buffer, out MemoryAllocation memory) { var gd = Core.Instance !.Graphics; // Create buffer handle VkBufferCreateInfo bci = new( flags : VkBufferCreateFlags.NoFlags, size : size, usage : GetUsageFlags(type), sharingMode : VkSharingMode.Exclusive ); VulkanHandle <VkBuffer> handle; gd.VkDevice.CreateBuffer(&bci, null, &handle) .Throw("Failed to create buffer handle"); buffer = new(handle, gd.VkDevice); // Allocate and bind buffer memory VkMemoryRequirements memreq; buffer.GetBufferMemoryRequirements(&memreq); memory = gd.Memory.AllocateDevice(memreq) ?? throw new Exception("Failed to allocate memory for buffer"); buffer.BindBufferMemory(memory.Handle, memory.Offset); }
public override void GetBufferMemoryRequirements(VkBuffer buffer, out VkMemoryRequirements pMemoryRequirements) { pMemoryRequirements = new VkMemoryRequirements(); pMemoryRequirements.memoryTypeBits = 1; pMemoryRequirements.size = ((SoftwareBuffer)buffer).createInfo.size; pMemoryRequirements.alignment = 4; }
public override void DestroyBuffer(VkBuffer buffer) { if (buffer != null) { ((SoftwareBuffer)buffer).Destroy(); } }
internal bool CanDestroyImmediately = false; // Default to normal delayed-destroy #endregion // Fields /// <summary> /// Create and map a new host buffer with the given size in bytes. /// </summary> /// <param name="size">The buffer size, in bytes.</param> public HostBuffer(ulong size) : base(ResourceType.HostBuffer) { DataSize = size; // Create buffer VkBufferCreateInfo bci = new( flags : VkBufferCreateFlags.NoFlags, size : size, usage : VkBufferUsageFlags.TransferDst | VkBufferUsageFlags.TransferSrc, sharingMode : VkSharingMode.Exclusive ); VulkanHandle <VkBuffer> handle; Graphics.VkDevice.CreateBuffer(&bci, null, &handle).Throw("Failed to create host buffer"); Buffer = new(handle, Graphics.VkDevice); // Allocate/bind memory VkMemoryRequirements memreq; Buffer.GetBufferMemoryRequirements(&memreq); Memory = Graphics.Memory.AllocateUpload(memreq) ?? throw new Exception("Failed to allocate host buffer memory"); Buffer.BindBufferMemory(Memory.Handle, Memory.Offset); // Map memory Memory.Map(); _stream = new((byte *)Memory.DataPtr, 0, (long)DataSize, FileAccess.Write); }
public unsafe void DestroyNow() { GraphicsDevice.RegisterBufferMemoryUsage(-SizeInBytes); if (NativeBufferView != VkBufferView.Null) { vkDestroyBufferView(GraphicsDevice.NativeDevice, NativeBufferView, null); NativeBufferView = VkBufferView.Null; } if (NativeBuffer != VkBuffer.Null) { vkDestroyBuffer(GraphicsDevice.NativeDevice, NativeBuffer, null); NativeBuffer = VkBuffer.Null; } if (NativeMemory != VkDeviceMemory.Null) { if (NativeMemoryOffset.HasValue) { VulkanMemoryPool.Free(this, NativeMemoryOffset.Value); } else { vkFreeMemory(GraphicsDevice.NativeDevice, NativeMemory, null); } NativeMemory = VkDeviceMemory.Null; } base.OnDestroyed(); }
public static extern void CmdFillBuffer( VkCommandBuffer commandBuffer, VkBuffer dstBuffer, ulong dstOffset, ulong size, uint data );
public static void vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, int offset, VkIndexType indexType) { VkPreconditions.CheckNull(commandBuffer, nameof(commandBuffer)); VkPreconditions.CheckNull(buffer, nameof(buffer)); VkPreconditions.CheckRange(offset, 0, int.MaxValue, nameof(offset)); GetCommandBuffer(commandBuffer).CmdBindIndexBuffer(buffer, offset, indexType); }
private VulkanBuffer(VkDevice device, VkCommandPool commandPool, VkBuffer buffer, VkDeviceMemory memory, int count) { Buffer = buffer; Memory = memory; Count = count; this.device = device; this.commandPool = commandPool; }
public void BindVertexBuffer(uint firstBinding, Buffer buffer, ulong offset) { unsafe { VkBuffer bufferNative = buffer.Native; Device.Commands.cmdBindVertexBuffers(commandBuffer, firstBinding, 1, (IntPtr)(&bufferNative), ref offset); } }
public static extern void CmdCopyImageToBuffer( VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint regionCount, IntPtr pRegions );
public static extern void CmdCopyBufferToImage( VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint regionCount, IntPtr pRegions );
protected override void buildCommandBuffers() { var cmdInfo = VkCommandBufferBeginInfo.Alloc(); var clearValues = VkClearValue.Alloc(2); clearValues[0].color = defaultClearColor; clearValues[1].depthStencil = new VkClearDepthStencilValue() { depth = 1.0f, stencil = 0 }; var info = VkRenderPassBeginInfo.Alloc(); info[0].renderPass = renderPass; info[0].renderArea.offset.x = 0; info[0].renderArea.offset.y = 0; info[0].renderArea.extent.width = width; info[0].renderArea.extent.height = height; info[0].clearValues.count = 2; info[0].clearValues.pointer = clearValues; for (int i = 0; i < drawCmdBuffers.Length; ++i) { // Set target frame buffer info[0].framebuffer = frameBuffers[i]; vkBeginCommandBuffer(drawCmdBuffers[i], cmdInfo); vkCmdBeginRenderPass(drawCmdBuffers[i], info, VkSubpassContents.Inline); VkViewport viewport = new VkViewport((float)width, (float)height, 0.0f, 1.0f); vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); VkRect2D scissor = new VkRect2D(0, 0, width, height); vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor); { VkDescriptorSet set = descriptorSet; vkCmdBindDescriptorSets(drawCmdBuffers[i], VkPipelineBindPoint.Graphics, pipelineLayout, 0, 1, &set, 0, null); } vkCmdBindPipeline(drawCmdBuffers[i], VkPipelineBindPoint.Graphics, pipeline); { VkDeviceSize offsets = 0; VkBuffer buffer = vertexBuffer.buffer; vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &buffer, &offsets); } vkCmdBindIndexBuffer(drawCmdBuffers[i], indexBuffer.buffer, 0, VkIndexType.Uint32); vkCmdDrawIndexed(drawCmdBuffers[i], indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); vkEndCommandBuffer(drawCmdBuffers[i]); } }
private void createCommandBuffers() { int commandBuffersCount = swapChainFramebuffers.Length; commandBuffers = new VkCommandBuffer[commandBuffersCount]; VkCommandBufferAllocateInfo allocInfo = new VkCommandBufferAllocateInfo(); allocInfo.sType = VkStructureType.VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; allocInfo.commandPool = commandPool; allocInfo.level = VkCommandBufferLevel.VK_COMMAND_BUFFER_LEVEL_PRIMARY; allocInfo.commandBufferCount = commandBuffersCount; VkResult result = Vulkan.vkAllocateCommandBuffers(device, allocInfo, commandBuffers); if (result != VkResult.VK_SUCCESS) { throw Program.Throw("failed to allocate command buffers!", result); } for (int i = 0; i < commandBuffersCount; i++) { VkCommandBufferBeginInfo beginInfo = new VkCommandBufferBeginInfo(); beginInfo.sType = VkStructureType.VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; beginInfo.flags = VkCommandBufferUsageFlagBits.VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT; Vulkan.vkBeginCommandBuffer(commandBuffers[i], beginInfo); VkRenderPassBeginInfo renderPassInfo = new VkRenderPassBeginInfo(); renderPassInfo.sType = VkStructureType.VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; renderPassInfo.renderPass = renderPass; renderPassInfo.framebuffer = swapChainFramebuffers[i]; renderPassInfo.renderArea.offset = VkOffset2D.Create(0, 0); renderPassInfo.renderArea.extent = swapChainExtent; VkClearValue clearColor = VkClearValue.Create(0.01f, 0.03f, 0.01f, 1.0f); renderPassInfo.clearValueCount = 1; renderPassInfo.pClearValues = new VkClearValue[] { clearColor }; Vulkan.vkCmdBeginRenderPass(commandBuffers[i], renderPassInfo, VkSubpassContents.VK_SUBPASS_CONTENTS_INLINE); Vulkan.vkCmdBindPipeline(commandBuffers[i], VkPipelineBindPoint.VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline); VkBuffer[] vertexBuffers = new VkBuffer[] { vertexBuffer }; int[] offsets = new int[] { 0 }; Vulkan.vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, vertexBuffers, offsets); Vulkan.vkCmdDraw(commandBuffers[i], vertices.Length, 1, 0, 0); Vulkan.vkCmdEndRenderPass(commandBuffers[i]); result = Vulkan.vkEndCommandBuffer(commandBuffers[i]); if (result != VkResult.VK_SUCCESS) { throw Program.Throw("failed to record command buffer!", result); } } }
public void CmdCopyBufferToImage(VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, int regionCount, VkBufferImageCopy[] pRegions) { if (m_State != CommandBufferState.Recording) { return; } m_Commands.Add(new Cmd_CopyBufferToImage((SoftwareBuffer)srcBuffer, (SoftwareImage)dstImage, dstImageLayout, regionCount, pRegions)); }
public void CmdBindIndexBuffer(VkBuffer buffer, int offset, VkIndexType indexType) { if (m_State != CommandBufferState.Recording) { return; } m_Commands.Add(new Cmd_BindIndexBuffer((SoftwareBuffer)buffer, offset, indexType)); }
public void CmdCopyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, int regionCount, VkBufferCopy[] pRegions) { if (m_State != CommandBufferState.Recording) { return; } m_Commands.Add(new Cmd_CopyBuffer((SoftwareBuffer)srcBuffer, (SoftwareBuffer)dstBuffer, regionCount, pRegions)); }
public void CopyBufferToImage(VkBuffer buffer, VkImage image, VkBufferImageCopy copyData) { unsafe { var local = copyData; VkCommandBuffer.vkCmdCopyBufferToImage(Handle, buffer, image, VkImageLayout.TransferDstOptimal, 1, &local); } }
public static VkResult vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, int memoryOffset) { VkPreconditions.CheckNull(device, nameof(device)); VkPreconditions.CheckNull(buffer, nameof(buffer)); VkPreconditions.CheckNull(memory, nameof(memory)); VkPreconditions.CheckRange(memoryOffset, 0, int.MaxValue, nameof(memoryOffset)); return(GetDevice(device).BindBufferMemory(buffer, memory, memoryOffset)); }
public static void vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, int regionCount, VkBufferImageCopy[] pRegions) { VkPreconditions.CheckNull(commandBuffer, nameof(commandBuffer)); VkPreconditions.CheckNull(srcBuffer, nameof(srcBuffer)); VkPreconditions.CheckNull(dstImage, nameof(dstImage)); VkPreconditions.CheckNull(pRegions, nameof(pRegions)); VkPreconditions.CheckRange(regionCount, 1, pRegions.Length, nameof(regionCount)); GetCommandBuffer(commandBuffer).CmdCopyBufferToImage(srcBuffer, dstImage, dstImageLayout, regionCount, pRegions); }
public static extern void CmdCopyQueryPoolResults( VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint firstQuery, uint queryCount, VkBuffer dstBuffer, ulong dstOffset, ulong stride, VkQueryResultFlags flags );
public static void vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, int regionCount, VkBufferCopy[] pRegions) { VkPreconditions.CheckNull(commandBuffer, nameof(commandBuffer)); VkPreconditions.CheckNull(srcBuffer, nameof(srcBuffer)); VkPreconditions.CheckNull(dstBuffer, nameof(dstBuffer)); VkPreconditions.CheckNull(pRegions, nameof(pRegions)); VkPreconditions.CheckRange(regionCount, 1, pRegions.Length, nameof(regionCount)); GetCommandBuffer(commandBuffer).CmdCopyBuffer(srcBuffer, dstBuffer, regionCount, pRegions); }
// Performs an asynchronous update of a buffer public void UpdateBufferAsync(ResourceType bufferType, ulong dataSize, VkBuffer srcBuffer, ulong srcOffset, VkBuffer dstBuffer, ulong dstOffset) { // Allocate a transient command buffer and record var cmd = Graphics.Resources.AllocateTransientCommandBuffer(VkCommandBufferLevel.Primary); RecordBufferCopy(cmd.Cmd, bufferType, dataSize, srcBuffer, srcOffset, dstBuffer, dstOffset); // Submit (no wait for async) var _ = Graphics.GraphicsQueue.Submit(cmd); }