reflect_data.uniform_blocks.push_back(ReflectData::UniformBlockInfo());
vector<vector<string> > block_uniform_names(1);
+ unsigned n_descriptor_sets = 0;
for(const SpirVModule::Variable &v: mod.get_variables())
{
if((v.storage==SpirVModule::UNIFORM || v.storage==SpirVModule::PUSH_CONSTANT) && v.struct_type)
info.bind_point = ReflectData::PUSH_CONSTANT;
else
{
- info.bind_point = v.binding;
- info.descriptor_set = v.descriptor_set;
+ if(v.binding>=0)
+ info.bind_point = v.binding | (v.descriptor_set<<20);
+ else
+ info.bind_point = ReflectData::DEFAULT_BLOCK;
+ n_descriptor_sets = max(n_descriptor_sets, v.descriptor_set+1);
}
info.data_size = v.struct_type->size;
info.name = v.name;
info.tag = v.name;
info.location = v.location;
- info.binding = v.binding;
- info.descriptor_set = v.descriptor_set;
+ if(v.binding>=0)
+ info.binding = v.binding | (v.descriptor_set<<20);
+ n_descriptor_sets = max(n_descriptor_sets, v.descriptor_set+1);
info.array_size = max(v.array_size, 1U);
info.type = v.type;
}
sort_member(reflect_data.uniforms, &ReflectData::UniformInfo::tag);
+ if(block_uniform_names.front().empty())
+ {
+ reflect_data.uniform_blocks.erase(reflect_data.uniform_blocks.begin());
+ block_uniform_names.erase(block_uniform_names.begin());
+ }
+
for(unsigned i=0; i<reflect_data.uniform_blocks.size(); ++i)
{
ReflectData::UniformBlockInfo &block = reflect_data.uniform_blocks[i];
block.update_layout_hash();
}
+ reflect_data.n_descriptor_sets = n_descriptor_sets;
reflect_data.update_layout_hash();
}