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

@@ -8,6 +8,8 @@
// Intel does not assume any responsibility for any errors which may appear in this software // Intel does not assume any responsibility for any errors which may appear in this software
// nor any responsibility to update it. // nor any responsibility to update it.
#include <thread>
#include <chrono>
#include "OperatingSystem.h" #include "OperatingSystem.h"
namespace ApiWithoutSecrets { namespace ApiWithoutSecrets {
@@ -94,6 +96,7 @@ namespace ApiWithoutSecrets {
MSG message; MSG message;
bool loop = true; bool loop = true;
bool resize = false; bool resize = false;
bool result = true;
while( loop ) { while( loop ) {
if( PeekMessage( &message, NULL, 0, 0, PM_REMOVE ) ) { if( PeekMessage( &message, NULL, 0, 0, PM_REMOVE ) ) {
@@ -115,16 +118,22 @@ namespace ApiWithoutSecrets {
if( resize ) { if( resize ) {
resize = false; resize = false;
if( !tutorial.OnWindowSizeChanged() ) { if( !tutorial.OnWindowSizeChanged() ) {
loop = false; result = false;
break;
} }
} }
if( tutorial.ReadyToDraw() ) {
if( !tutorial.Draw() ) { if( !tutorial.Draw() ) {
loop = false; result = false;
break;
}
} else {
std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) );
} }
} }
} }
return true; return result;
} }
#elif defined(VK_USE_PLATFORM_XCB_KHR) #elif defined(VK_USE_PLATFORM_XCB_KHR)
@@ -203,6 +212,7 @@ namespace ApiWithoutSecrets {
xcb_generic_event_t *event; xcb_generic_event_t *event;
bool loop = true; bool loop = true;
bool resize = false; bool resize = false;
bool result = true;
while( loop ) { while( loop ) {
event = xcb_poll_for_event( Parameters.Connection ); event = xcb_poll_for_event( Parameters.Connection );
@@ -241,16 +251,22 @@ namespace ApiWithoutSecrets {
if( resize ) { if( resize ) {
resize = false; resize = false;
if( !tutorial.OnWindowSizeChanged() ) { if( !tutorial.OnWindowSizeChanged() ) {
loop = false; result = false;
break;
} }
} }
if( tutorial.ReadyToDraw() ) {
if( !tutorial.Draw() ) { if( !tutorial.Draw() ) {
loop = false; result = false;
break;
}
} else {
std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) );
} }
} }
} }
return true; return result;
} }
#elif defined(VK_USE_PLATFORM_XLIB_KHR) #elif defined(VK_USE_PLATFORM_XLIB_KHR)
@@ -299,6 +315,7 @@ namespace ApiWithoutSecrets {
XEvent event; XEvent event;
bool loop = true; bool loop = true;
bool resize = false; bool resize = false;
bool result = true;
while( loop ) { while( loop ) {
if( XPending( Parameters.DisplayPtr ) ) { if( XPending( Parameters.DisplayPtr ) ) {
@@ -334,16 +351,22 @@ namespace ApiWithoutSecrets {
if( resize ) { if( resize ) {
resize = false; resize = false;
if( !tutorial.OnWindowSizeChanged() ) { if( !tutorial.OnWindowSizeChanged() ) {
loop = false; result = false;
break;
} }
} }
if( tutorial.ReadyToDraw() ) {
if( !tutorial.Draw() ) { if( !tutorial.Draw() ) {
loop = false; result = false;
break;
}
} else {
std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) );
} }
} }
} }
return true; return result;
} }
#endif #endif

View File

@@ -58,8 +58,19 @@ namespace ApiWithoutSecrets {
virtual bool OnWindowSizeChanged() = 0; virtual bool OnWindowSizeChanged() = 0;
virtual bool Draw() = 0; virtual bool Draw() = 0;
virtual bool ReadyToDraw() const final {
return CanRender;
}
TutorialBase() :
CanRender( false ) {
}
virtual ~TutorialBase() { virtual ~TutorialBase() {
} }
protected:
bool CanRender;
}; };
// ************************************************************ // // ************************************************************ //

View File

@@ -58,11 +58,15 @@ namespace ApiWithoutSecrets {
bool VulkanCommon::OnWindowSizeChanged() { bool VulkanCommon::OnWindowSizeChanged() {
ChildClear(); ChildClear();
if( !CreateSwapChain() ) { if( CreateSwapChain() ) {
return false; if( CanRender ) {
}
return ChildOnWindowSizeChanged(); return ChildOnWindowSizeChanged();
} }
return true;
}
return false;
}
VkPhysicalDevice VulkanCommon::GetPhysicalDevice() const { VkPhysicalDevice VulkanCommon::GetPhysicalDevice() const {
return Vulkan.PhysicalDevice; return Vulkan.PhysicalDevice;
@@ -434,6 +438,8 @@ namespace ApiWithoutSecrets {
} }
bool VulkanCommon::CreateSwapChain() { bool VulkanCommon::CreateSwapChain() {
CanRender = false;
if( Vulkan.Device != VK_NULL_HANDLE ) { if( Vulkan.Device != VK_NULL_HANDLE ) {
vkDeviceWaitIdle( Vulkan.Device ); vkDeviceWaitIdle( Vulkan.Device );
} }
@@ -492,6 +498,11 @@ namespace ApiWithoutSecrets {
if( static_cast<int>(desired_present_mode) == -1 ) { if( static_cast<int>(desired_present_mode) == -1 ) {
return false; 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 = { VkSwapchainCreateInfoKHR swap_chain_create_info = {
VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, // VkStructureType sType VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, // VkStructureType sType
@@ -576,6 +587,8 @@ namespace ApiWithoutSecrets {
} }
} }
CanRender = true;
return true; return true;
} }

View File

@@ -430,6 +430,8 @@ namespace ApiWithoutSecrets {
} }
bool Tutorial02::CreateSwapChain() { bool Tutorial02::CreateSwapChain() {
CanRender = false;
if( Vulkan.Device != VK_NULL_HANDLE ) { if( Vulkan.Device != VK_NULL_HANDLE ) {
vkDeviceWaitIdle( Vulkan.Device ); vkDeviceWaitIdle( Vulkan.Device );
} }
@@ -480,6 +482,11 @@ namespace ApiWithoutSecrets {
if( static_cast<int>(desired_present_mode) == -1 ) { if( static_cast<int>(desired_present_mode) == -1 ) {
return false; 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 = { VkSwapchainCreateInfoKHR swap_chain_create_info = {
VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, // VkStructureType sType VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, // VkStructureType sType
@@ -510,6 +517,8 @@ namespace ApiWithoutSecrets {
vkDestroySwapchainKHR( Vulkan.Device, old_swap_chain, nullptr ); vkDestroySwapchainKHR( Vulkan.Device, old_swap_chain, nullptr );
} }
CanRender = true;
return true; return true;
} }