Archived
1
Fork 0

Add configurable number of frame resources to create

This commit is contained in:
Joshua Goins 2018-11-05 21:34:50 -05:00
parent b885feba2d
commit a2941de5de
6 changed files with 27 additions and 23 deletions

View file

@ -7,12 +7,14 @@
#include "dofpass.h"
#include "imguipass.h"
constexpr int numFrameResources = 2;
struct RenderTarget {
VkSurfaceKHR surface = nullptr;
VkSwapchainKHR swapchain = nullptr;
VkExtent2D extent = {};
uint32_t numImages = 0, currentImage = 0;
uint32_t numImages = 0, imageIndex = 0, currentResource = 0;
// swapwchain
VkImage* swapchainImages = nullptr;

View file

@ -46,7 +46,7 @@ void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget
VkRenderPassBeginInfo renderPassBeginInfo = {};
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.renderArea.extent.width = target->extent.width / 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;
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);
@ -73,12 +73,12 @@ void DoFPass::render(VkCommandBuffer commandBuffer, Camera& camera, RenderTarget
vkCmdEndRenderPass(commandBuffer);
//near field
renderPassBeginInfo.framebuffer = target->nearFieldFramebuffers[target->currentImage];
renderPassBeginInfo.framebuffer = target->nearFieldFramebuffers[target->currentResource];
vkCmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
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);

View file

@ -27,22 +27,22 @@ ImGuiPass::~ImGuiPass() {
void ImGuiPass::render(VkCommandBuffer commandBuffer, RenderTarget* target) {
ImDrawData* drawData = ImGui::GetDrawData();
VkBuffer& vertexBuffer = target->imguiVertexBuffers[target->currentImage];
VkDeviceMemory& vertexMemory = target->imguiVertexMemorys[target->currentImage];
VkBuffer& vertexBuffer = target->imguiVertexBuffers[target->currentResource];
VkDeviceMemory& vertexMemory = target->imguiVertexMemorys[target->currentResource];
VkBuffer& indexBuffer = target->imguiIndexBuffers[target->currentImage];
VkDeviceMemory& indexMemory = target->imguiIndexMemorys[target->currentImage];
VkBuffer& indexBuffer = target->imguiIndexBuffers[target->currentResource];
VkDeviceMemory& indexMemory = target->imguiIndexMemorys[target->currentResource];
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);
target->imguiVertexBufferSizes[target->currentImage] = vertexSize;
target->imguiVertexBufferSizes[target->currentResource] = vertexSize;
}
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);
target->imguiIndexBufferSizes[target->currentImage] = indexSize;
target->imguiIndexBufferSizes[target->currentResource] = indexSize;
}
if(vertexSize == 0 || indexSize == 0)

View file

@ -21,7 +21,7 @@ PostPass::~PostPass() {
void PostPass::render(VkCommandBuffer commandBuffer, RenderTarget* target) {
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);
}

View file

@ -53,12 +53,14 @@ Renderer::~Renderer() {
}
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);
vkResetFences(device_, 1, &target->fences[target->currentImage]);
target->currentResource = (target->imageIndex + 1) % numFrameResources;
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 = {};
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
@ -88,7 +90,7 @@ void Renderer::render(World& world, Camera& camera, RenderTarget* target) {
VkRenderPassBeginInfo renderPassBeginInfo = {};
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.renderArea.extent = target->extent;
renderPassBeginInfo.clearValueCount = 1;
@ -115,7 +117,7 @@ void Renderer::render(World& world, Camera& camera, RenderTarget* target) {
submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = &target->renderFinishedSemaphore;
vkQueueSubmit(graphicsQueue_, 1, &submitInfo, target->fences[target->currentImage]);
vkQueueSubmit(graphicsQueue_, 1, &submitInfo, target->fences[target->currentResource]);
VkPresentInfoKHR presentInfo = {};
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.swapchainCount = 1;
presentInfo.pSwapchains = &target->swapchain;
presentInfo.pImageIndices = &target->currentImage;
presentInfo.pImageIndices = &target->imageIndex;
vkQueuePresentKHR(graphicsQueue_, &presentInfo);
}

View file

@ -52,7 +52,7 @@ void WorldPass::render(VkCommandBuffer commandBuffer, World& world, Camera& came
VkRenderPassBeginInfo renderPassBeginInfo = {};
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.renderArea.extent = target->extent;
renderPassBeginInfo.clearValueCount = clearColor.size();