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 SAMPLER_POOL_STARTING_SIZE 128
|
||||||
#define UBO_POOL_SIZE 1000
|
#define UBO_POOL_SIZE 1000
|
||||||
#define SUB_BUFFER_COUNT 2
|
#define SUB_BUFFER_COUNT 2
|
||||||
|
#define DESCRIPTOR_SET_DEACTIVATE_FRAMES 10
|
||||||
|
|
||||||
#define IDENTITY_SWIZZLE \
|
#define IDENTITY_SWIZZLE \
|
||||||
{ \
|
{ \
|
||||||
|
@ -3082,6 +3083,11 @@ static VulkanGraphicsPipelineLayout* VULKAN_INTERNAL_FetchGraphicsPipelineLayout
|
||||||
vulkanGraphicsPipelineLayout
|
vulkanGraphicsPipelineLayout
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* If the binding count is 0
|
||||||
|
* we can just bind the same descriptor set
|
||||||
|
* so no cache is needed
|
||||||
|
*/
|
||||||
|
|
||||||
if (vertexSamplerBindingCount == 0)
|
if (vertexSamplerBindingCount == 0)
|
||||||
{
|
{
|
||||||
vulkanGraphicsPipelineLayout->vertexSamplerDescriptorSetCache = NULL;
|
vulkanGraphicsPipelineLayout->vertexSamplerDescriptorSetCache = NULL;
|
||||||
|
@ -3412,7 +3418,6 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
|
|
||||||
/* Pipeline Layout */
|
/* Pipeline Layout */
|
||||||
|
|
||||||
|
|
||||||
graphicsPipeline->pipelineLayout = VULKAN_INTERNAL_FetchGraphicsPipelineLayout(
|
graphicsPipeline->pipelineLayout = VULKAN_INTERNAL_FetchGraphicsPipelineLayout(
|
||||||
renderer,
|
renderer,
|
||||||
pipelineCreateInfo->pipelineLayoutCreateInfo.vertexSamplerBindingCount,
|
pipelineCreateInfo->pipelineLayoutCreateInfo.vertexSamplerBindingCount,
|
||||||
|
@ -3461,8 +3466,6 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
SDL_stack_free(viewports);
|
SDL_stack_free(viewports);
|
||||||
SDL_stack_free(scissors);
|
SDL_stack_free(scissors);
|
||||||
SDL_stack_free(colorBlendAttachmentStates);
|
SDL_stack_free(colorBlendAttachmentStates);
|
||||||
SDL_stack_free(vertexSamplerLayoutBindings);
|
|
||||||
SDL_stack_free(fragmentSamplerLayoutBindings);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3471,8 +3474,6 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
SDL_stack_free(viewports);
|
SDL_stack_free(viewports);
|
||||||
SDL_stack_free(scissors);
|
SDL_stack_free(scissors);
|
||||||
SDL_stack_free(colorBlendAttachmentStates);
|
SDL_stack_free(colorBlendAttachmentStates);
|
||||||
SDL_stack_free(vertexSamplerLayoutBindings);
|
|
||||||
SDL_stack_free(fragmentSamplerLayoutBindings);
|
|
||||||
|
|
||||||
/* Allocate uniform buffer descriptors */
|
/* 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(
|
static void VULKAN_Submit(
|
||||||
REFRESH_Renderer *driverData
|
REFRESH_Renderer *driverData
|
||||||
) {
|
) {
|
||||||
|
@ -5719,6 +5805,9 @@ static void VULKAN_Submit(
|
||||||
renderer->fragmentUBOOffset = UBO_BUFFER_SIZE * renderer->frameIndex;
|
renderer->fragmentUBOOffset = UBO_BUFFER_SIZE * renderer->frameIndex;
|
||||||
renderer->fragmentUBOBlockIncrement = 0;
|
renderer->fragmentUBOBlockIncrement = 0;
|
||||||
|
|
||||||
|
/* Reset descriptor set data */
|
||||||
|
VULKAN_INTERNAL_ResetDescriptorSetData(renderer);
|
||||||
|
|
||||||
/* Present, if applicable */
|
/* Present, if applicable */
|
||||||
|
|
||||||
if (present)
|
if (present)
|
||||||
|
|
Loading…
Reference in New Issue