Add configurable number of frame resources to create
This commit is contained in:
parent
b885feba2d
commit
a2941de5de
6 changed files with 27 additions and 23 deletions
|
@ -7,12 +7,14 @@
|
||||||
#include "dofpass.h"
|
#include "dofpass.h"
|
||||||
#include "imguipass.h"
|
#include "imguipass.h"
|
||||||
|
|
||||||
|
constexpr int numFrameResources = 2;
|
||||||
|
|
||||||
struct RenderTarget {
|
struct RenderTarget {
|
||||||
VkSurfaceKHR surface = nullptr;
|
VkSurfaceKHR surface = nullptr;
|
||||||
VkSwapchainKHR swapchain = nullptr;
|
VkSwapchainKHR swapchain = nullptr;
|
||||||
|
|
||||||
VkExtent2D extent = {};
|
VkExtent2D extent = {};
|
||||||
uint32_t numImages = 0, currentImage = 0;
|
uint32_t numImages = 0, imageIndex = 0, currentResource = 0;
|
||||||
|
|
||||||
// swapwchain
|
// swapwchain
|
||||||
VkImage* swapchainImages = nullptr;
|
VkImage* swapchainImages = nullptr;
|
||||||
|
|
|
@ -46,7 +46,7 @@ void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget
|
||||||
|
|
||||||
VkRenderPassBeginInfo renderPassBeginInfo = {};
|
VkRenderPassBeginInfo renderPassBeginInfo = {};
|
||||||
renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
||||||
renderPassBeginInfo.framebuffer = target->farFieldFramebuffers[target->currentImage];
|
renderPassBeginInfo.framebuffer = target->farFieldFramebuffers[target->currentResource];
|
||||||
renderPassBeginInfo.renderPass = renderPass_;
|
renderPassBeginInfo.renderPass = renderPass_;
|
||||||
renderPassBeginInfo.renderArea.extent.width = target->extent.width / dofFramebufferDownscaleFactor;
|
renderPassBeginInfo.renderArea.extent.width = target->extent.width / dofFramebufferDownscaleFactor;
|
||||||
renderPassBeginInfo.renderArea.extent.height = target->extent.height / dofFramebufferDownscaleFactor;
|
renderPassBeginInfo.renderArea.extent.height = target->extent.height / dofFramebufferDownscaleFactor;
|
||||||
|
@ -63,7 +63,7 @@ void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget
|
||||||
dpack[3] = target->extent.height / dofFramebufferDownscaleFactor;
|
dpack[3] = target->extent.height / dofFramebufferDownscaleFactor;
|
||||||
|
|
||||||
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_);
|
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_);
|
||||||
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout_, 0, 1, &target->dofSets[target->currentImage], 0, nullptr);
|
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout_, 0, 1, &target->dofSets[target->currentResource], 0, nullptr);
|
||||||
|
|
||||||
vkCmdPushConstants(commandBuffer, pipelineLayout_, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(glm::vec4), &dpack);
|
vkCmdPushConstants(commandBuffer, pipelineLayout_, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(glm::vec4), &dpack);
|
||||||
|
|
||||||
|
@ -73,12 +73,12 @@ void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget
|
||||||
vkCmdEndRenderPass(commandBuffer);
|
vkCmdEndRenderPass(commandBuffer);
|
||||||
|
|
||||||
//near field
|
//near field
|
||||||
renderPassBeginInfo.framebuffer = target->nearFieldFramebuffers[target->currentImage];
|
renderPassBeginInfo.framebuffer = target->nearFieldFramebuffers[target->currentResource];
|
||||||
|
|
||||||
vkCmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
|
vkCmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
|
||||||
|
|
||||||
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_);
|
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_);
|
||||||
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout_, 0, 1, &target->dofSets[target->currentImage], 0, nullptr);
|
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout_, 0, 1, &target->dofSets[target->currentResource], 0, nullptr);
|
||||||
|
|
||||||
vkCmdPushConstants(commandBuffer, pipelineLayout_, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(glm::vec4), &dpack);
|
vkCmdPushConstants(commandBuffer, pipelineLayout_, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(glm::vec4), &dpack);
|
||||||
|
|
||||||
|
|
|
@ -27,22 +27,22 @@ ImGuiPass::~ImGuiPass() {
|
||||||
void ImGuiPass::render(VkCommandBuffer commandBuffer, RenderTarget* target) {
|
void ImGuiPass::render(VkCommandBuffer commandBuffer, RenderTarget* target) {
|
||||||
ImDrawData* drawData = ImGui::GetDrawData();
|
ImDrawData* drawData = ImGui::GetDrawData();
|
||||||
|
|
||||||
VkBuffer& vertexBuffer = target->imguiVertexBuffers[target->currentImage];
|
VkBuffer& vertexBuffer = target->imguiVertexBuffers[target->currentResource];
|
||||||
VkDeviceMemory& vertexMemory = target->imguiVertexMemorys[target->currentImage];
|
VkDeviceMemory& vertexMemory = target->imguiVertexMemorys[target->currentResource];
|
||||||
|
|
||||||
VkBuffer& indexBuffer = target->imguiIndexBuffers[target->currentImage];
|
VkBuffer& indexBuffer = target->imguiIndexBuffers[target->currentResource];
|
||||||
VkDeviceMemory& indexMemory = target->imguiIndexMemorys[target->currentImage];
|
VkDeviceMemory& indexMemory = target->imguiIndexMemorys[target->currentResource];
|
||||||
|
|
||||||
const size_t vertexSize = drawData->TotalVtxCount * sizeof(ImDrawVert);
|
const size_t vertexSize = drawData->TotalVtxCount * sizeof(ImDrawVert);
|
||||||
if(vertexSize > target->imguiVertexBufferSizes[target->currentImage]) {
|
if(vertexSize > target->imguiVertexBufferSizes[target->currentResource]) {
|
||||||
createBuffer(vertexBuffer, vertexMemory, vertexSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
|
createBuffer(vertexBuffer, vertexMemory, vertexSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
|
||||||
target->imguiVertexBufferSizes[target->currentImage] = vertexSize;
|
target->imguiVertexBufferSizes[target->currentResource] = vertexSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t indexSize = drawData->TotalIdxCount * sizeof(ImDrawIdx);
|
const size_t indexSize = drawData->TotalIdxCount * sizeof(ImDrawIdx);
|
||||||
if(indexSize > target->imguiIndexBufferSizes[target->currentImage]) {
|
if(indexSize > target->imguiIndexBufferSizes[target->currentResource]) {
|
||||||
createBuffer(indexBuffer, indexMemory, indexSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
|
createBuffer(indexBuffer, indexMemory, indexSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
|
||||||
target->imguiIndexBufferSizes[target->currentImage] = indexSize;
|
target->imguiIndexBufferSizes[target->currentResource] = indexSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(vertexSize == 0 || indexSize == 0)
|
if(vertexSize == 0 || indexSize == 0)
|
||||||
|
|
|
@ -21,7 +21,7 @@ PostPass::~PostPass() {
|
||||||
|
|
||||||
void PostPass::render(VkCommandBuffer commandBuffer, RenderTarget* target) {
|
void PostPass::render(VkCommandBuffer commandBuffer, RenderTarget* target) {
|
||||||
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_);
|
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_);
|
||||||
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout_, 0, 1, &target->postSets[target->currentImage], 0, nullptr);
|
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout_, 0, 1, &target->postSets[target->currentResource], 0, nullptr);
|
||||||
vkCmdDraw(commandBuffer, 3, 1, 0, 0);
|
vkCmdDraw(commandBuffer, 3, 1, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,12 +53,14 @@ Renderer::~Renderer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::render(World& world, Camera& camera, RenderTarget* target) {
|
void Renderer::render(World& world, Camera& camera, RenderTarget* target) {
|
||||||
vkAcquireNextImageKHR(device_, target->swapchain, UINT64_MAX, target->imageAvailableSemaphore, nullptr, &target->currentImage);
|
vkAcquireNextImageKHR(device_, target->swapchain, UINT64_MAX, target->imageAvailableSemaphore, nullptr, &target->imageIndex);
|
||||||
|
|
||||||
vkWaitForFences(device_, 1, &target->fences[target->currentImage], VK_TRUE, UINT64_MAX);
|
target->currentResource = (target->imageIndex + 1) % numFrameResources;
|
||||||
vkResetFences(device_, 1, &target->fences[target->currentImage]);
|
|
||||||
|
|
||||||
VkCommandBuffer commandBuffer = target->commandBuffers[target->currentImage];
|
vkWaitForFences(device_, 1, &target->fences[target->currentResource], VK_TRUE, UINT64_MAX);
|
||||||
|
vkResetFences(device_, 1, &target->fences[target->currentResource]);
|
||||||
|
|
||||||
|
VkCommandBuffer commandBuffer = target->commandBuffers[target->currentResource];
|
||||||
|
|
||||||
VkCommandBufferBeginInfo beginInfo = {};
|
VkCommandBufferBeginInfo beginInfo = {};
|
||||||
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
||||||
|
@ -88,7 +90,7 @@ void Renderer::render(World& world, Camera& camera, RenderTarget* target) {
|
||||||
|
|
||||||
VkRenderPassBeginInfo renderPassBeginInfo = {};
|
VkRenderPassBeginInfo renderPassBeginInfo = {};
|
||||||
renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
||||||
renderPassBeginInfo.framebuffer = target->swapchainFramebuffers[target->currentImage];
|
renderPassBeginInfo.framebuffer = target->swapchainFramebuffers[target->currentResource];
|
||||||
renderPassBeginInfo.renderPass = presentationRenderPass_;
|
renderPassBeginInfo.renderPass = presentationRenderPass_;
|
||||||
renderPassBeginInfo.renderArea.extent = target->extent;
|
renderPassBeginInfo.renderArea.extent = target->extent;
|
||||||
renderPassBeginInfo.clearValueCount = 1;
|
renderPassBeginInfo.clearValueCount = 1;
|
||||||
|
@ -115,7 +117,7 @@ void Renderer::render(World& world, Camera& camera, RenderTarget* target) {
|
||||||
submitInfo.signalSemaphoreCount = 1;
|
submitInfo.signalSemaphoreCount = 1;
|
||||||
submitInfo.pSignalSemaphores = &target->renderFinishedSemaphore;
|
submitInfo.pSignalSemaphores = &target->renderFinishedSemaphore;
|
||||||
|
|
||||||
vkQueueSubmit(graphicsQueue_, 1, &submitInfo, target->fences[target->currentImage]);
|
vkQueueSubmit(graphicsQueue_, 1, &submitInfo, target->fences[target->currentResource]);
|
||||||
|
|
||||||
VkPresentInfoKHR presentInfo = {};
|
VkPresentInfoKHR presentInfo = {};
|
||||||
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
||||||
|
@ -123,7 +125,7 @@ void Renderer::render(World& world, Camera& camera, RenderTarget* target) {
|
||||||
presentInfo.pWaitSemaphores = &target->renderFinishedSemaphore;
|
presentInfo.pWaitSemaphores = &target->renderFinishedSemaphore;
|
||||||
presentInfo.swapchainCount = 1;
|
presentInfo.swapchainCount = 1;
|
||||||
presentInfo.pSwapchains = &target->swapchain;
|
presentInfo.pSwapchains = &target->swapchain;
|
||||||
presentInfo.pImageIndices = &target->currentImage;
|
presentInfo.pImageIndices = &target->imageIndex;
|
||||||
|
|
||||||
vkQueuePresentKHR(graphicsQueue_, &presentInfo);
|
vkQueuePresentKHR(graphicsQueue_, &presentInfo);
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ void WorldPass::render(VkCommandBuffer commandBuffer, World& world, Camera& came
|
||||||
|
|
||||||
VkRenderPassBeginInfo renderPassBeginInfo = {};
|
VkRenderPassBeginInfo renderPassBeginInfo = {};
|
||||||
renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
||||||
renderPassBeginInfo.framebuffer = target->offscreenFramebuffers[target->currentImage];
|
renderPassBeginInfo.framebuffer = target->offscreenFramebuffers[target->currentResource];
|
||||||
renderPassBeginInfo.renderPass = renderPass_;
|
renderPassBeginInfo.renderPass = renderPass_;
|
||||||
renderPassBeginInfo.renderArea.extent = target->extent;
|
renderPassBeginInfo.renderArea.extent = target->extent;
|
||||||
renderPassBeginInfo.clearValueCount = clearColor.size();
|
renderPassBeginInfo.clearValueCount = clearColor.size();
|
||||||
|
|
Reference in a new issue