From 4e217306c05bb8cfe7a71aede05e7a95c030c3c1 Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Sat, 5 Jun 2021 17:15:06 +0200 Subject: [PATCH] [#66] Moved resizing out of event because it is not synchronized yet (see #55) Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- include/vkcv/Core.hpp | 2 +- projects/cmd_sync_test/src/main.cpp | 23 +++++++++++++++-------- projects/first_mesh/src/main.cpp | 27 ++++++++++++++++----------- projects/first_triangle/src/main.cpp | 5 ++++- src/vkcv/Core.cpp | 7 ++++++- 5 files changed, 42 insertions(+), 22 deletions(-) diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp index 67973ba1..81b1defb 100644 --- a/include/vkcv/Core.hpp +++ b/include/vkcv/Core.hpp @@ -218,7 +218,7 @@ namespace vkcv /** * @brief start recording command buffers and increment frame index */ - void beginFrame(); + void beginFrame(uint32_t& width, uint32_t& height); void recordDrawcallsToCmdStream( const CommandStreamHandle cmdStreamHandle, diff --git a/projects/cmd_sync_test/src/main.cpp b/projects/cmd_sync_test/src/main.cpp index 55c11577..e3283fb1 100644 --- a/projects/cmd_sync_test/src/main.cpp +++ b/projects/cmd_sync_test/src/main.cpp @@ -8,8 +8,9 @@ int main(int argc, const char** argv) { const char* applicationName = "First Mesh"; - const int windowWidth = 800; - const int windowHeight = 600; + uint32_t windowWidth = 800; + uint32_t windowHeight = 600; + vkcv::Window window = vkcv::Window::create( applicationName, windowWidth, @@ -138,10 +139,6 @@ int main(int argc, const char** argv) { vkcv::ImageHandle depthBuffer = core.createImage(vk::Format::eD32Sfloat, windowWidth, windowHeight).getHandle(); - window.e_resize.add([&](int width, int height) { - depthBuffer = core.createImage(vk::Format::eD32Sfloat, width, height).getHandle(); - }); - const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle(); const vkcv::DescriptorSetUsage descriptorUsage(0, core.getDescriptorSet(descriptorSet).vulkanHandle); @@ -164,8 +161,18 @@ int main(int argc, const char** argv) { auto start = std::chrono::system_clock::now(); while (window.isWindowOpen()) { - window.pollEvents(); - core.beginFrame(); + vkcv::Window::pollEvents(); + + uint32_t swapchainWidth, swapchainHeight; + core.beginFrame(swapchainWidth, swapchainHeight); + + if ((swapchainWidth != windowWidth) || ((swapchainHeight != windowHeight))) { + depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle(); + + windowWidth = swapchainWidth; + windowHeight = swapchainHeight; + } + auto end = std::chrono::system_clock::now(); auto deltatime = end - start; start = end; diff --git a/projects/first_mesh/src/main.cpp b/projects/first_mesh/src/main.cpp index 27b255c3..97e866c3 100644 --- a/projects/first_mesh/src/main.cpp +++ b/projects/first_mesh/src/main.cpp @@ -8,8 +8,8 @@ int main(int argc, const char** argv) { const char* applicationName = "First Mesh"; - const int windowWidth = 800; - const int windowHeight = 600; + uint32_t windowWidth = 800; + uint32_t windowHeight = 600; vkcv::Window window = vkcv::Window::create( applicationName, @@ -137,10 +137,6 @@ int main(int argc, const char** argv) { vkcv::ImageHandle depthBuffer = core.createImage(vk::Format::eD32Sfloat, windowWidth, windowHeight).getHandle(); - window.e_resize.add([&](int width, int height) { - depthBuffer = core.createImage(vk::Format::eD32Sfloat, width, height).getHandle(); - }); - const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle(); const vkcv::Mesh renderMesh(vertexBufferBindings, indexBuffer.getVulkanHandle(), mesh.vertexGroups[0].numIndices); @@ -151,11 +147,20 @@ int main(int argc, const char** argv) { auto start = std::chrono::system_clock::now(); while (window.isWindowOpen()) { vkcv::Window::pollEvents(); - - if(window.getHeight() == 0 || window.getWidth() == 0) - continue; - - core.beginFrame(); + + if(window.getHeight() == 0 || window.getWidth() == 0) + continue; + + uint32_t swapchainWidth, swapchainHeight; + core.beginFrame(swapchainWidth, swapchainHeight); + + if ((swapchainWidth != windowWidth) || ((swapchainHeight != windowHeight))) { + depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle(); + + windowWidth = swapchainWidth; + windowHeight = swapchainHeight; + } + auto end = std::chrono::system_clock::now(); auto deltatime = end - start; start = end; diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp index b4a08659..70366d13 100644 --- a/projects/first_triangle/src/main.cpp +++ b/projects/first_triangle/src/main.cpp @@ -142,7 +142,10 @@ int main(int argc, const char** argv) { while (window.isWindowOpen()) { window.pollEvents(); - core.beginFrame(); + + uint32_t swapchainWidth, swapchainHeight; // No resizing = No problem + core.beginFrame(swapchainWidth, swapchainHeight); + auto end = std::chrono::system_clock::now(); auto deltatime = end - start; start = end; diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp index c9ac4dec..ddcb0086 100644 --- a/src/vkcv/Core.cpp +++ b/src/vkcv/Core.cpp @@ -127,7 +127,7 @@ namespace vkcv return Result::SUCCESS; } - void Core::beginFrame() { + void Core::beginFrame(uint32_t& width, uint32_t& height) { if (m_swapchain.shouldUpdateSwapchain()) { m_Context.getDevice().waitIdle(); @@ -149,6 +149,11 @@ namespace vkcv } m_Context.getDevice().waitIdle(); // TODO: this is a sin against graphics programming, but its getting late - Alex + + const auto& extent = m_swapchain.getExtent(); + + width = extent.width; + height = extent.height; } void Core::recordDrawcallsToCmdStream( -- GitLab