+ uint32_t img_idx;
+ VkSubmitInfo sinfo;
+ VkPipelineStageFlags wait_stages = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ VkPresentInfoKHR pinfo;
+
+ vkAcquireNextImageKHR(vk_core.dev, vk_chain.swapchain,
+ UINT64_MAX, vk_sema.frame_ready, 0, &img_idx);
+
+ memset(&sinfo, 0, sizeof sinfo);
+ sinfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ sinfo.waitSemaphoreCount = 1;
+ sinfo.pWaitSemaphores = &vk_sema.frame_ready;
+ sinfo.pWaitDstStageMask = &wait_stages;
+ sinfo.commandBufferCount = 1;
+ sinfo.pCommandBuffers = &vk_cmd_buf;
+ sinfo.signalSemaphoreCount = 1;
+ sinfo.pSignalSemaphores = &vk_sema.frame_done;
+
+ if (vkQueueSubmit(vk_core.queue, 1, &sinfo, 0) != 0) {
+ fprintf(stderr, "Failed to submit draw commands.\n");
+ abort();
+ }
+
+ memset(&pinfo, 0, sizeof pinfo);
+ pinfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
+ pinfo.waitSemaphoreCount = 1;
+ pinfo.pWaitSemaphores = &vk_sema.frame_done;
+ pinfo.swapchainCount = 1;
+ pinfo.pSwapchains = &vk_chain.swapchain;
+ pinfo.pImageIndices = &img_idx;
+
+ vkQueuePresentKHR(vk_core.queue, &pinfo);