示例#1
0
        public Vk.CommandBuffer BeginSingleTimeCommands(Vk.CommandPool commandPool)
        {
            var allocInfo = new Vk.CommandBufferAllocateInfo();

            allocInfo.Level              = Vk.CommandBufferLevel.Primary;
            allocInfo.CommandPool        = commandPool;
            allocInfo.CommandBufferCount = 1;

            var buffer = this.Device.AllocateCommandBuffers(allocInfo)[0];

            var beginInfo = new Vk.CommandBufferBeginInfo();

            beginInfo.Flags = Vk.CommandBufferUsageFlags.OneTimeSubmit;

            buffer.Begin(beginInfo);
            return(buffer);
        }
示例#2
0
        private void createCommandBuffers(VkContext context)
        {
            var allocInfo = new Vk.CommandBufferAllocateInfo();

            allocInfo.CommandPool        = context.GraphicsCommandPool;
            allocInfo.Level              = Vk.CommandBufferLevel.Primary;
            allocInfo.CommandBufferCount = this.wrapper.ImageCapacity;

            try {
                this.wrapper.CommandBuffers = context.Device.AllocateCommandBuffers(allocInfo);
            } catch (Vk.ResultException result) {
                throw new VkException("An error occurred while creating the command buffers.", result);
            }

            for (int i = 0; i < this.wrapper.ImageCapacity; i++)
            {
                Vk.CommandBuffer buffer = this.wrapper.CommandBuffers[i];
                var beginInfo           = new Vk.CommandBufferBeginInfo();
                beginInfo.Flags = Vk.CommandBufferUsageFlags.SimultaneousUse;

                try {
                    buffer.Begin(beginInfo);
                } catch (Vk.ResultException result) {
                    throw new VkException($"An error occurred while beginning recording for command buffer {i}.", result);
                }

                var renderPassInfo = new Vk.RenderPassBeginInfo();
                renderPassInfo.RenderPass  = this.wrapper.RenderPass;
                renderPassInfo.Framebuffer = this.wrapper.Framebuffers[i];

                var clearColour = new Vk.ClearValue();
                var renderArea  = new Vk.Rect2D();

                clearColour.Color = new Vk.ClearColorValue(new float[] { 0.0F, 0.0F, 0.0F, 1.0F });

                renderArea.Extent.Width  = this.wrapper.Extent.Width;
                renderArea.Extent.Height = this.wrapper.Extent.Height;
                renderArea.Offset.X      = 0;
                renderArea.Offset.Y      = 0;

                var clearDepth = new Vk.ClearValue();

                var depth = new Vk.ClearDepthStencilValue();
                depth.Depth = 1;

                clearDepth.DepthStencil = depth;

                renderPassInfo.RenderArea      = renderArea;
                renderPassInfo.ClearValueCount = 2;
                renderPassInfo.ClearValues     = new Vk.ClearValue[] {
                    clearColour,
                    clearDepth
                };

                buffer.CmdBeginRenderPass(renderPassInfo, Vk.SubpassContents.Inline);
                buffer.CmdBindPipeline(Vk.PipelineBindPoint.Graphics, this.wrapper.Pipeline);
                buffer.CmdBindDescriptorSet(Vk.PipelineBindPoint.Graphics,
                                            this.wrapper.PipelineLayout, 0, this.wrapper.DescriptorSets[i], null);

                this.renderPassCallback.Invoke(buffer);

                buffer.CmdEndRenderPass();

                try {
                    buffer.End();
                } catch (Vk.ResultException result) {
                    throw new VkException($"An error occurred while recording for command buffer {i}.", result);
                }
            }
        }