cpp-vulkan-setup/src/VulkanRenderer.cpp

110 lines
4.3 KiB
C++

#include "VulkanRenderer.h"
#include <complex>
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<std::string, 2>{"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<VkImage>(m_window->swapChainImageCount());
// m_swapChainImageViews =
// std::vector<VkImageView>(m_window->swapChainImageCount());
// m_framebuffers =
// std::vector<VkFramebuffer>(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<float>(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();
}