Modified rendering framework to support surface size of 0 width and 0 height (this can occur on Windows when window gets minimized). In such situation, swapchain is not created and rendering function is not called. Instead, rendering loop waits for 1/10 of a second.

This commit is contained in:
plapins
2016-06-20 16:26:00 +02:00
parent 55b350815e
commit a4f78d3eed
4 changed files with 71 additions and 15 deletions

View File

@@ -58,10 +58,14 @@ namespace ApiWithoutSecrets {
bool VulkanCommon::OnWindowSizeChanged() {
ChildClear();
if( !CreateSwapChain() ) {
return false;
if( CreateSwapChain() ) {
if( CanRender ) {
return ChildOnWindowSizeChanged();
}
return true;
}
return ChildOnWindowSizeChanged();
return false;
}
VkPhysicalDevice VulkanCommon::GetPhysicalDevice() const {
@@ -434,6 +438,8 @@ namespace ApiWithoutSecrets {
}
bool VulkanCommon::CreateSwapChain() {
CanRender = false;
if( Vulkan.Device != VK_NULL_HANDLE ) {
vkDeviceWaitIdle( Vulkan.Device );
}
@@ -492,6 +498,11 @@ namespace ApiWithoutSecrets {
if( static_cast<int>(desired_present_mode) == -1 ) {
return false;
}
if( (desired_extent.width == 0) || (desired_extent.height == 0) ) {
// Current surface size is (0, 0) so we can't create a swap chain and render anything (CanRender == false)
// But we don't wont to kill the application as this situation may occur i.e. when window gets minimized
return true;
}
VkSwapchainCreateInfoKHR swap_chain_create_info = {
VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, // VkStructureType sType
@@ -576,6 +587,8 @@ namespace ApiWithoutSecrets {
}
}
CanRender = true;
return true;
}