fence autorelease during command buffer clean
parent
4b50e9cec7
commit
7f11d20941
|
@ -9934,6 +9934,77 @@ static void VULKAN_SetSwapchainPresentMode(
|
||||||
|
|
||||||
/* Submission structure */
|
/* Submission structure */
|
||||||
|
|
||||||
|
static VkFence VULKAN_INTERNAL_AcquireFenceFromPool(
|
||||||
|
VulkanRenderer *renderer
|
||||||
|
) {
|
||||||
|
VkFenceCreateInfo fenceCreateInfo;
|
||||||
|
VkFence fence;
|
||||||
|
VkResult vulkanResult;
|
||||||
|
|
||||||
|
if (renderer->fencePool.availableFenceCount == 0)
|
||||||
|
{
|
||||||
|
/* Create fence */
|
||||||
|
fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
||||||
|
fenceCreateInfo.pNext = NULL;
|
||||||
|
fenceCreateInfo.flags = 0;
|
||||||
|
|
||||||
|
vulkanResult = renderer->vkCreateFence(
|
||||||
|
renderer->logicalDevice,
|
||||||
|
&fenceCreateInfo,
|
||||||
|
NULL,
|
||||||
|
&fence
|
||||||
|
);
|
||||||
|
|
||||||
|
if (vulkanResult != VK_SUCCESS)
|
||||||
|
{
|
||||||
|
LogVulkanResultAsError("vkCreateFence", vulkanResult);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fence;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_LockMutex(renderer->fencePool.lock);
|
||||||
|
|
||||||
|
fence = renderer->fencePool.availableFences[renderer->fencePool.availableFenceCount - 1];
|
||||||
|
renderer->fencePool.availableFenceCount -= 1;
|
||||||
|
|
||||||
|
vulkanResult = renderer->vkResetFences(
|
||||||
|
renderer->logicalDevice,
|
||||||
|
1,
|
||||||
|
&fence
|
||||||
|
);
|
||||||
|
|
||||||
|
if (vulkanResult != VK_SUCCESS)
|
||||||
|
{
|
||||||
|
LogVulkanResultAsError("vkResetFences", vulkanResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->fencePool.lock);
|
||||||
|
|
||||||
|
return fence;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void VULKAN_INTERNAL_ReturnFenceToPool(
|
||||||
|
VulkanRenderer *renderer,
|
||||||
|
VkFence fence
|
||||||
|
) {
|
||||||
|
SDL_LockMutex(renderer->fencePool.lock);
|
||||||
|
|
||||||
|
EXPAND_ARRAY_IF_NEEDED(
|
||||||
|
renderer->fencePool.availableFences,
|
||||||
|
VkFence,
|
||||||
|
renderer->fencePool.availableFenceCount + 1,
|
||||||
|
renderer->fencePool.availableFenceCapacity,
|
||||||
|
renderer->fencePool.availableFenceCapacity * 2
|
||||||
|
);
|
||||||
|
|
||||||
|
renderer->fencePool.availableFences[renderer->fencePool.availableFenceCount] = fence;
|
||||||
|
renderer->fencePool.availableFenceCount += 1;
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->fencePool.lock);
|
||||||
|
}
|
||||||
|
|
||||||
static void VULKAN_INTERNAL_PerformPendingDestroys(
|
static void VULKAN_INTERNAL_PerformPendingDestroys(
|
||||||
VulkanRenderer *renderer
|
VulkanRenderer *renderer
|
||||||
) {
|
) {
|
||||||
|
@ -10049,6 +10120,16 @@ static void VULKAN_INTERNAL_CleanCommandBuffer(
|
||||||
VulkanUniformBuffer *uniformBuffer;
|
VulkanUniformBuffer *uniformBuffer;
|
||||||
DescriptorSetData *descriptorSetData;
|
DescriptorSetData *descriptorSetData;
|
||||||
|
|
||||||
|
if (commandBuffer->autoReleaseFence)
|
||||||
|
{
|
||||||
|
VULKAN_INTERNAL_ReturnFenceToPool(
|
||||||
|
renderer,
|
||||||
|
commandBuffer->inFlightFence
|
||||||
|
);
|
||||||
|
|
||||||
|
commandBuffer->inFlightFence = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Bound uniform buffers are now available */
|
/* Bound uniform buffers are now available */
|
||||||
|
|
||||||
for (i = 0; i < commandBuffer->boundUniformBufferCount; i += 1)
|
for (i = 0; i < commandBuffer->boundUniformBufferCount; i += 1)
|
||||||
|
@ -10204,27 +10285,15 @@ static void VULKAN_Wait(
|
||||||
VkResult result;
|
VkResult result;
|
||||||
int32_t i;
|
int32_t i;
|
||||||
|
|
||||||
SDL_LockMutex(renderer->submitLock);
|
result = renderer->vkDeviceWaitIdle(renderer->logicalDevice);
|
||||||
|
|
||||||
for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
commandBuffer = renderer->submittedCommandBuffers[i];
|
LogVulkanResultAsError("vkDeviceWaitIdle", result);
|
||||||
|
return;
|
||||||
result = renderer->vkWaitForFences(
|
|
||||||
renderer->logicalDevice,
|
|
||||||
1,
|
|
||||||
&commandBuffer->inFlightFence,
|
|
||||||
VK_TRUE,
|
|
||||||
UINT64_MAX
|
|
||||||
);
|
|
||||||
|
|
||||||
if (result != VK_SUCCESS)
|
|
||||||
{
|
|
||||||
LogVulkanResultAsError("vkWaitForFences", result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: consider if it's not a good idea to do cleanup here */
|
SDL_LockMutex(renderer->submitLock);
|
||||||
|
|
||||||
for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1)
|
for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1)
|
||||||
{
|
{
|
||||||
|
@ -10237,69 +10306,6 @@ static void VULKAN_Wait(
|
||||||
SDL_UnlockMutex(renderer->submitLock);
|
SDL_UnlockMutex(renderer->submitLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VkFence VULKAN_INTERNAL_AcquireFenceFromPool(
|
|
||||||
VulkanRenderer *renderer
|
|
||||||
) {
|
|
||||||
VkFenceCreateInfo fenceCreateInfo;
|
|
||||||
VkFence fence;
|
|
||||||
VkResult vulkanResult;
|
|
||||||
|
|
||||||
if (renderer->fencePool.availableFenceCount == 0)
|
|
||||||
{
|
|
||||||
/* Create fence */
|
|
||||||
fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
|
||||||
fenceCreateInfo.pNext = NULL;
|
|
||||||
fenceCreateInfo.flags = 0;
|
|
||||||
|
|
||||||
vulkanResult = renderer->vkCreateFence(
|
|
||||||
renderer->logicalDevice,
|
|
||||||
&fenceCreateInfo,
|
|
||||||
NULL,
|
|
||||||
&fence
|
|
||||||
);
|
|
||||||
|
|
||||||
if (vulkanResult != VK_SUCCESS)
|
|
||||||
{
|
|
||||||
LogVulkanResultAsError("vkCreateFence", vulkanResult);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return fence;
|
|
||||||
}
|
|
||||||
|
|
||||||
fence = renderer->fencePool.availableFences[renderer->fencePool.availableFenceCount - 1];
|
|
||||||
renderer->fencePool.availableFenceCount -= 1;
|
|
||||||
|
|
||||||
vulkanResult = renderer->vkResetFences(
|
|
||||||
renderer->logicalDevice,
|
|
||||||
1,
|
|
||||||
&fence
|
|
||||||
);
|
|
||||||
|
|
||||||
if (vulkanResult != VK_SUCCESS)
|
|
||||||
{
|
|
||||||
LogVulkanResultAsError("vkResetFences", vulkanResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
return fence;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void VULKAN_INTERNAL_ReturnFenceToPool(
|
|
||||||
VulkanRenderer *renderer,
|
|
||||||
VkFence fence
|
|
||||||
) {
|
|
||||||
EXPAND_ARRAY_IF_NEEDED(
|
|
||||||
renderer->fencePool.availableFences,
|
|
||||||
VkFence,
|
|
||||||
renderer->fencePool.availableFenceCount + 1,
|
|
||||||
renderer->fencePool.availableFenceCapacity,
|
|
||||||
renderer->fencePool.availableFenceCapacity * 2
|
|
||||||
);
|
|
||||||
|
|
||||||
renderer->fencePool.availableFences[renderer->fencePool.availableFenceCount] = fence;
|
|
||||||
renderer->fencePool.availableFenceCount += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Refresh_Fence* VULKAN_SubmitAndAcquireFence(
|
static Refresh_Fence* VULKAN_SubmitAndAcquireFence(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_CommandBuffer *commandBuffer
|
Refresh_CommandBuffer *commandBuffer
|
||||||
|
@ -10442,16 +10448,6 @@ static void VULKAN_Submit(
|
||||||
|
|
||||||
if (vulkanResult == VK_SUCCESS)
|
if (vulkanResult == VK_SUCCESS)
|
||||||
{
|
{
|
||||||
if (renderer->submittedCommandBuffers[i]->autoReleaseFence)
|
|
||||||
{
|
|
||||||
VULKAN_INTERNAL_ReturnFenceToPool(
|
|
||||||
renderer,
|
|
||||||
renderer->submittedCommandBuffers[i]->inFlightFence
|
|
||||||
);
|
|
||||||
|
|
||||||
renderer->submittedCommandBuffers[i]->inFlightFence = VK_NULL_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_CleanCommandBuffer(
|
VULKAN_INTERNAL_CleanCommandBuffer(
|
||||||
renderer,
|
renderer,
|
||||||
renderer->submittedCommandBuffers[i]
|
renderer->submittedCommandBuffers[i]
|
||||||
|
|
Loading…
Reference in New Issue