changeset 512:9fd6a78c94a2

fix: quit early to prevent swapchain recreation after program termination
author Sam <sam@basx.dev>
date Thu, 19 Jan 2023 17:00:06 +0700
parents 2d81453d8f91
children 5c8ce3d5a519
files src/semicongine/engine.nim src/semicongine/vulkan_helpers.nim
diffstat 2 files changed, 9 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/semicongine/engine.nim	Thu Jan 19 16:41:50 2023 +0700
+++ b/src/semicongine/engine.nim	Thu Jan 19 17:00:06 2023 +0700
@@ -711,18 +711,17 @@
 
 proc run*(engine: var Engine, pipeline: var RenderPipeline, globalUpdate: proc(engine: var Engine, dt: float32)) =
   var
-    killed = false
     currentFrame = 0
     resized = false
     lastUpdate = getTime()
 
-  while not killed:
-
+  while true:
     # process input
     engine.input.keysPressed = {}
     engine.input.keysReleased = {}
     engine.input.mousePressed = {}
     engine.input.mouseReleased = {}
+    var killed = false
     for event in engine.window.pendingEvents():
       case event.eventType:
         of Quit:
@@ -746,6 +745,8 @@
           engine.input.mouseY = event.y
         else:
           discard
+    if killed: # at least on windows we should return immediately as swapchain recreation will fail after kill
+      break
 
     # game logic update
     let
--- a/src/semicongine/vulkan_helpers.nim	Thu Jan 19 16:41:50 2023 +0700
+++ b/src/semicongine/vulkan_helpers.nim	Thu Jan 19 17:00:06 2023 +0700
@@ -100,21 +100,21 @@
 
 proc getDeviceSurfaceFormats*(device: VkPhysicalDevice, surface: VkSurfaceKHR): seq[VkSurfaceFormatKHR] =
   var n_formats: uint32
-  checkVkResult vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, addr(n_formats), nil);
+  checkVkResult vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, addr(n_formats), nil)
   result = newSeq[VkSurfaceFormatKHR](n_formats)
   checkVkResult vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, addr(n_formats), addrOrNil(result))
 
 
 proc getDeviceSurfacePresentModes*(device: VkPhysicalDevice, surface: VkSurfaceKHR): seq[VkPresentModeKHR] =
   var n_modes: uint32
-  checkVkResult vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, addr(n_modes), nil);
+  checkVkResult vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, addr(n_modes), nil)
   result = newSeq[VkPresentModeKHR](n_modes)
   checkVkResult vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, addr(n_modes), addrOrNil(result))
 
 
 proc getSwapChainImages*(device: VkDevice, swapChain: VkSwapchainKHR): seq[VkImage] =
   var n_images: uint32
-  checkVkResult vkGetSwapchainImagesKHR(device, swapChain, addr(n_images), nil);
+  checkVkResult vkGetSwapchainImagesKHR(device, swapChain, addr(n_images), nil)
   result = newSeq[VkImage](n_images)
   checkVkResult vkGetSwapchainImagesKHR(device, swapChain, addr(n_images), addr(result[0]))
 
@@ -211,8 +211,8 @@
     ppEnabledExtensionNames: cast[ptr UncheckedArray[cstring]](addr(requiredExtensions))
   )
   checkVkResult vkCreateDevice(physicalDevice, addr(deviceCreateInfo), nil, addr(result[0]))
-  vkGetDeviceQueue(result[0], graphicsQueueFamily, 0'u32, addr(result[1]));
-  vkGetDeviceQueue(result[0], presentationQueueFamily, 0'u32, addr(result[2]));
+  vkGetDeviceQueue(result[0], graphicsQueueFamily, 0'u32, addr(result[1]))
+  vkGetDeviceQueue(result[0], presentationQueueFamily, 0'u32, addr(result[2]))
 
 proc debugCallback*(
   messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT,