import vulkan , vulkan_record , pipeline_record , ../scene/[ scene_record , scene_controller ] proc prepare_frame*(rec: var Vulkan_Record , scene_record: var Scene_Record , pipeline_record: Pipeline_Record ) = discard vkAcquireNextImageKHR( rec.vk_device , rec.swapChain.handle , uint64.high , rec.presentCompleteSemaphore , VkFence 0 , addr rec.currentFrameBuffer ) discard vkWaitForFences(rec.vk_device, 1, addr rec.fences[rec.currentFrameBuffer], VKBool32 true, uint64.high) discard vkResetFences(rec.vk_device, 1, addr rec.fences[rec.currentFrameBuffer]) # proc submit_frame*( current_frame_buffer: uint32 , render_complete_semaphore: VkSemaphore , queue: VkQueue #, scene: var Scene , present_info: var VkPresentInfoKHR ) = #for shape in scene.shapes.mitems: #if shape.changed: rec.vk_device.updateCamera shape #[ for text in scene.texts.mitems: if text.changed: text.updateCamera ]# # THE M A G I C (presenting) queuePresent #[ var presentInfo: VkPresentInfoKHR presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR presentInfo.pNext = nil presentInfo.swapchainCount = 1 presentInfo.pSwapchains = addr rec.swapChain.swapChainKHR ]# present_info.pImageIndices = addr current_frame_buffer #rec.currentFrameBuffer # Check if a wait semaphore has been specified to wait for # before presenting the image if (render_complete_semaphore.int != 0): presentInfo.pWaitSemaphores = addr render_complete_semaphore presentInfo.waitSemaphoreCount = 1 #TODO: WHY DOES THIS MEMORY LEAK EVERY FRAME var preres = vkQueuePresentKHR( queue , addr presentInfo ) #if preres == VK_SUBOPTIMAL_KHR: quit "bad vkQueuePresentKHR" # rec.windowResize scene # scene.rebuild rec # discard vkDeviceWaitIdle rec.vk_device # rec.readyFrame = true proc draw*(rec: var Vulkan_Record , scene_record: var Scene_Record , pipeline_record: Pipeline_Record ) = if rec.readyFrame: rec.prepare_frame scene_record, pipeline_record scene_record.draw_current_scene rec, pipeline_record var waitStageMask = VkPipelineStageFlags VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT submitInfo = VkSubmitInfo( sType: VK_STRUCTURE_TYPE_SUBMIT_INFO , pWaitDstStageMask: addr waitStageMask , pWaitSemaphores: addr rec.presentCompleteSemaphore , waitSemaphoreCount: 1 , pSignalSemaphores: addr rec.renderCompleteSemaphore , commandBufferCount: 1 , pCommandBuffers: addr rec.draw_command_buffers[rec.currentFrameBuffer] , signalSemaphoreCount: 1 ) discard vkQueueSubmit( rec.queue , 1 , submitInfo.addr , rec.fences[rec.currentFrameBuffer] ) submit_frame( rec.currentFrameBuffer , rec.renderCompleteSemaphore , rec.queue , scene_record.current_scene[].present_info ) #rec.readyFrame = false