fix validation warnings relating to swapchain

for more information: https://docs.vulkan.org/guide/latest/swapchain_semaphore_reuse.html
This commit is contained in:
niki
2026-03-23 22:38:14 +01:00
parent 7d41f3ad30
commit 1a1265d646
2 changed files with 13 additions and 14 deletions
+13 -13
View File
@@ -431,13 +431,6 @@ void Graphics::submitGpuCommands(SubmitMode submitMode, void *screenshotCallback
endRecordingGraphicsCommands(); endRecordingGraphicsCommands();
if (!imagesInFlight.empty())
{
if (imagesInFlight[imageIndex] != VK_NULL_HANDLE)
vkWaitForFences(device, 1, &imagesInFlight.at(imageIndex), VK_TRUE, UINT64_MAX);
imagesInFlight[imageIndex] = inFlightFences[currentFrame];
}
std::array<VkCommandBuffer, 1> submitCommandbuffers = { commandBuffers.at(currentFrame) }; std::array<VkCommandBuffer, 1> submitCommandbuffers = { commandBuffers.at(currentFrame) };
VkSubmitInfo submitInfo{}; VkSubmitInfo submitInfo{};
@@ -457,7 +450,7 @@ void Graphics::submitGpuCommands(SubmitMode submitMode, void *screenshotCallback
submitInfo.commandBufferCount = static_cast<uint32_t>(submitCommandbuffers.size()); submitInfo.commandBufferCount = static_cast<uint32_t>(submitCommandbuffers.size());
submitInfo.pCommandBuffers = submitCommandbuffers.data(); submitInfo.pCommandBuffers = submitCommandbuffers.data();
VkSemaphore signalSemaphores[] = { renderFinishedSemaphores.at(currentFrame) }; VkSemaphore signalSemaphores[] = { renderFinishedSemaphores.at(imageIndex) };
VkFence fence = VK_NULL_HANDLE; VkFence fence = VK_NULL_HANDLE;
@@ -469,7 +462,6 @@ void Graphics::submitGpuCommands(SubmitMode submitMode, void *screenshotCallback
submitInfo.pSignalSemaphores = signalSemaphores; submitInfo.pSignalSemaphores = signalSemaphores;
} }
vkResetFences(device, 1, &inFlightFences[currentFrame]);
fence = inFlightFences[currentFrame]; fence = inFlightFences[currentFrame];
} }
@@ -572,7 +564,7 @@ void Graphics::present(void *screenshotCallbackdata)
VkPresentInfoKHR presentInfo{}; VkPresentInfoKHR presentInfo{};
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
presentInfo.waitSemaphoreCount = 1; presentInfo.waitSemaphoreCount = 1;
presentInfo.pWaitSemaphores = &renderFinishedSemaphores.at(currentFrame); presentInfo.pWaitSemaphores = &renderFinishedSemaphores.at(imageIndex);
presentInfo.swapchainCount = 1; presentInfo.swapchainCount = 1;
presentInfo.pSwapchains = &swapChain; presentInfo.pSwapchains = &swapChain;
presentInfo.pImageIndices = &imageIndex; presentInfo.pImageIndices = &imageIndex;
@@ -1383,6 +1375,8 @@ void Graphics::beginSwapChainFrame()
{ {
imageRequested = false; imageRequested = false;
} }
vkResetFences(device, 1, &inFlightFences.at(currentFrame));
startRecordingGraphicsCommands(); startRecordingGraphicsCommands();
@@ -3374,9 +3368,7 @@ void Graphics::createCommandBuffers()
void Graphics::createSyncObjects() void Graphics::createSyncObjects()
{ {
imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT); imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT); inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
imagesInFlight.resize(swapChainImages.size(), VK_NULL_HANDLE);
VkSemaphoreCreateInfo semaphoreInfo{}; VkSemaphoreCreateInfo semaphoreInfo{};
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -3386,10 +3378,18 @@ void Graphics::createSyncObjects()
fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
{
if (vkCreateSemaphore(device, &semaphoreInfo, nullptr, &imageAvailableSemaphores.at(i)) != VK_SUCCESS || if (vkCreateSemaphore(device, &semaphoreInfo, nullptr, &imageAvailableSemaphores.at(i)) != VK_SUCCESS ||
vkCreateSemaphore(device, &semaphoreInfo, nullptr, &renderFinishedSemaphores.at(i)) != VK_SUCCESS ||
vkCreateFence(device, &fenceInfo, nullptr, &inFlightFences.at(i)) != VK_SUCCESS) vkCreateFence(device, &fenceInfo, nullptr, &inFlightFences.at(i)) != VK_SUCCESS)
throw love::Exception("Failed to create Vulkan synchronization objects for a frame!"); throw love::Exception("Failed to create Vulkan synchronization objects for a frame!");
}
renderFinishedSemaphores.resize(swapChainImages.size());
for (size_t i = 0; i < swapChainImages.size(); i++)
{
if (vkCreateSemaphore(device, &semaphoreInfo, nullptr, &renderFinishedSemaphores.at(i)) != VK_SUCCESS)
throw love::Exception("Failed to create image available semaphore");
}
} }
void Graphics::cleanup() void Graphics::cleanup()
-1
View File
@@ -398,7 +398,6 @@ private:
std::vector<VkSemaphore> imageAvailableSemaphores; std::vector<VkSemaphore> imageAvailableSemaphores;
std::vector<VkSemaphore> renderFinishedSemaphores; std::vector<VkSemaphore> renderFinishedSemaphores;
std::vector<VkFence> inFlightFences; std::vector<VkFence> inFlightFences;
std::vector<VkFence> imagesInFlight;
int vsync = 1; int vsync = 1;
VkDeviceSize minUniformBufferOffsetAlignment = 0; VkDeviceSize minUniformBufferOffsetAlignment = 0;
bool imageRequested = false; bool imageRequested = false;