10 const spirv_cross::ParsedIR* ir,
11 const spirv_cross::Compiler* compiler,
12 std::optional<spirv_cross::SPIRType::BaseType> type_filter,
15 std::vector<spirv_cross::ID> uniforms;
16 ir->for_each_typed_id<spirv_cross::SPIRVariable>(
17 [&](uint32_t,
const spirv_cross::SPIRVariable& var) {
18 if (var.storage != spv::StorageClassUniformConstant) {
21 const auto type = compiler->get_type(var.basetype);
22 if (!type_filter.has_value() ||
23 (include && type_filter.value() == type.basetype) ||
24 (!include && type_filter.value() != type.basetype)) {
25 uniforms.push_back(var.self);
29 auto compare_locations = [&ir](spirv_cross::ID id1, spirv_cross::ID id2) {
30 auto& flags1 = ir->get_decoration_bitset(id1);
31 auto& flags2 = ir->get_decoration_bitset(id2);
33 if (!flags1.get(spv::Decoration::DecorationLocation)) {
36 if (!flags2.get(spv::Decoration::DecorationLocation)) {
40 return ir->get_decoration(id1, spv::Decoration::DecorationLocation) <
41 ir->get_decoration(id2, spv::Decoration::DecorationLocation);
43 std::sort(uniforms.begin(), uniforms.end(), compare_locations);