- remove the 6 layer texture descriptor set limitation

This commit is contained in:
Magnus Norddahl 2019-04-09 16:30:49 +02:00 committed by Rachael Alexanderson
parent 0dbce59679
commit a159dc28bb
3 changed files with 37 additions and 21 deletions

View file

@ -17,8 +17,6 @@ VkRenderPassManager::VkRenderPassManager()
void VkRenderPassManager::Init() void VkRenderPassManager::Init()
{ {
CreateDynamicSetLayout(); CreateDynamicSetLayout();
CreateTextureSetLayout();
CreatePipelineLayout();
CreateDescriptorPool(); CreateDescriptorPool();
CreateDynamicSet(); CreateDynamicSet();
} }
@ -91,25 +89,42 @@ void VkRenderPassManager::CreateDynamicSetLayout()
DynamicSetLayout->SetDebugName("VkRenderPassManager.DynamicSetLayout"); DynamicSetLayout->SetDebugName("VkRenderPassManager.DynamicSetLayout");
} }
void VkRenderPassManager::CreateTextureSetLayout() VulkanDescriptorSetLayout *VkRenderPassManager::GetTextureSetLayout(int numLayers)
{ {
if (TextureSetLayouts.size() < (size_t)numLayers)
TextureSetLayouts.resize(numLayers);
auto &layout = TextureSetLayouts[numLayers - 1];
if (layout)
return layout.get();
DescriptorSetLayoutBuilder builder; DescriptorSetLayoutBuilder builder;
for (int i = 0; i < 6; i++) for (int i = 0; i < numLayers; i++)
{ {
builder.addBinding(i, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); builder.addBinding(i, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
} }
TextureSetLayout = builder.create(GetVulkanFrameBuffer()->device); layout = builder.create(GetVulkanFrameBuffer()->device);
TextureSetLayout->SetDebugName("VkRenderPassManager.TextureSetLayout"); layout->SetDebugName("VkRenderPassManager.TextureSetLayout");
return layout.get();
} }
void VkRenderPassManager::CreatePipelineLayout() VulkanPipelineLayout* VkRenderPassManager::GetPipelineLayout(int numLayers)
{ {
if (PipelineLayouts.size() <= (size_t)numLayers)
PipelineLayouts.resize(numLayers + 1);
auto &layout = PipelineLayouts[numLayers];
if (layout)
return layout.get();
PipelineLayoutBuilder builder; PipelineLayoutBuilder builder;
builder.addSetLayout(DynamicSetLayout.get()); builder.addSetLayout(DynamicSetLayout.get());
builder.addSetLayout(TextureSetLayout.get()); if (numLayers != 0)
builder.addSetLayout(GetTextureSetLayout(numLayers));
builder.addPushConstantRange(VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(PushConstants)); builder.addPushConstantRange(VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(PushConstants));
PipelineLayout = builder.create(GetVulkanFrameBuffer()->device); layout = builder.create(GetVulkanFrameBuffer()->device);
PipelineLayout->SetDebugName("VkRenderPassManager.PipelineLayout"); layout->SetDebugName("VkRenderPassManager.PipelineLayout");
return layout.get();
} }
void VkRenderPassManager::CreateDescriptorPool() void VkRenderPassManager::CreateDescriptorPool()
@ -145,8 +160,6 @@ void VkRenderPassManager::UpdateDynamicSet()
std::unique_ptr<VulkanDescriptorSet> VkRenderPassManager::AllocateTextureDescriptorSet(int numLayers) std::unique_ptr<VulkanDescriptorSet> VkRenderPassManager::AllocateTextureDescriptorSet(int numLayers)
{ {
numLayers = 6; // To do: remove this and create a TextureSetLayout for each amount to support custom materials
if (TextureDescriptorSetsLeft == 0 || TextureDescriptorsLeft < numLayers) if (TextureDescriptorSetsLeft == 0 || TextureDescriptorsLeft < numLayers)
{ {
TextureDescriptorSetsLeft = 1000; TextureDescriptorSetsLeft = 1000;
@ -161,7 +174,7 @@ std::unique_ptr<VulkanDescriptorSet> VkRenderPassManager::AllocateTextureDescrip
TextureDescriptorSetsLeft--; TextureDescriptorSetsLeft--;
TextureDescriptorsLeft -= numLayers; TextureDescriptorsLeft -= numLayers;
return TextureDescriptorPools.back()->allocate(TextureSetLayout.get()); return TextureDescriptorPools.back()->allocate(GetTextureSetLayout(numLayers));
} }
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
@ -302,7 +315,7 @@ void VkRenderPassSetup::CreatePipeline(const VkRenderPassKey &key)
builder.setSubpassColorAttachmentCount(key.DrawBuffers); builder.setSubpassColorAttachmentCount(key.DrawBuffers);
builder.setRasterizationSamples((VkSampleCountFlagBits)key.Samples); builder.setRasterizationSamples((VkSampleCountFlagBits)key.Samples);
builder.setLayout(fb->GetRenderPassManager()->PipelineLayout.get()); builder.setLayout(fb->GetRenderPassManager()->GetPipelineLayout(key.NumTextureLayers));
builder.setRenderPass(RenderPass.get()); builder.setRenderPass(RenderPass.get());
Pipeline = builder.create(fb->device); Pipeline = builder.create(fb->device);
Pipeline->SetDebugName("VkRenderPassSetup.Pipeline"); Pipeline->SetDebugName("VkRenderPassSetup.Pipeline");

View file

@ -31,6 +31,7 @@ public:
int Samples; int Samples;
int ClearTargets; int ClearTargets;
int DrawBuffers; int DrawBuffers;
int NumTextureLayers;
bool UsesDepthStencil() const { return DepthTest || DepthWrite || StencilTest || (ClearTargets & (CT_Depth | CT_Stencil)); } bool UsesDepthStencil() const { return DepthTest || DepthWrite || StencilTest || (ClearTargets & (CT_Depth | CT_Stencil)); }
@ -76,10 +77,9 @@ public:
int GetVertexFormat(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute *attrs); int GetVertexFormat(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute *attrs);
std::unique_ptr<VulkanDescriptorSet> AllocateTextureDescriptorSet(int numLayers); std::unique_ptr<VulkanDescriptorSet> AllocateTextureDescriptorSet(int numLayers);
VulkanPipelineLayout* GetPipelineLayout(int numLayers);
std::unique_ptr<VulkanDescriptorSetLayout> DynamicSetLayout; std::unique_ptr<VulkanDescriptorSetLayout> DynamicSetLayout;
std::unique_ptr<VulkanDescriptorSetLayout> TextureSetLayout;
std::unique_ptr<VulkanPipelineLayout> PipelineLayout;
std::map<VkRenderPassKey, std::unique_ptr<VkRenderPassSetup>> RenderPassSetup; std::map<VkRenderPassKey, std::unique_ptr<VkRenderPassSetup>> RenderPassSetup;
std::unique_ptr<VulkanDescriptorSet> DynamicSet; std::unique_ptr<VulkanDescriptorSet> DynamicSet;
@ -88,13 +88,15 @@ public:
private: private:
void CreateDynamicSetLayout(); void CreateDynamicSetLayout();
void CreateTextureSetLayout();
void CreatePipelineLayout();
void CreateDescriptorPool(); void CreateDescriptorPool();
void CreateDynamicSet(); void CreateDynamicSet();
VulkanDescriptorSetLayout *GetTextureSetLayout(int numLayers);
int TextureDescriptorSetsLeft = 0; int TextureDescriptorSetsLeft = 0;
int TextureDescriptorsLeft = 0; int TextureDescriptorsLeft = 0;
std::vector<std::unique_ptr<VulkanDescriptorPool>> TextureDescriptorPools; std::vector<std::unique_ptr<VulkanDescriptorPool>> TextureDescriptorPools;
std::unique_ptr<VulkanDescriptorPool> DynamicDescriptorPool; std::unique_ptr<VulkanDescriptorPool> DynamicDescriptorPool;
std::vector<std::unique_ptr<VulkanDescriptorSetLayout>> TextureSetLayouts;
std::vector<std::unique_ptr<VulkanPipelineLayout>> PipelineLayouts;
}; };

View file

@ -202,6 +202,7 @@ void VkRenderState::ApplyRenderPass(int dt)
passKey.CullMode = mCullMode; passKey.CullMode = mCullMode;
passKey.Samples = mRenderTarget.Samples; passKey.Samples = mRenderTarget.Samples;
passKey.DrawBuffers = mRenderTarget.DrawBuffers; passKey.DrawBuffers = mRenderTarget.DrawBuffers;
passKey.NumTextureLayers = mMaterial.mMaterial ? mMaterial.mMaterial->GetLayers() : 0;
if (mSpecialEffect > EFF_NONE) if (mSpecialEffect > EFF_NONE)
{ {
passKey.SpecialEffect = mSpecialEffect; passKey.SpecialEffect = mSpecialEffect;
@ -417,7 +418,7 @@ void VkRenderState::ApplyPushConstants()
auto fb = GetVulkanFrameBuffer(); auto fb = GetVulkanFrameBuffer();
auto passManager = fb->GetRenderPassManager(); auto passManager = fb->GetRenderPassManager();
mCommandBuffer->pushConstants(passManager->PipelineLayout.get(), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &mPushConstants); mCommandBuffer->pushConstants(passManager->GetPipelineLayout(mRenderPassKey.NumTextureLayers), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &mPushConstants);
} }
template<typename T> template<typename T>
@ -499,7 +500,7 @@ void VkRenderState::ApplyMaterial()
{ {
auto fb = GetVulkanFrameBuffer(); auto fb = GetVulkanFrameBuffer();
auto passManager = fb->GetRenderPassManager(); auto passManager = fb->GetRenderPassManager();
mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, passManager->PipelineLayout.get(), 1, base->GetDescriptorSet(mMaterial)); mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, passManager->GetPipelineLayout(mRenderPassKey.NumTextureLayers), 1, base->GetDescriptorSet(mMaterial));
} }
if (mMaterial.mMaterial && mMaterial.mMaterial->tex) if (mMaterial.mMaterial && mMaterial.mMaterial->tex)
@ -517,7 +518,7 @@ void VkRenderState::ApplyDynamicSet()
auto passManager = fb->GetRenderPassManager(); auto passManager = fb->GetRenderPassManager();
uint32_t offsets[4] = { mViewpointOffset, mLightBufferOffset, mMatricesOffset, mStreamDataOffset }; uint32_t offsets[4] = { mViewpointOffset, mLightBufferOffset, mMatricesOffset, mStreamDataOffset };
mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, passManager->PipelineLayout.get(), 0, passManager->DynamicSet.get(), 4, offsets); mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, passManager->GetPipelineLayout(mRenderPassKey.NumTextureLayers), 0, passManager->DynamicSet.get(), 4, offsets);
mLastViewpointOffset = mViewpointOffset; mLastViewpointOffset = mViewpointOffset;
mLastLightBufferOffset = mLightBufferOffset; mLastLightBufferOffset = mLightBufferOffset;