Ejemplo n.º 1
0
        void RecordCommands()
        {
            for (int i = 0; i < swapchainImages.Count; i++)
            {
                VkCommandBuffer commandBuffer = commandBuffers[i];
                commandBuffer.Reset(VkCommandBufferResetFlags.None);
                VkCommandBufferBeginInfo beginInfo = new VkCommandBufferBeginInfo();
                beginInfo.flags = VkCommandBufferUsageFlags.SimultaneousUseBit;
                commandBuffer.Begin(beginInfo);

                //transfer to writable
                commandBuffer.PipelineBarrier(VkPipelineStageFlags.FragmentShaderBit, VkPipelineStageFlags.TransferBit, VkDependencyFlags.None,
                                              null, null,
                                              new List <VkImageMemoryBarrier> {
                    new VkImageMemoryBarrier {
                        image               = textureImage,
                        oldLayout           = VkImageLayout.ShaderReadOnlyOptimal,
                        newLayout           = VkImageLayout.TransferDstOptimal,
                        srcQueueFamilyIndex = -1,    //VK_QUEUE_FAMILY_IGNORED
                        dstQueueFamilyIndex = -1,
                        srcAccessMask       = VkAccessFlags.None,
                        dstAccessMask       = VkAccessFlags.TransferWriteBit,
                        subresourceRange    = new VkImageSubresourceRange {
                            aspectMask     = VkImageAspectFlags.ColorBit,
                            baseArrayLayer = 0,
                            layerCount     = 1,
                            baseMipLevel   = 0,
                            levelCount     = 1
                        }
                    }
                });

                commandBuffer.CopyBufferToImage(stagingBuffer, textureImage, VkImageLayout.TransferDstOptimal,
                                                new VkBufferImageCopy[] {
                    new VkBufferImageCopy {
                        imageExtent = new VkExtent3D {
                            width  = imageWidth,
                            height = imageHeight,
                            depth  = 1
                        },
                        imageSubresource = new VkImageSubresourceLayers {
                            aspectMask     = VkImageAspectFlags.ColorBit,
                            baseArrayLayer = 0,
                            layerCount     = 1,
                            mipLevel       = 0
                        }
                    }
                });

                //transfer to shader readable
                commandBuffer.PipelineBarrier(VkPipelineStageFlags.TransferBit, VkPipelineStageFlags.FragmentShaderBit, VkDependencyFlags.None,
                                              null, null,
                                              new List <VkImageMemoryBarrier> {
                    new VkImageMemoryBarrier {
                        image               = textureImage,
                        oldLayout           = VkImageLayout.TransferDstOptimal,
                        newLayout           = VkImageLayout.ShaderReadOnlyOptimal,
                        srcQueueFamilyIndex = -1,    //VK_QUEUE_FAMILY_IGNORED
                        dstQueueFamilyIndex = -1,
                        srcAccessMask       = VkAccessFlags.TransferWriteBit,
                        dstAccessMask       = VkAccessFlags.ShaderReadBit,
                        subresourceRange    = new VkImageSubresourceRange {
                            aspectMask     = VkImageAspectFlags.ColorBit,
                            baseArrayLayer = 0,
                            layerCount     = 1,
                            baseMipLevel   = 0,
                            levelCount     = 1
                        }
                    }
                });

                VkRenderPassBeginInfo renderPassBeginInfo = new VkRenderPassBeginInfo();
                renderPassBeginInfo.renderPass  = renderPass;
                renderPassBeginInfo.framebuffer = swapchainFramebuffers[i];
                renderPassBeginInfo.renderArea  = new VkRect2D {
                    extent = new VkExtent2D {
                        width  = window.FramebufferWidth,
                        height = window.FramebufferHeight
                    }
                };
                renderPassBeginInfo.clearValues = new List <VkClearValue> {
                    new VkClearValue {
                        color = new VkClearColorValue(0.125f, 0.125f, 0.125f, 0.125f)
                    }
                };

                commandBuffer.BeginRenderPass(renderPassBeginInfo, VkSubpassContents.Inline);

                commandBuffer.BindPipeline(VkPipelineBindPoint.Graphics, pipeline);
                commandBuffer.BindDescriptorSets(VkPipelineBindPoint.Graphics, pipelineLayout, 0, descriptorSet, null);
                commandBuffer.BindVertexBuffers(0, vertexBuffer, 0);
                commandBuffer.BindIndexBuffer(indexBuffer, 0, VkIndexType.UINT32);

                commandBuffer.SetViewports(0, new VkViewport {
                    width    = swapchainExtent.width,
                    height   = swapchainExtent.height,
                    minDepth = 0,
                    maxDepth = 1,
                });
                commandBuffer.SetScissor(0, new VkRect2D {
                    extent = swapchainExtent
                });
                commandBuffer.DrawIndexed(6, 1, 0, 0, 0);

                commandBuffer.EndRenderPass();
                commandBuffer.End();
            }
        }