diff --git a/aster/swapchain.cpp b/aster/swapchain.cpp index f462716..82dcf4e 100644 --- a/aster/swapchain.cpp +++ b/aster/swapchain.cpp @@ -9,10 +9,12 @@ #include "physical_device.h" #include "window.h" +[[nodiscard]] vk::Extent2D GetExtent(const Window *window, vk::SurfaceCapabilitiesKHR *surfaceCapabilities); + Swapchain::Swapchain(const Window *window, const Device *device, NameString &&name) : m_Device(device) - , m_Name(std::move(name)) - , m_Format(vk::Format::eUndefined) + , m_Name(std::move(name)) + , m_Format(vk::Format::eUndefined) { this->Create(window); } @@ -24,12 +26,12 @@ Swapchain::~Swapchain() Swapchain::Swapchain(Swapchain &&other) noexcept : m_Device(other.m_Device) - , m_Swapchain(Take(other.m_Swapchain)) - , m_Name(std::move(other.m_Name)) - , m_Extent(other.m_Extent) - , m_Format(other.m_Format) - , m_Images(std::move(other.m_Images)) - , m_ImageViews(std::move(other.m_ImageViews)) + , m_Swapchain(Take(other.m_Swapchain)) + , m_Name(std::move(other.m_Name)) + , m_Extent(other.m_Extent) + , m_Format(other.m_Format) + , m_Images(std::move(other.m_Images)) + , m_ImageViews(std::move(other.m_ImageViews)) { } @@ -52,6 +54,15 @@ void Swapchain::Create(const Window *window) { auto surfaceCapabilities = GetSurfaceCapabilities(m_Device->m_PhysicalDevice, window->m_Surface); + m_Extent = GetExtent(window, &surfaceCapabilities); + + while (m_Extent.width == 0 || m_Extent.height == 0) + { + glfwWaitEvents(); + surfaceCapabilities = GetSurfaceCapabilities(m_Device->m_PhysicalDevice, window->m_Surface); + m_Extent = GetExtent(window, &surfaceCapabilities); + } + auto surfaceFormats = GetSurfaceFormats(m_Device->m_PhysicalDevice, window->m_Surface); auto presentModes = GetSurfacePresentModes(m_Device->m_PhysicalDevice, window->m_Surface); @@ -83,20 +94,6 @@ Swapchain::Create(const Window *window) } } - if (surfaceCapabilities.currentExtent.width != MaxValue) - { - m_Extent = surfaceCapabilities.currentExtent; - } - else - { - auto [width, height] = window->GetSize(); - auto [minWidth, minHeight] = surfaceCapabilities.minImageExtent; - auto [maxWidth, maxHeight] = surfaceCapabilities.maxImageExtent; - - m_Extent.width = glm::clamp(width, minWidth, maxWidth); - m_Extent.height = glm::clamp(height, minHeight, maxHeight); - } - u32 swapchainImageCount = 3; if (surfaceCapabilities.maxImageCount > 0) { @@ -206,4 +203,22 @@ Swapchain::Cleanup() m_Swapchain = nullptr; DEBUG("Swapchain '{}' destroyed.", m_Name); } +} + +vk::Extent2D +GetExtent(const Window *window, vk::SurfaceCapabilitiesKHR *surfaceCapabilities) +{ + if (surfaceCapabilities->currentExtent.width != MaxValue) + { + return surfaceCapabilities->currentExtent; + } + + auto [width, height] = window->GetSize(); + auto [minWidth, minHeight] = surfaceCapabilities->minImageExtent; + auto [maxWidth, maxHeight] = surfaceCapabilities->maxImageExtent; + + return { + .width = glm::clamp(width, minWidth, maxWidth), + .height = glm::clamp(height, minHeight, maxHeight), + }; } \ No newline at end of file diff --git a/aster/window.cpp b/aster/window.cpp index b5fac6a..edc2876 100644 --- a/aster/window.cpp +++ b/aster/window.cpp @@ -25,7 +25,7 @@ Window::GetSize() const { int width; int height; - glfwGetWindowSize(m_Window, &width, &height); + glfwGetFramebufferSize(m_Window, &width, &height); return {Cast(width), Cast(height)}; } diff --git a/aster/window.h b/aster/window.h index 1174c9c..db3262f 100644 --- a/aster/window.h +++ b/aster/window.h @@ -29,6 +29,7 @@ struct Window final void SetWindowSize(const vk::Extent2D &extent) const noexcept; void SetWindowSize(u32 width, u32 height) const noexcept; + /// Actual size of the framebuffer being used for the window render. [[nodiscard]] vk::Extent2D GetSize() const; // Ctor/Dtor