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]);
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        /// <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();
        }
Beispiel #4
0
 public static extern void CmdDrawIndexedIndirect(
     VkCommandBuffer commandBuffer,
     VkBuffer buffer,
     ulong offset,
     uint drawCount,
     uint stride
     );
Beispiel #5
0
 public static extern void CmdUpdateBuffer(
     VkCommandBuffer commandBuffer,
     VkBuffer dstBuffer,
     ulong dstOffset,
     ulong dataSize,
     IntPtr pData
     );
Beispiel #6
0
 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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
 public override void GetBufferMemoryRequirements(VkBuffer buffer, out VkMemoryRequirements pMemoryRequirements)
 {
     pMemoryRequirements = new VkMemoryRequirements();
     pMemoryRequirements.memoryTypeBits = 1;
     pMemoryRequirements.size           = ((SoftwareBuffer)buffer).createInfo.size;
     pMemoryRequirements.alignment      = 4;
 }
Beispiel #11
0
 public override void DestroyBuffer(VkBuffer buffer)
 {
     if (buffer != null)
     {
         ((SoftwareBuffer)buffer).Destroy();
     }
 }
Beispiel #12
0
        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);
        }
Beispiel #13
0
        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();
        }
Beispiel #14
0
 public static extern void CmdFillBuffer(
     VkCommandBuffer commandBuffer,
     VkBuffer dstBuffer,
     ulong dstOffset,
     ulong size,
     uint data
     );
Beispiel #15
0
        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);
        }
Beispiel #16
0
 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);
     }
 }
Beispiel #18
0
 public static extern void CmdCopyImageToBuffer(
     VkCommandBuffer commandBuffer,
     VkImage srcImage,
     VkImageLayout srcImageLayout,
     VkBuffer dstBuffer,
     uint regionCount,
     IntPtr pRegions
     );
Beispiel #19
0
 public static extern void CmdCopyBufferToImage(
     VkCommandBuffer commandBuffer,
     VkBuffer srcBuffer,
     VkImage dstImage,
     VkImageLayout dstImageLayout,
     uint regionCount,
     IntPtr pRegions
     );
Beispiel #20
0
        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]);
            }
        }
Beispiel #21
0
        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);
                }
            }
        }
Beispiel #22
0
        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));
        }
Beispiel #23
0
        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));
        }
Beispiel #24
0
        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));
        }
Beispiel #25
0
 public void CopyBufferToImage(VkBuffer buffer, VkImage image, VkBufferImageCopy copyData)
 {
     unsafe
     {
         var local = copyData;
         VkCommandBuffer.vkCmdCopyBufferToImage(Handle, buffer, image, VkImageLayout.TransferDstOptimal, 1,
                                                &local);
     }
 }
Beispiel #26
0
        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));
        }
Beispiel #27
0
        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);
        }
Beispiel #28
0
 public static extern void CmdCopyQueryPoolResults(
     VkCommandBuffer commandBuffer,
     VkQueryPool queryPool,
     uint firstQuery,
     uint queryCount,
     VkBuffer dstBuffer,
     ulong dstOffset,
     ulong stride,
     VkQueryResultFlags flags
     );
Beispiel #29
0
        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);
        }
Beispiel #30
0
        // 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);
        }