forked from MoonsideGames/Refresh
deactivate unused descriptor sets
parent
3780772bdd
commit
2a4811315b
|
@ -77,6 +77,7 @@ static uint32_t deviceExtensionCount = SDL_arraysize(deviceExtensionNames);
|
|||
#define SAMPLER_POOL_STARTING_SIZE 128
|
||||
#define UBO_POOL_SIZE 1000
|
||||
#define SUB_BUFFER_COUNT 2
|
||||
#define DESCRIPTOR_SET_DEACTIVATE_FRAMES 10
|
||||
|
||||
#define IDENTITY_SWIZZLE \
|
||||
{ \
|
||||
|
@ -3082,6 +3083,11 @@ static VulkanGraphicsPipelineLayout* VULKAN_INTERNAL_FetchGraphicsPipelineLayout
|
|||
vulkanGraphicsPipelineLayout
|
||||
);
|
||||
|
||||
/* If the binding count is 0
|
||||
* we can just bind the same descriptor set
|
||||
* so no cache is needed
|
||||
*/
|
||||
|
||||
if (vertexSamplerBindingCount == 0)
|
||||
{
|
||||
vulkanGraphicsPipelineLayout->vertexSamplerDescriptorSetCache = NULL;
|
||||
|
@ -3412,7 +3418,6 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
|||
|
||||
/* Pipeline Layout */
|
||||
|
||||
|
||||
graphicsPipeline->pipelineLayout = VULKAN_INTERNAL_FetchGraphicsPipelineLayout(
|
||||
renderer,
|
||||
pipelineCreateInfo->pipelineLayoutCreateInfo.vertexSamplerBindingCount,
|
||||
|
@ -3461,8 +3466,6 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
|||
SDL_stack_free(viewports);
|
||||
SDL_stack_free(scissors);
|
||||
SDL_stack_free(colorBlendAttachmentStates);
|
||||
SDL_stack_free(vertexSamplerLayoutBindings);
|
||||
SDL_stack_free(fragmentSamplerLayoutBindings);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -3471,8 +3474,6 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
|||
SDL_stack_free(viewports);
|
||||
SDL_stack_free(scissors);
|
||||
SDL_stack_free(colorBlendAttachmentStates);
|
||||
SDL_stack_free(vertexSamplerLayoutBindings);
|
||||
SDL_stack_free(fragmentSamplerLayoutBindings);
|
||||
|
||||
/* Allocate uniform buffer descriptors */
|
||||
|
||||
|
@ -5546,6 +5547,91 @@ static void VULKAN_QueuePresent(
|
|||
);
|
||||
}
|
||||
|
||||
static void VULKAN_INTERNAL_DeactivateUnusedDescriptorSets(
|
||||
SamplerDescriptorSetCache *samplerDescriptorSetCache
|
||||
) {
|
||||
int32_t i, j;
|
||||
SamplerDescriptorSetHashArray *arr;
|
||||
|
||||
for (i = samplerDescriptorSetCache->count - 1; i >= 0; i -= 1)
|
||||
{
|
||||
samplerDescriptorSetCache->elements[i].inactiveFrameCount += 1;
|
||||
|
||||
if (samplerDescriptorSetCache->elements[i].inactiveFrameCount + 1 > DESCRIPTOR_SET_DEACTIVATE_FRAMES)
|
||||
{
|
||||
arr = &samplerDescriptorSetCache->buckets[samplerDescriptorSetCache->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 */
|
||||
|
||||
samplerDescriptorSetCache->inactiveDescriptorSets[samplerDescriptorSetCache->inactiveDescriptorSetCount] = samplerDescriptorSetCache->elements[i].descriptorSet;
|
||||
samplerDescriptorSetCache->inactiveDescriptorSetCount += 1;
|
||||
|
||||
/* move another descriptor set to fill the hole */
|
||||
if (i < samplerDescriptorSetCache->count - 1)
|
||||
{
|
||||
samplerDescriptorSetCache->elements[i] = samplerDescriptorSetCache->elements[samplerDescriptorSetCache->count - 1];
|
||||
|
||||
/* update index in bucket */
|
||||
arr = &samplerDescriptorSetCache->buckets[samplerDescriptorSetCache->elements[i].key % NUM_DESCRIPTOR_SET_HASH_BUCKETS];
|
||||
|
||||
for (j = 0; j < arr->count; j += 1)
|
||||
{
|
||||
if (arr->elements[j] == samplerDescriptorSetCache->count - 1)
|
||||
{
|
||||
arr->elements[j] = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
samplerDescriptorSetCache->count -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void VULKAN_INTERNAL_ResetDescriptorSetData(VulkanRenderer *renderer)
|
||||
{
|
||||
uint32_t i, j;
|
||||
VulkanGraphicsPipelineLayout *pipelineLayout;
|
||||
|
||||
for (i = 0; i < NUM_PIPELINE_LAYOUT_BUCKETS; i += 1)
|
||||
{
|
||||
for (j = 0; j < renderer->pipelineLayoutHashTable.buckets[i].count; j += 1)
|
||||
{
|
||||
pipelineLayout = renderer->pipelineLayoutHashTable.buckets[i].elements[j].value;
|
||||
|
||||
if (pipelineLayout->vertexSamplerDescriptorSetCache != NULL)
|
||||
{
|
||||
VULKAN_INTERNAL_DeactivateUnusedDescriptorSets(
|
||||
pipelineLayout->vertexSamplerDescriptorSetCache
|
||||
);
|
||||
}
|
||||
|
||||
if (pipelineLayout->fragmentSamplerDescriptorSetCache != NULL)
|
||||
{
|
||||
VULKAN_INTERNAL_DeactivateUnusedDescriptorSets(
|
||||
pipelineLayout->fragmentSamplerDescriptorSetCache
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void VULKAN_Submit(
|
||||
REFRESH_Renderer *driverData
|
||||
) {
|
||||
|
@ -5719,6 +5805,9 @@ static void VULKAN_Submit(
|
|||
renderer->fragmentUBOOffset = UBO_BUFFER_SIZE * renderer->frameIndex;
|
||||
renderer->fragmentUBOBlockIncrement = 0;
|
||||
|
||||
/* Reset descriptor set data */
|
||||
VULKAN_INTERNAL_ResetDescriptorSetData(renderer);
|
||||
|
||||
/* Present, if applicable */
|
||||
|
||||
if (present)
|
||||
|
|
Loading…
Reference in New Issue