diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-09-17 15:21:26 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-09-17 15:21:26 -0400 |
| commit | c3b54d24cdf054e4f8733f3cb1669a83398626f7 (patch) | |
| tree | a877470ab67e4027d9ac68a9acc421eea8ccd3a4 | |
| parent | 2efdf2c04503e93722a9eb6536becd2b266ff029 (diff) | |
pke: Vulkan logging + signal correct semaphore.
| -rw-r--r-- | src/window.cpp | 49 |
1 files changed, 29 insertions, 20 deletions
diff --git a/src/window.cpp b/src/window.cpp index e2cf9b4..64276c7 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -63,7 +63,6 @@ unsigned int transferFamilyIndex; * Instantiation */ bool shouldRecreateSwapchain = false; -unsigned int CURRENT_FRAME = 0; unsigned int selectedSurfaceIndex = -1u; unsigned int swapchainLength = 0u; unsigned int prevSwapchainLength = 0u; @@ -111,11 +110,13 @@ struct PKVK_Present { VkDescriptorPool descriptor_pool; VkDescriptorSet *descriptor_sets; VkCommandBuffer *command_buffers; - VkSemaphore *semaphores_image_available; + VkSemaphore *semaphores_present_complete; VkSemaphore *semaphores_render_finished; VkFence *fences_in_flight; VkImage *images; VkImageView *image_views; + uint32_t semaphore_index; + uint32_t frame_index; } pkvk_present; // TODO consider creating a depth pre-pass @@ -1473,6 +1474,9 @@ void InitVulkan() { vkGetDeviceQueue(vkDevice, graphicsFamilyIndex, 0, &pkvk_shared.queue.graphics); vkGetDeviceQueue(vkDevice, presentFamilyIndex, 0, &presentQueue); vkGetDeviceQueue(vkDevice, transferFamilyIndex, 0, &pkvk_shared.queue.transfer); + fprintf(stdout, "[window.cpp] present queue: %p\n", (void*)presentQueue); + fprintf(stdout, "[window.cpp] graphics queue: %p\n", (void*)pkvk_shared.queue.graphics); + fprintf(stdout, "[window.cpp] transfer queue: %p\n", (void*)pkvk_shared.queue.transfer); } // surface formats @@ -1685,6 +1689,7 @@ void CreateSwapchain() { vkResult = vkCreateSwapchainKHR(vkDevice, &vkSwapchainCreateInfo, vkAllocator, &vkSwapchainKHR); assert(vkResult == VK_SUCCESS); + fprintf(stdout, "[window.cpp] swapchainKHR: %p\n", (void*)vkSwapchainKHR); assert(pkvk_present.images == nullptr || pkvk_present.images == CAFE_BABE(VkImage)); assert(pkvk_present.image_views == nullptr || pkvk_present.image_views == CAFE_BABE(VkImageView)); @@ -2244,7 +2249,7 @@ void CreateUniformBuffers() { } void CreateSyncObjects() { - assert(pkvk_present.semaphores_image_available == nullptr || pkvk_present.semaphores_image_available == CAFE_BABE(VkSemaphore)); + assert(pkvk_present.semaphores_present_complete == nullptr || pkvk_present.semaphores_present_complete == CAFE_BABE(VkSemaphore)); assert(pkvk_present.semaphores_render_finished == nullptr || pkvk_present.semaphores_render_finished == CAFE_BABE(VkSemaphore)); assert(pkvk_present.fences_in_flight == nullptr || pkvk_present.fences_in_flight == CAFE_BABE(VkFence)); VkSemaphoreCreateInfo semaphoreInfo; @@ -2257,17 +2262,20 @@ void CreateSyncObjects() { fenceInfo.pNext = nullptr; fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; - pkvk_present.semaphores_image_available = pk_new_arr<VkSemaphore>(swapchainLength, MemBkt_Vulkan); + pkvk_present.semaphores_present_complete = pk_new_arr<VkSemaphore>(swapchainLength, MemBkt_Vulkan); pkvk_present.semaphores_render_finished = pk_new_arr<VkSemaphore>(swapchainLength, MemBkt_Vulkan); pkvk_present.fences_in_flight = pk_new_arr<VkFence>(swapchainLength, MemBkt_Vulkan); for (long i = 0; i < swapchainLength; ++i) { - auto result1 = vkCreateSemaphore(vkDevice, &semaphoreInfo, vkAllocator, &pkvk_present.semaphores_image_available[i]); + auto result1 = vkCreateSemaphore(vkDevice, &semaphoreInfo, vkAllocator, &pkvk_present.semaphores_present_complete[i]); auto result2 = vkCreateSemaphore(vkDevice, &semaphoreInfo, vkAllocator, &pkvk_present.semaphores_render_finished[i]); auto result3 = vkCreateFence(vkDevice, &fenceInfo, vkAllocator, &pkvk_present.fences_in_flight[i]); auto result = result1 == result2 && result2 == result3 && result3 == VK_SUCCESS; if (!result) { throw "failed to create sync objects"; } + fprintf(stdout, "[window.cpp] image available semaphore %li: %p\n", i, (void*)pkvk_present.semaphores_present_complete[i]); + fprintf(stdout, "[window.cpp] render finished semaphore %li: %p\n", i, (void*)pkvk_present.semaphores_render_finished[i]); + fprintf(stdout, "[window.cpp] in_flight fence %li: %p\n", i, (void*)pkvk_present.fences_in_flight[i]); } } @@ -3956,9 +3964,9 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) { void DestroySyncObjects() { for (long i = 0; i < prevSwapchainLength; ++i) { - if (pkvk_present.semaphores_image_available[i] != VK_NULL_HANDLE) { - vkDestroySemaphore(vkDevice, pkvk_present.semaphores_image_available[i], vkAllocator); - pkvk_present.semaphores_image_available[i] = VK_NULL_HANDLE; + if (pkvk_present.semaphores_present_complete[i] != VK_NULL_HANDLE) { + vkDestroySemaphore(vkDevice, pkvk_present.semaphores_present_complete[i], vkAllocator); + pkvk_present.semaphores_present_complete[i] = VK_NULL_HANDLE; } if (pkvk_present.semaphores_render_finished[i] != VK_NULL_HANDLE) { vkDestroySemaphore(vkDevice, pkvk_present.semaphores_render_finished[i], vkAllocator); @@ -3970,8 +3978,8 @@ void DestroySyncObjects() { } } - pk_delete_arr<VkSemaphore>(pkvk_present.semaphores_image_available, prevSwapchainLength, MemBkt_Vulkan); - pkvk_present.semaphores_image_available = CAFE_BABE(VkSemaphore); + pk_delete_arr<VkSemaphore>(pkvk_present.semaphores_present_complete, prevSwapchainLength, MemBkt_Vulkan); + pkvk_present.semaphores_present_complete = CAFE_BABE(VkSemaphore); pk_delete_arr<VkSemaphore>(pkvk_present.semaphores_render_finished, prevSwapchainLength, MemBkt_Vulkan); pkvk_present.semaphores_render_finished = CAFE_BABE(VkSemaphore); @@ -4137,7 +4145,7 @@ void RecreateSwapchain() { Extent.height = height; ActiveCamera->stale = ActiveCamera->stale | PKE_CAMERA_STALE_PERSPECTIVE; DetermineMonitor(); - vkDeviceWaitIdle(vkDevice); + vkWaitForFences(vkDevice, swapchainLength, pkvk_present.fences_in_flight, VK_TRUE, UINT64_MAX); // reminder: prevSwapchainLength set in CreateSwapchain() DestroySwapchain(); CreateSwapchain(); @@ -4392,10 +4400,10 @@ void window_tick_late(double delta) { } void Render() { - vkWaitForFences(vkDevice, 1, &pkvk_present.fences_in_flight[CURRENT_FRAME], VK_TRUE, UINT64_MAX); + vkWaitForFences(vkDevice, 1, &pkvk_present.fences_in_flight[pkvk_present.frame_index], VK_TRUE, UINT64_MAX); uint32_t imageIndex; - auto result = vkAcquireNextImageKHR(vkDevice, vkSwapchainKHR, UINT64_MAX, pkvk_present.semaphores_image_available[CURRENT_FRAME], VK_NULL_HANDLE, &imageIndex); + auto result = vkAcquireNextImageKHR(vkDevice, vkSwapchainKHR, UINT64_MAX, pkvk_present.semaphores_present_complete[pkvk_present.semaphore_index], VK_NULL_HANDLE, &imageIndex); if (result == VK_ERROR_OUT_OF_DATE_KHR) { RecreateSwapchain(); @@ -4413,12 +4421,12 @@ void Render() { vkUnmapMemory(vkDevice, uniformBufferMemory); } - vkResetFences(vkDevice, 1, &pkvk_present.fences_in_flight[CURRENT_FRAME]); + vkResetFences(vkDevice, 1, &pkvk_present.fences_in_flight[pkvk_present.frame_index]); - RecordCommandBuffer(pkvk_present.command_buffers[CURRENT_FRAME], imageIndex); + RecordCommandBuffer(pkvk_present.command_buffers[pkvk_present.frame_index], imageIndex); - VkSemaphore waitSemaphores[] = {pkvk_present.semaphores_image_available[CURRENT_FRAME]}; - VkSemaphore signalSemaphores[] = {pkvk_present.semaphores_render_finished[CURRENT_FRAME]}; + VkSemaphore waitSemaphores[] = {pkvk_present.semaphores_present_complete[pkvk_present.semaphore_index]}; + VkSemaphore signalSemaphores[] = {pkvk_present.semaphores_render_finished[imageIndex]}; VkPipelineStageFlags waitStages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; VkSubmitInfo submitInfo; @@ -4428,11 +4436,11 @@ void Render() { submitInfo.pWaitSemaphores = waitSemaphores; submitInfo.pWaitDstStageMask = waitStages; submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &pkvk_present.command_buffers[CURRENT_FRAME]; + submitInfo.pCommandBuffers = &pkvk_present.command_buffers[pkvk_present.frame_index]; submitInfo.signalSemaphoreCount = 1; submitInfo.pSignalSemaphores = signalSemaphores; - result = vkQueueSubmit(pkvk_shared.queue.graphics, 1, &submitInfo, pkvk_present.fences_in_flight[CURRENT_FRAME]); + result = vkQueueSubmit(pkvk_shared.queue.graphics, 1, &submitInfo, pkvk_present.fences_in_flight[pkvk_present.frame_index]); if (result != VK_SUCCESS) { throw "failed to submit queue"; } @@ -4456,6 +4464,7 @@ void Render() { throw "failed to present swapchain image"; } - CURRENT_FRAME = (CURRENT_FRAME + 1) % swapchainLength; + pkvk_present.frame_index = (pkvk_present.frame_index + 1) % swapchainLength; + pkvk_present.semaphore_index = (pkvk_present.semaphore_index + 1) % swapchainLength; } |
