mirror of
https://github.com/opus-tango/IntroductionToVulkan.git
synced 2026-03-20 03:55:26 +00:00
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:
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ************************************************************ //
|
// ************************************************************ //
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user