Fixed issue at window minimization.

This commit is contained in:
Anish Bhobe 2024-07-20 02:06:10 +02:00
parent cee0cad0bd
commit ab947ad9f9
3 changed files with 39 additions and 23 deletions

View File

@ -9,10 +9,12 @@
#include "physical_device.h" #include "physical_device.h"
#include "window.h" #include "window.h"
[[nodiscard]] vk::Extent2D GetExtent(const Window *window, vk::SurfaceCapabilitiesKHR *surfaceCapabilities);
Swapchain::Swapchain(const Window *window, const Device *device, NameString &&name) Swapchain::Swapchain(const Window *window, const Device *device, NameString &&name)
: m_Device(device) : m_Device(device)
, m_Name(std::move(name)) , m_Name(std::move(name))
, m_Format(vk::Format::eUndefined) , m_Format(vk::Format::eUndefined)
{ {
this->Create(window); this->Create(window);
} }
@ -24,12 +26,12 @@ Swapchain::~Swapchain()
Swapchain::Swapchain(Swapchain &&other) noexcept Swapchain::Swapchain(Swapchain &&other) noexcept
: m_Device(other.m_Device) : m_Device(other.m_Device)
, m_Swapchain(Take(other.m_Swapchain)) , m_Swapchain(Take(other.m_Swapchain))
, m_Name(std::move(other.m_Name)) , m_Name(std::move(other.m_Name))
, m_Extent(other.m_Extent) , m_Extent(other.m_Extent)
, m_Format(other.m_Format) , m_Format(other.m_Format)
, m_Images(std::move(other.m_Images)) , m_Images(std::move(other.m_Images))
, m_ImageViews(std::move(other.m_ImageViews)) , m_ImageViews(std::move(other.m_ImageViews))
{ {
} }
@ -52,6 +54,15 @@ void
Swapchain::Create(const Window *window) Swapchain::Create(const Window *window)
{ {
auto surfaceCapabilities = GetSurfaceCapabilities(m_Device->m_PhysicalDevice, window->m_Surface); 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 surfaceFormats = GetSurfaceFormats(m_Device->m_PhysicalDevice, window->m_Surface);
auto presentModes = GetSurfacePresentModes(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<u32>)
{
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; u32 swapchainImageCount = 3;
if (surfaceCapabilities.maxImageCount > 0) if (surfaceCapabilities.maxImageCount > 0)
{ {
@ -206,4 +203,22 @@ Swapchain::Cleanup()
m_Swapchain = nullptr; m_Swapchain = nullptr;
DEBUG("Swapchain '{}' destroyed.", m_Name); DEBUG("Swapchain '{}' destroyed.", m_Name);
} }
}
vk::Extent2D
GetExtent(const Window *window, vk::SurfaceCapabilitiesKHR *surfaceCapabilities)
{
if (surfaceCapabilities->currentExtent.width != MaxValue<u32>)
{
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),
};
} }

View File

@ -25,7 +25,7 @@ Window::GetSize() const
{ {
int width; int width;
int height; int height;
glfwGetWindowSize(m_Window, &width, &height); glfwGetFramebufferSize(m_Window, &width, &height);
return {Cast<u32>(width), Cast<u32>(height)}; return {Cast<u32>(width), Cast<u32>(height)};
} }

View File

@ -29,6 +29,7 @@ struct Window final
void SetWindowSize(const vk::Extent2D &extent) const noexcept; void SetWindowSize(const vk::Extent2D &extent) const noexcept;
void SetWindowSize(u32 width, u32 height) 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; [[nodiscard]] vk::Extent2D GetSize() const;
// Ctor/Dtor // Ctor/Dtor