comparison semicongine/rendering/swapchain.nim @ 1494:02e869aded5d

fix: issue with presentation-wait semaphores
author sam <sam@basx.dev>
date Wed, 24 Sep 2025 21:57:52 +0700
parents 801496756651
children a9c0f899a734
comparison
equal deleted inserted replaced
1493:986e37dc76e0 1494:02e869aded5d
153 ) 153 )
154 154
155 # create sync primitives 155 # create sync primitives
156 for i in 0 ..< INFLIGHTFRAMES: 156 for i in 0 ..< INFLIGHTFRAMES:
157 swapchain.queueFinishedFence[i] = svkCreateFence(signaled = true) 157 swapchain.queueFinishedFence[i] = svkCreateFence(signaled = true)
158 swapchain.renderFinishedSemaphore[i] = svkCreateSemaphore()
159
160 swapchain.imageAvailableSemaphore.setLen(framebuffers.len)
161 for i in 0 ..< framebuffers.len:
158 swapchain.imageAvailableSemaphore[i] = svkCreateSemaphore() 162 swapchain.imageAvailableSemaphore[i] = svkCreateSemaphore()
159 swapchain.renderFinishedSemaphore[i] = svkCreateSemaphore()
160 163
161 # command buffers 164 # command buffers
162 var commandPoolCreateInfo = VkCommandPoolCreateInfo( 165 var commandPoolCreateInfo = VkCommandPoolCreateInfo(
163 sType: VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, 166 sType: VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
164 flags: toBits [VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT], 167 flags: toBits [VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT],
222 let nextImageResult = vkAcquireNextImageKHR( 225 let nextImageResult = vkAcquireNextImageKHR(
223 engine().vulkan.device, 226 engine().vulkan.device,
224 swapchain.vk, 227 swapchain.vk,
225 # high(uint64), 228 # high(uint64),
226 10_000_000'u64, # wait max 10ms 229 10_000_000'u64, # wait max 10ms
227 swapchain.imageAvailableSemaphore[swapchain.currentFiF], 230 swapchain.imageAvailableSemaphore[swapchain.currentFramebufferIndex],
228 VkFence(0), 231 VkFence(0),
229 addr(swapchain.currentFramebufferIndex), 232 addr(swapchain.currentFramebufferIndex),
230 ) 233 )
231 234
232 swapchain.queueFinishedFence[swapchain.currentFiF].svkResetFences() 235 swapchain.queueFinishedFence[swapchain.currentFiF].svkResetFences()
234 if nextImageResult != VK_SUCCESS: 237 if nextImageResult != VK_SUCCESS:
235 return none(VkFramebuffer) 238 return none(VkFramebuffer)
236 return some(swapchain.framebuffers[swapchain.currentFramebufferIndex]) 239 return some(swapchain.framebuffers[swapchain.currentFramebufferIndex])
237 240
238 proc swap(swapchain: Swapchain, commandBuffer: VkCommandBuffer): bool = 241 proc swap(swapchain: Swapchain, commandBuffer: VkCommandBuffer): bool =
242 debugecho "currentFiF: ", swapchain.currentFiF
239 var 243 var
240 waitStage = VkPipelineStageFlags(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) 244 waitStage = VkPipelineStageFlags(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT)
241 submitInfo = VkSubmitInfo( 245 submitInfo = VkSubmitInfo(
242 sType: VK_STRUCTURE_TYPE_SUBMIT_INFO, 246 sType: VK_STRUCTURE_TYPE_SUBMIT_INFO,
243 waitSemaphoreCount: 1, 247 waitSemaphoreCount: 1,
244 pWaitSemaphores: addr(swapchain.imageAvailableSemaphore[swapchain.currentFiF]), 248 pWaitSemaphores: addr(swapchain.imageAvailableSemaphore[swapchain.currentFramebufferIndex]),
245 pWaitDstStageMask: addr(waitStage), 249 pWaitDstStageMask: addr(waitStage),
246 commandBufferCount: 1, 250 commandBufferCount: 1,
247 pCommandBuffers: addr(commandBuffer), 251 pCommandBuffers: addr(commandBuffer),
248 signalSemaphoreCount: 1, 252 signalSemaphoreCount: 1,
249 pSignalSemaphores: addr(swapchain.renderFinishedSemaphore[swapchain.currentFiF]), 253 pSignalSemaphores: addr(swapchain.renderFinishedSemaphore[swapchain.currentFiF]),