for(Structure &s: structs)
{
for(StructMember &m: s.members)
- {
if(m.struct_type)
{
auto i = struct_indices.find(m.struct_type);
m.struct_type = (i!=struct_indices.end() ? &structs[i->second] : 0);
}
- if(m.array_size_spec)
- {
- auto i = spec_indices.find(m.array_size_spec);
- m.array_size_spec = (i!=spec_indices.end() ? &spec_constants[i->second] : 0);
- }
- }
const StructMember *last_member = &s.members.back();
unsigned last_offset = last_member->offset;
const StructMember *lm = &last_member->struct_type->members.back();
if(last_member->array_size)
last_offset += last_member->array_stride*(last_member->array_size-1);
- else if(last_member->array_size_spec)
- last_offset += last_member->array_stride*(last_member->array_size_spec->i_value-1);
last_offset += lm->offset;
last_member = lm;
}
- s.size = last_offset+get_type_size(last_member->type);
+ unsigned last_size = get_type_size(last_member->type);
+ if(last_member->array_size)
+ last_size += last_member->array_stride*(last_member->array_size-1);
+ s.size = last_offset+last_size;
s.size = (s.size+15)&~15;
}
}
for(Variable &v: variables)
- {
if(v.struct_type)
{
auto i = struct_indices.find(v.struct_type);
v.struct_type = (i!=struct_indices.end() ? &structs[i->second] : 0);
}
- if(v.array_size_spec)
- {
- auto i = spec_indices.find(v.array_size_spec);
- v.array_size_spec = (i!=spec_indices.end() ? &spec_constants[i->second] : 0);
- }
- }
entry_points.reserve(reflection.entry_points.size());
for(const auto &kvp: reflection.entry_points)
type.struct_type = elem.struct_type;
const Constant &size = constants[*(op+3)];
- if(size.constant_id>=0)
- type.array_size_spec = &size;
- else if(size.type==INT || size.type==UNSIGNED_INT)
+ if(size.type==INT || size.type==UNSIGNED_INT)
type.array_size = size.i_value;
}
mem->type = type.type;
mem->struct_type = type.struct_type;
mem->array_size = type.array_size;
- mem->array_size_spec = type.array_size_spec;
mem->array_stride = type.array_stride;
}
}
var.type = type.type;
var.struct_type = type.struct_type;
var.array_size = type.array_size;
- var.array_size_spec = type.array_size_spec;
}
void SpirVModule::Reflection::reflect_decorate(CodeIterator op)