+
+ vk_cleanup_ctx(&vk_core);
+}
+
+static bool
+vk_create_sync_objects()
+{
+ VkFenceCreateInfo finfo;
+ memset(&finfo, 0, sizeof finfo);
+ finfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
+ finfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
+
+ VkSemaphoreCreateInfo sinfo;
+ memset(&sinfo, 0, sizeof sinfo);
+ sinfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
+
+ vk_fences = (VkFence*)malloc((vk_chain.num_images - 1) * sizeof *vk_fences);
+ memset(vk_fences, VK_NULL_HANDLE, (vk_chain.num_images - 1) * sizeof *vk_fences);
+
+ vk_semas = (struct vk_semaphores *)malloc(sizeof(struct vk_semaphores) * (vk_chain.num_images - 1));
+ memset(vk_semas, VK_NULL_HANDLE, (vk_chain.num_images - 1) * sizeof *vk_fences);
+
+ for (uint32_t i = 0; i < (vk_chain.num_images - 1); i++) {
+ if (vkCreateFence(vk_core.dev, &finfo, 0, &vk_fences[i]) != VK_SUCCESS) {
+ fprintf(stderr, "Failed to create fence: %d\n", i);
+ return false;
+ }
+
+ if (vkCreateSemaphore(vk_core.dev, &sinfo, 0, &vk_semas[i].frame_ready) != VK_SUCCESS) {
+ fprintf(stderr, "Failed to create frame_ready semaphore: %d\n", i);
+ return false;
+ }
+
+ if (vkCreateSemaphore(vk_core.dev, &sinfo, 0, &vk_semas[i].frame_done) != VK_SUCCESS) {
+ fprintf(stderr, "Failed to create frame_done semaphore: %d\n", i);
+ return false;
+ }
+ }
+
+ return true;