compute pipeline cleanup

submit_rewrite
cosmonaut 2020-12-30 23:02:12 -08:00 committed by thatcosmonaut
parent da52bd68f0
commit 14c75e058d
1 changed files with 242 additions and 20 deletions

View File

@ -1304,6 +1304,14 @@ typedef struct VulkanRenderer
uint32_t submittedGraphicsPipelinesToDestroyCount; uint32_t submittedGraphicsPipelinesToDestroyCount;
uint32_t submittedGraphicsPipelinesToDestroyCapacity; uint32_t submittedGraphicsPipelinesToDestroyCapacity;
VulkanComputePipeline **computePipelinesToDestroy;
uint32_t computePipelinesToDestroyCount;
uint32_t computePipelinesToDestroyCapacity;
VulkanComputePipeline **submittedComputePipelinesToDestroy;
uint32_t submittedComputePipelinesToDestroyCount;
uint32_t submittedComputePipelinesToDestroyCapacity;
VkShaderModule *shaderModulesToDestroy; VkShaderModule *shaderModulesToDestroy;
uint32_t shaderModulesToDestroyCount; uint32_t shaderModulesToDestroyCount;
uint32_t shaderModulesToDestroyCapacity; uint32_t shaderModulesToDestroyCapacity;
@ -2229,6 +2237,26 @@ static void VULKAN_INTERNAL_DestroyGraphicsPipeline(
SDL_free(graphicsPipeline); SDL_free(graphicsPipeline);
} }
static void VULKAN_INTERNAL_DestroyComputePipeline(
VulkanRenderer *renderer,
VulkanComputePipeline *computePipeline
) {
renderer->vkFreeDescriptorSets(
renderer->logicalDevice,
renderer->defaultDescriptorPool,
1,
&computePipeline->computeUBODescriptorSet
);
renderer->vkDestroyPipeline(
renderer->logicalDevice,
computePipeline->pipeline,
NULL
);
SDL_free(computePipeline);
}
static void VULKAN_INTERNAL_DestroyShaderModule( static void VULKAN_INTERNAL_DestroyShaderModule(
VulkanRenderer *renderer, VulkanRenderer *renderer,
VkShaderModule shaderModule VkShaderModule shaderModule
@ -2310,9 +2338,41 @@ static void VULKAN_INTERNAL_DestroyTextureStagingBuffer(
); );
} }
static void VULKAN_INTERNAL_DestroyBufferDescriptorSetCache(
VulkanRenderer *renderer,
BufferDescriptorSetCache *cache
) {
uint32_t i;
if (cache == NULL)
{
return;
}
for (i = 0; i < cache->bufferDescriptorPoolCount; i += 1)
{
renderer->vkDestroyDescriptorPool(
renderer->logicalDevice,
cache->bufferDescriptorPools[i],
NULL
);
}
SDL_free(cache->bufferDescriptorPools);
SDL_free(cache->inactiveDescriptorSets);
SDL_free(cache->elements);
for (i = 0; i < NUM_DESCRIPTOR_SET_HASH_BUCKETS; i += 1)
{
SDL_free(cache->buckets[i].elements);
}
SDL_free(cache);
}
static void VULKAN_INTERNAL_DestroyImageDescriptorSetCache( static void VULKAN_INTERNAL_DestroyImageDescriptorSetCache(
VulkanRenderer* renderer, VulkanRenderer *renderer,
ImageDescriptorSetCache* cache ImageDescriptorSetCache *cache
) { ) {
uint32_t i; uint32_t i;
@ -2395,6 +2455,15 @@ static void VULKAN_INTERNAL_PostWorkCleanup(VulkanRenderer* renderer)
} }
renderer->submittedGraphicsPipelinesToDestroyCount = 0; renderer->submittedGraphicsPipelinesToDestroyCount = 0;
for (i = 0; i < renderer->submittedComputePipelinesToDestroyCount; i += 1)
{
VULKAN_INTERNAL_DestroyComputePipeline(
renderer,
renderer->submittedComputePipelinesToDestroy[i]
);
}
renderer->submittedComputePipelinesToDestroyCount = 0;
for (i = 0; i < renderer->submittedShaderModulesToDestroyCount; i += 1) for (i = 0; i < renderer->submittedShaderModulesToDestroyCount; i += 1)
{ {
VULKAN_INTERNAL_DestroyShaderModule( VULKAN_INTERNAL_DestroyShaderModule(
@ -2473,6 +2542,14 @@ static void VULKAN_INTERNAL_PostWorkCleanup(VulkanRenderer* renderer)
renderer->graphicsPipelinesToDestroyCount renderer->graphicsPipelinesToDestroyCount
) )
EXPAND_ARRAY_IF_NEEDED(
renderer->submittedComputePipelinesToDestroy,
VulkanComputePipeline*,
renderer->computePipelinesToDestroyCount,
renderer->submittedComputePipelinesToDestroyCapacity,
renderer->computePipelinesToDestroyCount
)
EXPAND_ARRAY_IF_NEEDED( EXPAND_ARRAY_IF_NEEDED(
renderer->submittedShaderModulesToDestroy, renderer->submittedShaderModulesToDestroy,
VkShaderModule, VkShaderModule,
@ -2547,6 +2624,14 @@ static void VULKAN_INTERNAL_PostWorkCleanup(VulkanRenderer* renderer)
renderer->graphicsPipelinesToDestroyCount renderer->graphicsPipelinesToDestroyCount
) )
MOVE_ARRAY_CONTENTS_AND_RESET(
i,
renderer->submittedComputePipelinesToDestroy,
renderer->submittedComputePipelinesToDestroyCount,
renderer->computePipelinesToDestroy,
renderer->computePipelinesToDestroyCount
)
MOVE_ARRAY_CONTENTS_AND_RESET( MOVE_ARRAY_CONTENTS_AND_RESET(
i, i,
renderer->submittedShaderModulesToDestroy, renderer->submittedShaderModulesToDestroy,
@ -3266,6 +3351,8 @@ static void VULKAN_INTERNAL_EndCommandBuffer(
} }
renderer->currentComputePipeline = NULL; renderer->currentComputePipeline = NULL;
renderer->boundComputeBufferCount = 0;
renderer->currentCommandBuffer = NULL; renderer->currentCommandBuffer = NULL;
renderer->numActiveCommands = 0; renderer->numActiveCommands = 0;
} }
@ -3277,7 +3364,8 @@ static void VULKAN_DestroyDevice(
) { ) {
VulkanRenderer* renderer = (VulkanRenderer*) device->driverData; VulkanRenderer* renderer = (VulkanRenderer*) device->driverData;
VkResult waitResult; VkResult waitResult;
GraphicsPipelineLayoutHashArray pipelineLayoutHashArray; GraphicsPipelineLayoutHashArray graphicsPipelineLayoutHashArray;
ComputePipelineLayoutHashArray computePipelineLayoutHashArray;
VulkanMemorySubAllocator *allocator; VulkanMemorySubAllocator *allocator;
uint32_t i, j, k; uint32_t i, j, k;
@ -3329,29 +3417,54 @@ static void VULKAN_DestroyDevice(
for (i = 0; i < NUM_PIPELINE_LAYOUT_BUCKETS; i += 1) for (i = 0; i < NUM_PIPELINE_LAYOUT_BUCKETS; i += 1)
{ {
pipelineLayoutHashArray = renderer->graphicsPipelineLayoutHashTable.buckets[i]; graphicsPipelineLayoutHashArray = renderer->graphicsPipelineLayoutHashTable.buckets[i];
for (j = 0; j < pipelineLayoutHashArray.count; j += 1) for (j = 0; j < graphicsPipelineLayoutHashArray.count; j += 1)
{ {
VULKAN_INTERNAL_DestroyImageDescriptorSetCache( VULKAN_INTERNAL_DestroyImageDescriptorSetCache(
renderer, renderer,
pipelineLayoutHashArray.elements[j].value->vertexSamplerDescriptorSetCache graphicsPipelineLayoutHashArray.elements[j].value->vertexSamplerDescriptorSetCache
); );
VULKAN_INTERNAL_DestroyImageDescriptorSetCache( VULKAN_INTERNAL_DestroyImageDescriptorSetCache(
renderer, renderer,
pipelineLayoutHashArray.elements[j].value->fragmentSamplerDescriptorSetCache graphicsPipelineLayoutHashArray.elements[j].value->fragmentSamplerDescriptorSetCache
); );
renderer->vkDestroyPipelineLayout( renderer->vkDestroyPipelineLayout(
renderer->logicalDevice, renderer->logicalDevice,
pipelineLayoutHashArray.elements[j].value->pipelineLayout, graphicsPipelineLayoutHashArray.elements[j].value->pipelineLayout,
NULL NULL
); );
} }
if (pipelineLayoutHashArray.elements != NULL) if (graphicsPipelineLayoutHashArray.elements != NULL)
{ {
SDL_free(pipelineLayoutHashArray.elements); SDL_free(graphicsPipelineLayoutHashArray.elements);
}
computePipelineLayoutHashArray = renderer->computePipelineLayoutHashTable.buckets[i];
for (j = 0; j < computePipelineLayoutHashArray.count; j += 1)
{
VULKAN_INTERNAL_DestroyBufferDescriptorSetCache(
renderer,
computePipelineLayoutHashArray.elements[j].value->bufferDescriptorSetCache
);
VULKAN_INTERNAL_DestroyImageDescriptorSetCache(
renderer,
computePipelineLayoutHashArray.elements[j].value->imageDescriptorSetCache
);
renderer->vkDestroyPipelineLayout(
renderer->logicalDevice,
computePipelineLayoutHashArray.elements[j].value->pipelineLayout,
NULL
);
}
if (computePipelineLayoutHashArray.elements != NULL)
{
SDL_free(computePipelineLayoutHashArray.elements);
} }
} }
@ -7017,7 +7130,23 @@ static void VULKAN_AddDisposeComputePipeline(
REFRESH_Renderer *driverData, REFRESH_Renderer *driverData,
REFRESH_ComputePipeline *computePipeline REFRESH_ComputePipeline *computePipeline
) { ) {
SDL_assert(0 && "Function not implemented!"); VulkanRenderer *renderer = (VulkanRenderer*) driverData;
VulkanComputePipeline *vulkanComputePipeline = (VulkanComputePipeline*) computePipeline;
SDL_LockMutex(renderer->disposeLock);
EXPAND_ARRAY_IF_NEEDED(
renderer->computePipelinesToDestroy,
VulkanComputePipeline*,
renderer->computePipelinesToDestroyCount + 1,
renderer->computePipelinesToDestroyCapacity,
renderer->computePipelinesToDestroyCapacity * 2
)
renderer->computePipelinesToDestroy[renderer->computePipelinesToDestroyCount] = vulkanComputePipeline;
renderer->computePipelinesToDestroyCount += 1;
SDL_UnlockMutex(renderer->disposeLock);
} }
static void VULKAN_AddDisposeGraphicsPipeline( static void VULKAN_AddDisposeGraphicsPipeline(
@ -7532,7 +7661,64 @@ static void VULKAN_QueuePresent(
); );
} }
static void VULKAN_INTERNAL_DeactivateUnusedDescriptorSets( static void VULKAN_INTERNAL_DeactivateUnusedBufferDescriptorSets(
BufferDescriptorSetCache *bufferDescriptorSetCache
) {
int32_t i, j;
BufferDescriptorSetHashArray *arr;
for (i = bufferDescriptorSetCache->count - 1; i >= 0; i -= 1)
{
bufferDescriptorSetCache->elements[i].inactiveFrameCount += 1;
if (bufferDescriptorSetCache->elements[i].inactiveFrameCount + 1 > DESCRIPTOR_SET_DEACTIVATE_FRAMES)
{
arr = &bufferDescriptorSetCache->buckets[bufferDescriptorSetCache->elements[i].key % NUM_DESCRIPTOR_SET_HASH_BUCKETS];
/* remove index from bucket */
for (j = 0; j < arr->count; j += 1)
{
if (arr->elements[j] == i)
{
if (j < arr->count - 1)
{
arr->elements[j] = arr->elements[arr->count - 1];
}
arr->count -= 1;
break;
}
}
/* remove element from table and place in inactive sets */
bufferDescriptorSetCache->inactiveDescriptorSets[bufferDescriptorSetCache->inactiveDescriptorSetCount] = bufferDescriptorSetCache->elements[i].descriptorSet;
bufferDescriptorSetCache->inactiveDescriptorSetCount += 1;
/* move another descriptor set to fill the hole */
if (i < bufferDescriptorSetCache->count - 1)
{
bufferDescriptorSetCache->elements[i] = bufferDescriptorSetCache->elements[bufferDescriptorSetCache->count - 1];
/* update index in bucket */
arr = &bufferDescriptorSetCache->buckets[bufferDescriptorSetCache->elements[i].key % NUM_DESCRIPTOR_SET_HASH_BUCKETS];
for (j = 0; j < arr->count; j += 1)
{
if (arr->elements[j] == bufferDescriptorSetCache->count - 1)
{
arr->elements[j] = i;
break;
}
}
}
bufferDescriptorSetCache->count -= 1;
}
}
}
static void VULKAN_INTERNAL_DeactivateUnusedImageDescriptorSets(
ImageDescriptorSetCache *imageDescriptorSetCache ImageDescriptorSetCache *imageDescriptorSetCache
) { ) {
int32_t i, j; int32_t i, j;
@ -7592,25 +7778,45 @@ static void VULKAN_INTERNAL_DeactivateUnusedDescriptorSets(
static void VULKAN_INTERNAL_ResetDescriptorSetData(VulkanRenderer *renderer) static void VULKAN_INTERNAL_ResetDescriptorSetData(VulkanRenderer *renderer)
{ {
uint32_t i, j; uint32_t i, j;
VulkanGraphicsPipelineLayout *pipelineLayout; VulkanGraphicsPipelineLayout *graphicsPipelineLayout;
VulkanComputePipelineLayout *computePipelineLayout;
for (i = 0; i < NUM_PIPELINE_LAYOUT_BUCKETS; i += 1) for (i = 0; i < NUM_PIPELINE_LAYOUT_BUCKETS; i += 1)
{ {
for (j = 0; j < renderer->graphicsPipelineLayoutHashTable.buckets[i].count; j += 1) for (j = 0; j < renderer->graphicsPipelineLayoutHashTable.buckets[i].count; j += 1)
{ {
pipelineLayout = renderer->graphicsPipelineLayoutHashTable.buckets[i].elements[j].value; graphicsPipelineLayout = renderer->graphicsPipelineLayoutHashTable.buckets[i].elements[j].value;
if (pipelineLayout->vertexSamplerDescriptorSetCache != NULL) if (graphicsPipelineLayout->vertexSamplerDescriptorSetCache != NULL)
{ {
VULKAN_INTERNAL_DeactivateUnusedDescriptorSets( VULKAN_INTERNAL_DeactivateUnusedImageDescriptorSets(
pipelineLayout->vertexSamplerDescriptorSetCache graphicsPipelineLayout->vertexSamplerDescriptorSetCache
); );
} }
if (pipelineLayout->fragmentSamplerDescriptorSetCache != NULL) if (graphicsPipelineLayout->fragmentSamplerDescriptorSetCache != NULL)
{ {
VULKAN_INTERNAL_DeactivateUnusedDescriptorSets( VULKAN_INTERNAL_DeactivateUnusedImageDescriptorSets(
pipelineLayout->fragmentSamplerDescriptorSetCache graphicsPipelineLayout->fragmentSamplerDescriptorSetCache
);
}
}
for (j = 0; j < renderer->computePipelineLayoutHashTable.buckets[i].count; j += 1)
{
computePipelineLayout = renderer->computePipelineLayoutHashTable.buckets[i].elements[j].value;
if (computePipelineLayout->bufferDescriptorSetCache != NULL)
{
VULKAN_INTERNAL_DeactivateUnusedBufferDescriptorSets(
computePipelineLayout->bufferDescriptorSetCache
);
}
if (computePipelineLayout->imageDescriptorSetCache != NULL)
{
VULKAN_INTERNAL_DeactivateUnusedImageDescriptorSets(
computePipelineLayout->imageDescriptorSetCache
); );
} }
} }
@ -9109,6 +9315,22 @@ static REFRESH_Device* VULKAN_CreateDevice(
renderer->submittedGraphicsPipelinesToDestroyCapacity renderer->submittedGraphicsPipelinesToDestroyCapacity
); );
renderer->computePipelinesToDestroyCapacity = 16;
renderer->computePipelinesToDestroyCount = 0;
renderer->computePipelinesToDestroy = (VulkanComputePipeline**) SDL_malloc(
sizeof(VulkanComputePipeline*) *
renderer->computePipelinesToDestroyCapacity
);
renderer->submittedComputePipelinesToDestroyCapacity = 16;
renderer->submittedComputePipelinesToDestroyCount = 0;
renderer->submittedComputePipelinesToDestroy = (VulkanComputePipeline**) SDL_malloc(
sizeof(VulkanComputePipeline*) *
renderer->submittedComputePipelinesToDestroyCapacity
);
renderer->shaderModulesToDestroyCapacity = 16; renderer->shaderModulesToDestroyCapacity = 16;
renderer->shaderModulesToDestroyCount = 0; renderer->shaderModulesToDestroyCount = 0;