#include "VulkanRenderer.h" #include VulkanRenderer::VulkanRenderer(QVulkanWindow *w) : m_window(w), m_devFuncs(nullptr) {} void VulkanRenderer::initResources() { m_devFuncs = m_window->vulkanInstance()->deviceFunctions(m_window->device()); auto shaders = std::array{"shaders/vert.spv", "shaders/frag.spv"}; auto loadedShaders = m_shaderLoader.loadShaders(m_window->device(), m_devFuncs, shaders); VkPipelineShaderStageCreateInfo vertShaderStageInfo{}; vertShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; vertShaderStageInfo.module = loadedShaders[0]; vertShaderStageInfo.pName = "main"; VkPipelineShaderStageCreateInfo fragShaderStageInfo{}; fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; fragShaderStageInfo.module = loadedShaders[1]; fragShaderStageInfo.pName = "main"; } //void VulkanRenderer::initSwapChainResources() { // qDebug() << "initSwapChainResources"; // VkFramebufferCreateInfo framebufferInfo = {}; // framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; // framebufferInfo.pNext = nullptr; // framebufferInfo.renderPass = m_renderPass; // framebufferInfo.attachmentCount = 1; // framebufferInfo.width = m_window->width(); // framebufferInfo.height = m_window->height(); // framebufferInfo.layers = 1; // // m_swapChainImages = std::vector(m_window->swapChainImageCount()); // m_swapChainImageViews = // std::vector(m_window->swapChainImageCount()); // m_framebuffers = // std::vector(m_window->swapChainImageCount()); for (int i = // 0; i < m_window->swapChainImageCount(); ++i) { // m_swapChainImages[i] = m_window->swapChainImage(i); // m_swapChainImageViews[i] = m_window->swapChainImageView(i); // // framebufferInfo.pAttachments = &m_swapChainImageViews[i]; // VkResult vkResult = m_devFuncs->vkCreateFramebuffer( // m_window->device(), &framebufferInfo, nullptr, &m_framebuffers[i]); // assert(vkResult == VK_SUCCESS); // } //} //void VulkanRenderer::releaseSwapChainResources() { // destruction of swap chain image views are handled in Qt framework // for (auto& imageView : m_swapChainImageViews) { // m_devFuncs->vkDestroyImageView(m_window->device(), imageView, nullptr); // } // for (auto &framebuffer : m_framebuffers) { // m_devFuncs->vkDestroyFramebuffer(m_window->device(), framebuffer, // nullptr); // } // destruction of the default render pass is handled in Qt framework // m_devFuncs->vkDestroyRenderPass(m_window->device(), m_renderPass, // nullptr); //} void VulkanRenderer::releaseResources() { m_shaderLoader.destroyShaders(m_window->device(), m_devFuncs); } void VulkanRenderer::startNextFrame() { VkCommandBuffer cmdBuf = m_window->currentCommandBuffer(); // make a clear-color from frame number. This will flash with a 120*pi frame // period. VkClearValue clearValue; float flash = std::abs(std::sin(static_cast(m_frameNumber) / 120.f)); clearValue.color = {{0.0f, 0.0f, flash, 1.0f}}; // start the main renderpass. // We will use the clear color from above, and the framebuffer of the index // the swapchain gave us VkRenderPassBeginInfo rpInfo = {}; rpInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; rpInfo.pNext = nullptr; rpInfo.renderPass = m_window->defaultRenderPass(); rpInfo.renderArea.offset.x = 0; rpInfo.renderArea.offset.y = 0; rpInfo.renderArea.extent.width = m_window->width(); rpInfo.renderArea.extent.height = m_window->height(); rpInfo.framebuffer = m_window->currentFramebuffer(); // connect clear values rpInfo.clearValueCount = 1; rpInfo.pClearValues = &clearValue; m_devFuncs->vkCmdBeginRenderPass(cmdBuf, &rpInfo, VK_SUBPASS_CONTENTS_INLINE); // int imageIndex = m_window->currentSwapChainImageIndex(); // uint32_t swapchainImageIndex; // VK_CHECK(vkAcquireNextImageKHR(_device, _swapchain, 1000000000, // _presentSemaphore, nullptr, &swapchainImageIndex)); // m_devFuncs->vkCmdEndRenderPass(cmdBuf); ++m_frameNumber; m_window->frameReady(); m_window->requestUpdate(); }