diff --git a/src/renderer.cpp b/src/renderer.cpp index 316e174..538d57a 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -66,8 +66,8 @@ void Renderer::render(World& world, Camera& camera, RenderTarget* target) { target->currentResource = (target->imageIndex + 1) % numFrameResources; - vkWaitForFences(device_, 1, &target->fences[target->currentResource], VK_TRUE, UINT64_MAX); - vkResetFences(device_, 1, &target->fences[target->currentResource]); + vkWaitForFences(device_, 1, &target->fences[target->imageIndex], VK_TRUE, UINT64_MAX); + vkResetFences(device_, 1, &target->fences[target->imageIndex]); VkCommandBuffer commandBuffer = target->commandBuffers[target->currentResource]; @@ -118,7 +118,7 @@ void Renderer::render(World& world, Camera& camera, RenderTarget* target) { renderPassBeginInfo = {}; renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - renderPassBeginInfo.framebuffer = target->swapchainFramebuffers[target->currentResource]; + renderPassBeginInfo.framebuffer = target->swapchainFramebuffers[target->imageIndex]; renderPassBeginInfo.renderPass = presentationRenderPass_; renderPassBeginInfo.renderArea.extent = target->extent; renderPassBeginInfo.clearValueCount = 1; @@ -145,7 +145,7 @@ void Renderer::render(World& world, Camera& camera, RenderTarget* target) { submitInfo.signalSemaphoreCount = 1; submitInfo.pSignalSemaphores = &target->renderFinishedSemaphore; - vkQueueSubmit(graphicsQueue_, 1, &submitInfo, target->fences[target->currentResource]); + vkQueueSubmit(graphicsQueue_, 1, &submitInfo, target->fences[target->imageIndex]); VkPresentInfoKHR presentInfo = {}; presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; @@ -221,27 +221,6 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa // create frame resources target->swapchainImageViews = new VkImageView[swapchainImageCount]; target->swapchainFramebuffers = new VkFramebuffer[swapchainImageCount]; - target->offscreenColorImages = new VkImage[swapchainImageCount]; - target->offscreenColorMemory = new VkDeviceMemory[swapchainImageCount]; - target->offscreenColorImageViews = new VkImageView[swapchainImageCount]; - target->offscreenDepthImages = new VkImage[swapchainImageCount]; - target->offscreenDepthMemory = new VkDeviceMemory[swapchainImageCount]; - target->offscreenDepthImageViews = new VkImageView[swapchainImageCount]; - target->offscreenFramebuffers = new VkFramebuffer[swapchainImageCount]; - target->nearFieldImages = new VkImage[swapchainImageCount]; - target->nearFieldMemory = new VkDeviceMemory[swapchainImageCount]; - target->nearFieldImageViews = new VkImageView[swapchainImageCount]; - target->nearFieldFramebuffers = new VkFramebuffer[swapchainImageCount]; - target->farFieldImages = new VkImage[swapchainImageCount]; - target->farFieldMemory = new VkDeviceMemory[swapchainImageCount]; - target->farFieldImageViews = new VkImageView[swapchainImageCount]; - target->farFieldFramebuffers = new VkFramebuffer[swapchainImageCount]; - target->imguiVertexBuffers = new VkBuffer[swapchainImageCount]; - target->imguiVertexMemorys = new VkDeviceMemory[swapchainImageCount]; - target->imguiVertexBufferSizes = new size_t[swapchainImageCount]; - target->imguiIndexBuffers = new VkBuffer[swapchainImageCount]; - target->imguiIndexMemorys = new VkDeviceMemory[swapchainImageCount]; - target->imguiIndexBufferSizes = new size_t[swapchainImageCount]; for(uint32_t i = 0; i < swapchainImageCount; i++) { // swapchain image view { @@ -270,7 +249,30 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa vkCreateFramebuffer(device_, &framebufferInfo, nullptr, &target->swapchainFramebuffers[i]); } + } + target->offscreenColorImages = new VkImage[numFrameResources]; + target->offscreenColorMemory = new VkDeviceMemory[numFrameResources]; + target->offscreenColorImageViews = new VkImageView[numFrameResources]; + target->offscreenDepthImages = new VkImage[numFrameResources]; + target->offscreenDepthMemory = new VkDeviceMemory[numFrameResources]; + target->offscreenDepthImageViews = new VkImageView[numFrameResources]; + target->offscreenFramebuffers = new VkFramebuffer[numFrameResources]; + target->nearFieldImages = new VkImage[numFrameResources]; + target->nearFieldMemory = new VkDeviceMemory[numFrameResources]; + target->nearFieldImageViews = new VkImageView[numFrameResources]; + target->nearFieldFramebuffers = new VkFramebuffer[numFrameResources]; + target->farFieldImages = new VkImage[numFrameResources]; + target->farFieldMemory = new VkDeviceMemory[numFrameResources]; + target->farFieldImageViews = new VkImageView[numFrameResources]; + target->farFieldFramebuffers = new VkFramebuffer[numFrameResources]; + target->imguiVertexBuffers = new VkBuffer[numFrameResources]; + target->imguiVertexMemorys = new VkDeviceMemory[numFrameResources]; + target->imguiVertexBufferSizes = new size_t[numFrameResources]; + target->imguiIndexBuffers = new VkBuffer[numFrameResources]; + target->imguiIndexMemorys = new VkDeviceMemory[numFrameResources]; + target->imguiIndexBufferSizes = new size_t[numFrameResources]; + for(uint32_t i = 0; i < numFrameResources; i++) { // offscreen image { VkImageCreateInfo imageCreateInfo = {}; @@ -509,9 +511,9 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa allocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; allocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; allocateInfo.commandPool = commandPool_; - allocateInfo.commandBufferCount = swapchainImageCount; + allocateInfo.commandBufferCount = numFrameResources; - target->commandBuffers = new VkCommandBuffer[swapchainImageCount]; + target->commandBuffers = new VkCommandBuffer[numFrameResources]; vkAllocateCommandBuffers(device_, &allocateInfo, target->commandBuffers); @@ -551,7 +553,7 @@ void Renderer::destroyRenderTarget(RenderTarget* target) { vkFreeDescriptorSets(device_, descriptorPool_, target->numImages, target->dofSets); vkFreeDescriptorSets(device_, descriptorPool_, target->numImages, target->postSets); - for(uint32_t i = 0; i < target->numImages; i++) { + for(uint32_t i = 0; i < numFrameResources; i++) { vkFreeMemory(device_, target->imguiIndexMemorys[i], nullptr); vkDestroyBuffer(device_, target->imguiIndexBuffers[i], nullptr); @@ -579,7 +581,9 @@ void Renderer::destroyRenderTarget(RenderTarget* target) { vkDestroyImageView(device_, target->offscreenColorImageViews[i], nullptr); vkFreeMemory(device_, target->offscreenColorMemory[i], nullptr); vkDestroyImage(device_, target->offscreenColorImages[i], nullptr); + } + for(uint32_t i =0; i < target->numImages; i++) { vkDestroyFramebuffer(device_, target->swapchainFramebuffers[i], nullptr); vkDestroyImageView(device_, target->swapchainImageViews[i], nullptr); }