Skip to content
Snippets Groups Projects
Commit 8029ec84 authored by Simeon Hermann's avatar Simeon Hermann
Browse files

[#36] Fix determination of highest descriptor set ID

parent 30ac3c3f
Branches
Tags
1 merge request!49Resolve "Shader Program Reflection"
Pipeline #25573 passed
...@@ -111,6 +111,7 @@ namespace vkcv { ...@@ -111,6 +111,7 @@ namespace vkcv {
spirv_cross::Compiler comp(move(shaderCode)); spirv_cross::Compiler comp(move(shaderCode));
spirv_cross::ShaderResources resources = comp.get_shader_resources(); spirv_cross::ShaderResources resources = comp.get_shader_resources();
//reflect vertex input
if (shaderStage == ShaderStage::VERTEX) { if (shaderStage == ShaderStage::VERTEX) {
std::vector<VertexInputAttachment> inputVec; std::vector<VertexInputAttachment> inputVec;
uint32_t offset = 0; uint32_t offset = 0;
...@@ -129,9 +130,7 @@ namespace vkcv { ...@@ -129,9 +130,7 @@ namespace vkcv {
m_VertexLayout = VertexLayout(inputVec); m_VertexLayout = VertexLayout(inputVec);
} }
//Descriptor Sets //reflect descriptor sets (uniform buffer, storage buffer, sampler, sampled image, storage image)
//Uniform buffer, storage buffer, sampler, sampled image, storage image
std::vector<std::pair<uint32_t, DescriptorBinding>> bindings; std::vector<std::pair<uint32_t, DescriptorBinding>> bindings;
int32_t maxSetID = -1; int32_t maxSetID = -1;
for (uint32_t i = 0; i < resources.uniform_buffers.size(); i++) { for (uint32_t i = 0; i < resources.uniform_buffers.size(); i++) {
...@@ -149,7 +148,8 @@ namespace vkcv { ...@@ -149,7 +148,8 @@ namespace vkcv {
std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet), std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet),
DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::STORAGE_BUFFER, base_type.vecsize, shaderStage)); DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::STORAGE_BUFFER, base_type.vecsize, shaderStage));
bindings.push_back(descriptor); bindings.push_back(descriptor);
if (comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID) maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet); if ((int32_t)comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID)
maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet);
} }
for (uint32_t i = 0; i < resources.separate_samplers.size(); i++) { for (uint32_t i = 0; i < resources.separate_samplers.size(); i++) {
...@@ -158,7 +158,8 @@ namespace vkcv { ...@@ -158,7 +158,8 @@ namespace vkcv {
std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet), std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet),
DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::SAMPLER, base_type.vecsize, shaderStage)); DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::SAMPLER, base_type.vecsize, shaderStage));
bindings.push_back(descriptor); bindings.push_back(descriptor);
if (comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID) maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet); if ((int32_t)comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID)
maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet);
} }
for (uint32_t i = 0; i < resources.separate_images.size(); i++) { for (uint32_t i = 0; i < resources.separate_images.size(); i++) {
...@@ -167,7 +168,8 @@ namespace vkcv { ...@@ -167,7 +168,8 @@ namespace vkcv {
std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet), std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet),
DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::IMAGE_SAMPLED, base_type.vecsize, shaderStage)); DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::IMAGE_SAMPLED, base_type.vecsize, shaderStage));
bindings.push_back(descriptor); bindings.push_back(descriptor);
if (comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID) maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet); if ((int32_t)comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID)
maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet);
} }
...@@ -177,15 +179,16 @@ namespace vkcv { ...@@ -177,15 +179,16 @@ namespace vkcv {
std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet), std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet),
DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::IMAGE_STORAGE, base_type.vecsize, shaderStage)); DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::IMAGE_STORAGE, base_type.vecsize, shaderStage));
bindings.push_back(descriptor); bindings.push_back(descriptor);
if (comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID) maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet); if ((int32_t)comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID)
maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet);
} }
if (maxSetID != -1) {
m_DescriptorSets.resize(maxSetID); if(m_DescriptorSets.size() < maxSetID) m_DescriptorSets.resize(maxSetID + 1);
for (auto binding : bindings) { for (const auto &binding : bindings) {
m_DescriptorSets[binding.first].push_back(binding.second); m_DescriptorSets[binding.first].push_back(binding.second);
}
} }
//reflect push constants //reflect push constants
for (const auto &pushConstantBuffer : resources.push_constant_buffers) { for (const auto &pushConstantBuffer : resources.push_constant_buffers) {
for (const auto &range : comp.get_active_buffer_ranges(pushConstantBuffer.id)) { for (const auto &range : comp.get_active_buffer_ranges(pushConstantBuffer.id)) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment