From d435be97e2daf814cde62b6ff3a9c50033850962 Mon Sep 17 00:00:00 2001 From: JimmyBinoculars Date: Sun, 22 Feb 2026 17:42:21 +0000 Subject: [PATCH] Better structure again (whoohoo)! --- VulkanTest | Bin 121824 -> 121824 bytes build/cve_renderer.o | Bin 23680 -> 24200 bytes build/cve_swap_chain.o | Bin 38680 -> 38680 bytes build/first_app.o | Bin 19648 -> 19648 bytes cve_renderer.cpp | 13 ++++++++----- cve_renderer.hpp | 10 ++++++++-- cve_swap_chain.cpp | 1 + cve_swap_chain.hpp | 6 ++++++ 8 files changed, 23 insertions(+), 7 deletions(-) diff --git a/VulkanTest b/VulkanTest index c54f8a3f8945729f9603ae0e9efe24b98c91fa50..c0d2514bff86aaeccc7968990ef20f9efaba673d 100755 GIT binary patch delta 21124 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 delta 21000 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 literal 23680 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 diff --git a/build/cve_swap_chain.o b/build/cve_swap_chain.o index f1f3b726826d036ea61b8d3aeb9cecceaf06fceb..a34cc4d1bbc6c86fe88011ccd93a55d51dfe1d24 100644 GIT binary patch delta 242 zcmbQSj%mg^rVW$%7&$gi;d{#jq?!c989AI;I*)pEJ9A8)C!`qR#l*niVR?bSNfX5A zt`6|%_V)1T{Ns_y47T8Jshun?Y|1!c zbAWIIqm}i)|NlKYy)#}K0U7-A3?7UJJuJ`jw=hG*17806iz0p+$OWpmczI|tm#C)v p3?Mg+U%rI_1UwG@V)p2*PVmsY_5#FzxodKes3v2<<{HsCjR0(5TW|mX delta 242 zcmbQSj%mg^rVW$%7+E$?;d{#jq?!c98Cj2dbUU+5UMQp(;mgFp;9+@zzexwg=&la% z==S#T==|lOdCJ4`5PwrCO#TZaSUv+NpMWH93zOdimJc@Yune}~Z)un;C2Y#VFYmyx zIY799(aPfA|NkDH-Wf0Tfee0m1`o!A9+v0%TNohX0WZJ*MG-#%wlkvbz#tr)z84V`yXAI`BU}0eJ=$>ydS&FHU*8s$6yj6e#2cSL>NaKHhz@zg%zhJY$<~{6d KLGoFgVa@>ai6T(| delta 116 zcmX>wlkvbz#tr)z88s&FXAI^rU}0eJ=$@}JS&FHUR|CXpyj6e#3!pv_NaKHhz@zg%zhJY*<~{6d KLGoFgVa@>EK_T$~ diff --git a/cve_renderer.cpp b/cve_renderer.cpp index 166d72d..66b109e 100644 --- a/cve_renderer.cpp +++ b/cve_renderer.cpp @@ -25,10 +25,11 @@ namespace cve { if (cveSwapChain == nullptr) { cveSwapChain = std::make_unique(cveDevice, extent); } else { - cveSwapChain = std::make_unique(cveDevice, extent, std::move(cveSwapChain)); - if (cveSwapChain->imageCount() != commandBuffers.size()) { - freeCommandBuffers(); - createCommandBuffers(); + std::shared_ptr oldSwapChain = std::move(cveSwapChain); + cveSwapChain = std::make_unique(cveDevice, extent, oldSwapChain); + + if (!oldSwapChain->compareSwapFormats(*cveSwapChain.get())) { + throw std::runtime_error("Swap chain image format/depth has changed."); } } @@ -36,7 +37,7 @@ namespace cve { } void CveRenderer::createCommandBuffers() { - commandBuffers.resize(cveSwapChain->imageCount()); + commandBuffers.resize(CveSwapChain::MAX_FRAMES_IN_FLIGHT); VkCommandBufferAllocateInfo allocInfo{}; allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; @@ -99,6 +100,8 @@ namespace cve { } isFrameStarted = false; + + currentFrameIndex = (currentFrameIndex + 1) % CveSwapChain::MAX_FRAMES_IN_FLIGHT; } void CveRenderer::beginSwapChainRenderPass(VkCommandBuffer commandBuffer) { diff --git a/cve_renderer.hpp b/cve_renderer.hpp index 5a3e0d0..8cf1923 100644 --- a/cve_renderer.hpp +++ b/cve_renderer.hpp @@ -23,7 +23,12 @@ namespace cve { VkCommandBuffer getCurrentCommandBuffer() const { assert(isFrameStarted && "Cannot get command buffer when frame is not in progress"); - return commandBuffers[currentImageIndex]; + return commandBuffers[currentFrameIndex]; + } + + int getFrameIndex() const { + assert(isFrameStarted && "Cannot get frame index when frame is not started"); + return currentFrameIndex; } VkCommandBuffer beginFrame(); @@ -41,7 +46,8 @@ namespace cve { std::unique_ptr cveSwapChain; std::vector commandBuffers; - uint32_t currentImageIndex; + uint32_t currentImageIndex = 0; + int currentFrameIndex = 0; bool isFrameStarted = false; }; } diff --git a/cve_swap_chain.cpp b/cve_swap_chain.cpp index ec5f3ea..069748f 100644 --- a/cve_swap_chain.cpp +++ b/cve_swap_chain.cpp @@ -301,6 +301,7 @@ void CveSwapChain::createFramebuffers() { void CveSwapChain::createDepthResources() { VkFormat depthFormat = findDepthFormat(); + swapChainDepthFormat = depthFormat; VkExtent2D swapChainExtent = getSwapChainExtent(); depthImages.resize(imageCount()); diff --git a/cve_swap_chain.hpp b/cve_swap_chain.hpp index 346b530..df165d8 100644 --- a/cve_swap_chain.hpp +++ b/cve_swap_chain.hpp @@ -40,6 +40,11 @@ class CveSwapChain { VkResult acquireNextImage(uint32_t *imageIndex); VkResult submitCommandBuffers(const VkCommandBuffer *buffers, uint32_t *imageIndex); + bool compareSwapFormats(const CveSwapChain& swapChain) const { + return swapChain.swapChainDepthFormat == swapChainDepthFormat && + swapChain.swapChainImageFormat == swapChainImageFormat; + }; + private: void init(); void createSwapChain(); @@ -57,6 +62,7 @@ class CveSwapChain { VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR &capabilities); VkFormat swapChainImageFormat; + VkFormat swapChainDepthFormat; VkExtent2D swapChainExtent; std::vector swapChainFramebuffers;