mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-02-02 22:01:41 +00:00
Avoid creating new descriptor pools every frame
This commit is contained in:
parent
dba514a2cf
commit
c7fe3de4b0
2 changed files with 59 additions and 43 deletions
|
@ -41,6 +41,8 @@ VkDescriptorSetManager::VkDescriptorSetManager(VulkanFrameBuffer* fb) : fb(fb)
|
||||||
{
|
{
|
||||||
CreateHWBufferSetLayout();
|
CreateHWBufferSetLayout();
|
||||||
CreateFixedSetLayout();
|
CreateFixedSetLayout();
|
||||||
|
CreateHWBufferPool();
|
||||||
|
CreateFixedSetPool();
|
||||||
}
|
}
|
||||||
|
|
||||||
VkDescriptorSetManager::~VkDescriptorSetManager()
|
VkDescriptorSetManager::~VkDescriptorSetManager()
|
||||||
|
@ -67,32 +69,16 @@ void VkDescriptorSetManager::BeginFrame()
|
||||||
UpdateHWBufferSet();
|
UpdateHWBufferSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VkDescriptorSetManager::CreateHWBufferSetLayout()
|
|
||||||
{
|
|
||||||
DescriptorSetLayoutBuilder builder;
|
|
||||||
builder.addBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT);
|
|
||||||
builder.addBinding(1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT);
|
|
||||||
builder.addBinding(2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT);
|
|
||||||
builder.addBinding(3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
|
|
||||||
HWBufferSetLayout = builder.create(fb->device);
|
|
||||||
HWBufferSetLayout->SetDebugName("VkDescriptorSetManager.HWBufferSetLayout");
|
|
||||||
}
|
|
||||||
|
|
||||||
void VkDescriptorSetManager::UpdateHWBufferSet()
|
void VkDescriptorSetManager::UpdateHWBufferSet()
|
||||||
{
|
{
|
||||||
fb->GetCommands()->DrawDeleteList->Add(std::move(HWBufferSet));
|
fb->GetCommands()->DrawDeleteList->Add(std::move(HWBufferSet));
|
||||||
fb->GetCommands()->DrawDeleteList->Add(std::move(HWBufferDescriptorPool));
|
|
||||||
|
|
||||||
DescriptorPoolBuilder poolbuilder;
|
HWBufferSet = HWBufferDescriptorPool->tryAllocate(HWBufferSetLayout.get());
|
||||||
poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 3);
|
|
||||||
poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1);
|
|
||||||
poolbuilder.setMaxSets(1);
|
|
||||||
HWBufferDescriptorPool = poolbuilder.create(fb->device);
|
|
||||||
HWBufferDescriptorPool->SetDebugName("VkDescriptorSetManager.HWBufferDescriptorPool");
|
|
||||||
|
|
||||||
HWBufferSet = HWBufferDescriptorPool->allocate(HWBufferSetLayout.get());
|
|
||||||
if (!HWBufferSet)
|
if (!HWBufferSet)
|
||||||
I_FatalError("CreateHWBufferSet failed.\n");
|
{
|
||||||
|
fb->GetCommands()->WaitForCommands(false);
|
||||||
|
HWBufferSet = HWBufferDescriptorPool->allocate(HWBufferSetLayout.get());
|
||||||
|
}
|
||||||
|
|
||||||
WriteDescriptors update;
|
WriteDescriptors update;
|
||||||
update.addBuffer(HWBufferSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->ViewpointUBO->mBuffer.get(), 0, sizeof(HWViewpointUniforms));
|
update.addBuffer(HWBufferSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->ViewpointUBO->mBuffer.get(), 0, sizeof(HWViewpointUniforms));
|
||||||
|
@ -102,33 +88,16 @@ void VkDescriptorSetManager::UpdateHWBufferSet()
|
||||||
update.updateSets(fb->device);
|
update.updateSets(fb->device);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VkDescriptorSetManager::CreateFixedSetLayout()
|
|
||||||
{
|
|
||||||
DescriptorSetLayoutBuilder builder;
|
|
||||||
builder.addBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
|
|
||||||
builder.addBinding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
|
|
||||||
if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME))
|
|
||||||
builder.addBinding(2, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
|
|
||||||
FixedSetLayout = builder.create(fb->device);
|
|
||||||
FixedSetLayout->SetDebugName("VkDescriptorSetManager.FixedSetLayout");
|
|
||||||
}
|
|
||||||
|
|
||||||
void VkDescriptorSetManager::UpdateFixedSet()
|
void VkDescriptorSetManager::UpdateFixedSet()
|
||||||
{
|
{
|
||||||
fb->GetCommands()->DrawDeleteList->Add(std::move(FixedSet));
|
fb->GetCommands()->DrawDeleteList->Add(std::move(FixedSet));
|
||||||
fb->GetCommands()->DrawDeleteList->Add(std::move(FixedDescriptorPool));
|
|
||||||
|
|
||||||
DescriptorPoolBuilder poolbuilder;
|
FixedSet = FixedDescriptorPool->tryAllocate(FixedSetLayout.get());
|
||||||
poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2);
|
|
||||||
if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME))
|
|
||||||
poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1);
|
|
||||||
poolbuilder.setMaxSets(1);
|
|
||||||
FixedDescriptorPool = poolbuilder.create(fb->device);
|
|
||||||
FixedDescriptorPool->SetDebugName("VkDescriptorSetManager.FixedDescriptorPool");
|
|
||||||
|
|
||||||
FixedSet = FixedDescriptorPool->allocate(FixedSetLayout.get());
|
|
||||||
if (!FixedSet)
|
if (!FixedSet)
|
||||||
I_FatalError("CreateFixedSet failed.\n");
|
{
|
||||||
|
fb->GetCommands()->WaitForCommands(false);
|
||||||
|
FixedSet = FixedDescriptorPool->allocate(FixedSetLayout.get());
|
||||||
|
}
|
||||||
|
|
||||||
WriteDescriptors update;
|
WriteDescriptors update;
|
||||||
update.addCombinedImageSampler(FixedSet.get(), 0, fb->GetTextureManager()->Shadowmap.View.get(), fb->GetSamplerManager()->ShadowmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
update.addCombinedImageSampler(FixedSet.get(), 0, fb->GetTextureManager()->Shadowmap.View.get(), fb->GetSamplerManager()->ShadowmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||||
|
@ -275,3 +244,46 @@ std::unique_ptr<VulkanDescriptorSet> VkDescriptorSetManager::AllocatePPDescripto
|
||||||
|
|
||||||
return PPDescriptorPool->allocate(layout);
|
return PPDescriptorPool->allocate(layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VkDescriptorSetManager::CreateHWBufferSetLayout()
|
||||||
|
{
|
||||||
|
DescriptorSetLayoutBuilder builder;
|
||||||
|
builder.addBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
|
builder.addBinding(1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
|
builder.addBinding(2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
|
builder.addBinding(3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
|
HWBufferSetLayout = builder.create(fb->device);
|
||||||
|
HWBufferSetLayout->SetDebugName("VkDescriptorSetManager.HWBufferSetLayout");
|
||||||
|
}
|
||||||
|
|
||||||
|
void VkDescriptorSetManager::CreateFixedSetLayout()
|
||||||
|
{
|
||||||
|
DescriptorSetLayoutBuilder builder;
|
||||||
|
builder.addBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
|
builder.addBinding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
|
if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME))
|
||||||
|
builder.addBinding(2, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
|
FixedSetLayout = builder.create(fb->device);
|
||||||
|
FixedSetLayout->SetDebugName("VkDescriptorSetManager.FixedSetLayout");
|
||||||
|
}
|
||||||
|
|
||||||
|
void VkDescriptorSetManager::CreateHWBufferPool()
|
||||||
|
{
|
||||||
|
DescriptorPoolBuilder poolbuilder;
|
||||||
|
poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 3 * maxSets);
|
||||||
|
poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1 * maxSets);
|
||||||
|
poolbuilder.setMaxSets(maxSets);
|
||||||
|
HWBufferDescriptorPool = poolbuilder.create(fb->device);
|
||||||
|
HWBufferDescriptorPool->SetDebugName("VkDescriptorSetManager.HWBufferDescriptorPool");
|
||||||
|
}
|
||||||
|
|
||||||
|
void VkDescriptorSetManager::CreateFixedSetPool()
|
||||||
|
{
|
||||||
|
DescriptorPoolBuilder poolbuilder;
|
||||||
|
poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2 * maxSets);
|
||||||
|
if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME))
|
||||||
|
poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1 * maxSets);
|
||||||
|
poolbuilder.setMaxSets(maxSets);
|
||||||
|
FixedDescriptorPool = poolbuilder.create(fb->device);
|
||||||
|
FixedDescriptorPool->SetDebugName("VkDescriptorSetManager.FixedDescriptorPool");
|
||||||
|
}
|
||||||
|
|
|
@ -40,6 +40,8 @@ public:
|
||||||
private:
|
private:
|
||||||
void CreateHWBufferSetLayout();
|
void CreateHWBufferSetLayout();
|
||||||
void CreateFixedSetLayout();
|
void CreateFixedSetLayout();
|
||||||
|
void CreateHWBufferPool();
|
||||||
|
void CreateFixedSetPool();
|
||||||
|
|
||||||
std::unique_ptr<VulkanDescriptorSet> AllocatePPDescriptorSet(VulkanDescriptorSetLayout* layout);
|
std::unique_ptr<VulkanDescriptorSet> AllocatePPDescriptorSet(VulkanDescriptorSetLayout* layout);
|
||||||
|
|
||||||
|
@ -63,4 +65,6 @@ private:
|
||||||
std::unique_ptr<VulkanDescriptorSet> NullTextureDescriptorSet;
|
std::unique_ptr<VulkanDescriptorSet> NullTextureDescriptorSet;
|
||||||
|
|
||||||
std::list<VkMaterial*> Materials;
|
std::list<VkMaterial*> Materials;
|
||||||
|
|
||||||
|
static const int maxSets = 10;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue