This commit is contained in:
2026-02-20 19:35:09 +02:00
parent 3ed689f801
commit c00ecf4081
35 changed files with 576 additions and 99 deletions

View File

@@ -70,7 +70,7 @@ void CVkShader::Build()
VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT,
};
VkPipelineLayoutCreateInfo stPipelineLayout = {};
CUtlVector<VkDescriptorSetLayoutBinding> bindings = {};
CUtlVector<CUtlVector<VkDescriptorSetLayoutBinding>> bindings = {};
// TODO: Filter by vulkan shaders at some points
stages.Resize(m_shader.m_objects.GetSize());
@@ -82,21 +82,33 @@ void CVkShader::Build()
{
VulkanDescriptor_t stDescriptor = ((VulkanDescriptor_t*)m_shader.GetLumpPtr(pMetaData->pDescriptorSets))[u];
bool bFound = false;
for ( auto &b: bindings )
if (bindings.GetSize()<=stDescriptor.uSet)
bindings.Resize(stDescriptor.uSet+1);
uint32_t i = 0;
for ( auto &set: bindings )
{
if (b.binding != stDescriptor.uBinding)
continue;
bFound = true;
break;
for ( auto &b: set )
{
if (i != stDescriptor.uSet)
continue;
if (b.binding != stDescriptor.uBinding)
continue;
bFound = true;
break;
}
i++;
if (bFound)
break;
}
if (bFound)
break;
continue;
VkDescriptorSetLayoutBinding bind = {};
bind.binding = stDescriptor.uBinding;
bind.descriptorCount = 1;
bind.descriptorCount = stDescriptor.uCount;
bind.descriptorType = stDescriptor.eDescriptorType;
bind.stageFlags = VK_SHADER_STAGE_ALL;
bindings.AppendTail(bind);
bindings[stDescriptor.uSet].AppendTail(bind);
m_bindings.AppendTail(stDescriptor);
}
modules[i].sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
@@ -110,14 +122,19 @@ void CVkShader::Build()
if ( bindings.GetSize() >= 0 )
{
m_setLayouts.Resize(1);
VkDescriptorSetLayoutCreateInfo stSetLayoutCreateInfo = {};
stSetLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
stSetLayoutCreateInfo.pBindings = bindings.GetData();
stSetLayoutCreateInfo.bindingCount = bindings.GetSize();
stSetLayoutCreateInfo.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT;
vkCreateDescriptorSetLayout(m_hDevice, &stSetLayoutCreateInfo, NULL, m_setLayouts.GetData());
stPipelineLayout.setLayoutCount = 1;
m_setLayouts.Reserve(bindings.GetSize());
for ( int u = 0; u < bindings.GetSize(); u++ )
{
VkDescriptorSetLayoutCreateInfo stSetLayoutCreateInfo = {};
VkDescriptorSetLayout l = NULL;
stSetLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
stSetLayoutCreateInfo.pBindings = bindings[u].GetData();
stSetLayoutCreateInfo.bindingCount = bindings[u].GetSize();
stSetLayoutCreateInfo.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT;
vkCreateDescriptorSetLayout(m_hDevice, &stSetLayoutCreateInfo, NULL, &l);
m_setLayouts.AppendTail(l);
}
stPipelineLayout.setLayoutCount = m_setLayouts.GetSize();
stPipelineLayout.pSetLayouts = m_setLayouts.GetData();
}