summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-09-17 15:21:26 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-09-17 15:21:26 -0400
commitc3b54d24cdf054e4f8733f3cb1669a83398626f7 (patch)
treea877470ab67e4027d9ac68a9acc421eea8ccd3a4
parent2efdf2c04503e93722a9eb6536becd2b266ff029 (diff)
pke: Vulkan logging + signal correct semaphore.
-rw-r--r--src/window.cpp49
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;
}