mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-09-06 03:18:13 +00:00
Vulkan Renderer - fix validation error with VkSemaphore reused before signaling. Have one semaphore per-submit rather than using the same one.
This commit is contained in:

committed by
Sam Lantinga

parent
1e8b006d43
commit
812e04fb11
@@ -341,8 +341,8 @@ typedef struct
|
|||||||
VkImage *swapchainImages;
|
VkImage *swapchainImages;
|
||||||
VkImageView *swapchainImageViews;
|
VkImageView *swapchainImageViews;
|
||||||
VkImageLayout *swapchainImageLayouts;
|
VkImageLayout *swapchainImageLayouts;
|
||||||
VkSemaphore imageAvailableSemaphore;
|
VkSemaphore *imageAvailableSemaphores;
|
||||||
VkSemaphore renderingFinishedSemaphore;
|
VkSemaphore *renderingFinishedSemaphores;
|
||||||
uint32_t currentSwapchainImageIndex;
|
uint32_t currentSwapchainImageIndex;
|
||||||
|
|
||||||
/* Cached renderer properties */
|
/* Cached renderer properties */
|
||||||
@@ -515,13 +515,23 @@ static void VULKAN_DestroyAll(SDL_Renderer *renderer)
|
|||||||
rendererData->renderPasses[i] = VK_NULL_HANDLE;
|
rendererData->renderPasses[i] = VK_NULL_HANDLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (rendererData->imageAvailableSemaphore != VK_NULL_HANDLE) {
|
if (rendererData->imageAvailableSemaphores) {
|
||||||
vkDestroySemaphore(rendererData->device, rendererData->imageAvailableSemaphore, NULL);
|
for (uint32_t i = 0; i < rendererData->swapchainImageCount; ++i) {
|
||||||
rendererData->imageAvailableSemaphore = VK_NULL_HANDLE;
|
if (rendererData->imageAvailableSemaphores[i] != VK_NULL_HANDLE) {
|
||||||
|
vkDestroySemaphore(rendererData->device, rendererData->imageAvailableSemaphores[i], NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SDL_free(rendererData->imageAvailableSemaphores);
|
||||||
|
rendererData->imageAvailableSemaphores = NULL;
|
||||||
}
|
}
|
||||||
if (rendererData->renderingFinishedSemaphore != VK_NULL_HANDLE) {
|
if (rendererData->renderingFinishedSemaphores) {
|
||||||
vkDestroySemaphore(rendererData->device, rendererData->renderingFinishedSemaphore, NULL);
|
for (uint32_t i = 0; i < rendererData->swapchainImageCount; ++i) {
|
||||||
rendererData->renderingFinishedSemaphore = VK_NULL_HANDLE;
|
if (rendererData->renderingFinishedSemaphores[i] != VK_NULL_HANDLE) {
|
||||||
|
vkDestroySemaphore(rendererData->device, rendererData->renderingFinishedSemaphores[i], NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SDL_free(rendererData->renderingFinishedSemaphores);
|
||||||
|
rendererData->renderingFinishedSemaphores = NULL;
|
||||||
}
|
}
|
||||||
if (rendererData->commandPool) {
|
if (rendererData->commandPool) {
|
||||||
if (rendererData->commandBuffers) {
|
if (rendererData->commandBuffers) {
|
||||||
@@ -832,7 +842,7 @@ static VkResult VULKAN_AcquireNextSwapchainImage(SDL_Renderer *renderer)
|
|||||||
VkResult result;
|
VkResult result;
|
||||||
|
|
||||||
result = vkAcquireNextImageKHR(rendererData->device, rendererData->swapchain, UINT64_MAX,
|
result = vkAcquireNextImageKHR(rendererData->device, rendererData->swapchain, UINT64_MAX,
|
||||||
rendererData->imageAvailableSemaphore, VK_NULL_HANDLE, &rendererData->currentSwapchainImageIndex);
|
rendererData->imageAvailableSemaphores[rendererData->currentCommandBufferIndex], VK_NULL_HANDLE, &rendererData->currentSwapchainImageIndex);
|
||||||
if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_ERROR_SURFACE_LOST_KHR) {
|
if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_ERROR_SURFACE_LOST_KHR) {
|
||||||
result = VULKAN_CreateWindowSizeDependentResources(renderer);
|
result = VULKAN_CreateWindowSizeDependentResources(renderer);
|
||||||
return result;
|
return result;
|
||||||
@@ -2257,21 +2267,35 @@ static VkResult VULKAN_CreateSwapChain(SDL_Renderer *renderer, int w, int h)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Create semaphores */
|
/* Create semaphores */
|
||||||
if (rendererData->imageAvailableSemaphore != VK_NULL_HANDLE) {
|
if (rendererData->imageAvailableSemaphores) {
|
||||||
vkDestroySemaphore(rendererData->device, rendererData->imageAvailableSemaphore, NULL);
|
for (uint32_t i = 0; i < rendererData->swapchainImageCount; ++i) {
|
||||||
|
if (rendererData->imageAvailableSemaphores[i] != VK_NULL_HANDLE) {
|
||||||
|
vkDestroySemaphore(rendererData->device, rendererData->imageAvailableSemaphores[i], NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SDL_free(rendererData->imageAvailableSemaphores);
|
||||||
}
|
}
|
||||||
rendererData->imageAvailableSemaphore = VULKAN_CreateSemaphore(rendererData);
|
if (rendererData->renderingFinishedSemaphores) {
|
||||||
if (rendererData->imageAvailableSemaphore == VK_NULL_HANDLE) {
|
for (uint32_t i = 0; i < rendererData->swapchainImageCount; ++i) {
|
||||||
VULKAN_DestroyAll(renderer);
|
if (rendererData->renderingFinishedSemaphores[i] != VK_NULL_HANDLE) {
|
||||||
return VK_ERROR_UNKNOWN;
|
vkDestroySemaphore(rendererData->device, rendererData->renderingFinishedSemaphores[i], NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SDL_free(rendererData->renderingFinishedSemaphores);
|
||||||
}
|
}
|
||||||
if (rendererData->renderingFinishedSemaphore != VK_NULL_HANDLE) {
|
rendererData->imageAvailableSemaphores = SDL_calloc(sizeof(VkSemaphore), rendererData->swapchainImageCount);
|
||||||
vkDestroySemaphore(rendererData->device, rendererData->renderingFinishedSemaphore, NULL);
|
rendererData->renderingFinishedSemaphores = SDL_calloc(sizeof(VkSemaphore), rendererData->swapchainImageCount);
|
||||||
}
|
for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
|
||||||
rendererData->renderingFinishedSemaphore = VULKAN_CreateSemaphore(rendererData);
|
rendererData->imageAvailableSemaphores[i] = VULKAN_CreateSemaphore(rendererData);
|
||||||
if (rendererData->renderingFinishedSemaphore == VK_NULL_HANDLE) {
|
if (rendererData->imageAvailableSemaphores[i] == VK_NULL_HANDLE) {
|
||||||
VULKAN_DestroyAll(renderer);
|
VULKAN_DestroyAll(renderer);
|
||||||
return VK_ERROR_UNKNOWN;
|
return VK_ERROR_UNKNOWN;
|
||||||
|
}
|
||||||
|
rendererData->renderingFinishedSemaphores[i] = VULKAN_CreateSemaphore(rendererData);
|
||||||
|
if (rendererData->renderingFinishedSemaphores[i] == VK_NULL_HANDLE) {
|
||||||
|
VULKAN_DestroyAll(renderer);
|
||||||
|
return VK_ERROR_UNKNOWN;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Upload buffers */
|
/* Upload buffers */
|
||||||
@@ -3835,12 +3859,12 @@ static int VULKAN_RenderPresent(SDL_Renderer *renderer)
|
|||||||
VkSubmitInfo submitInfo = { 0 };
|
VkSubmitInfo submitInfo = { 0 };
|
||||||
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
||||||
submitInfo.waitSemaphoreCount = 1;
|
submitInfo.waitSemaphoreCount = 1;
|
||||||
submitInfo.pWaitSemaphores = &rendererData->imageAvailableSemaphore;
|
submitInfo.pWaitSemaphores = &rendererData->imageAvailableSemaphores[rendererData->currentCommandBufferIndex];
|
||||||
submitInfo.pWaitDstStageMask = &waitDestStageMask;
|
submitInfo.pWaitDstStageMask = &waitDestStageMask;
|
||||||
submitInfo.commandBufferCount = 1;
|
submitInfo.commandBufferCount = 1;
|
||||||
submitInfo.pCommandBuffers = &rendererData->currentCommandBuffer;
|
submitInfo.pCommandBuffers = &rendererData->currentCommandBuffer;
|
||||||
submitInfo.signalSemaphoreCount = 1;
|
submitInfo.signalSemaphoreCount = 1;
|
||||||
submitInfo.pSignalSemaphores = &rendererData->renderingFinishedSemaphore;
|
submitInfo.pSignalSemaphores = &rendererData->renderingFinishedSemaphores[rendererData->currentCommandBufferIndex];
|
||||||
result = vkQueueSubmit(rendererData->graphicsQueue, 1, &submitInfo, rendererData->fences[rendererData->currentCommandBufferIndex]);
|
result = vkQueueSubmit(rendererData->graphicsQueue, 1, &submitInfo, rendererData->fences[rendererData->currentCommandBufferIndex]);
|
||||||
if (result != VK_SUCCESS) {
|
if (result != VK_SUCCESS) {
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "vkQueueSubmit(): %s\n", SDL_Vulkan_GetResultString(result));
|
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "vkQueueSubmit(): %s\n", SDL_Vulkan_GetResultString(result));
|
||||||
@@ -3851,7 +3875,7 @@ static int VULKAN_RenderPresent(SDL_Renderer *renderer)
|
|||||||
VkPresentInfoKHR presentInfo = { 0 };
|
VkPresentInfoKHR presentInfo = { 0 };
|
||||||
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
||||||
presentInfo.waitSemaphoreCount = 1;
|
presentInfo.waitSemaphoreCount = 1;
|
||||||
presentInfo.pWaitSemaphores = &rendererData->renderingFinishedSemaphore;
|
presentInfo.pWaitSemaphores = &rendererData->renderingFinishedSemaphores[rendererData->currentCommandBufferIndex];
|
||||||
presentInfo.swapchainCount = 1;
|
presentInfo.swapchainCount = 1;
|
||||||
presentInfo.pSwapchains = &rendererData->swapchain;
|
presentInfo.pSwapchains = &rendererData->swapchain;
|
||||||
presentInfo.pImageIndices = &rendererData->currentSwapchainImageIndex;
|
presentInfo.pImageIndices = &rendererData->currentSwapchainImageIndex;
|
||||||
|
Reference in New Issue
Block a user