X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Freflect.cpp;h=151735ab18f3790d51b94bbf61da68726ce56a39;hp=688c99bf81b951ae288a23c9d5409e94fd7903c8;hb=8967d38bc578f1653c1dde01dce49a8f7b0c912e;hpb=42903b905cd3924ecc45d3cb08222bc3548cab91 diff --git a/source/glsl/reflect.cpp b/source/glsl/reflect.cpp index 688c99bf..151735ab 100644 --- a/source/glsl/reflect.cpp +++ b/source/glsl/reflect.cpp @@ -44,6 +44,70 @@ void LocationCounter::visit(VariableDeclaration &var) } +void MemoryRequirementsCalculator::visit(BasicTypeDeclaration &basic) +{ + if(basic.kind==BasicTypeDeclaration::BOOL) + { + r_size = 1; + r_alignment = 1; + } + else if(basic.kind==BasicTypeDeclaration::INT || basic.kind==BasicTypeDeclaration::FLOAT) + { + r_size = basic.size/8; + r_alignment = r_size; + } + else if(basic.kind==BasicTypeDeclaration::VECTOR || basic.kind==BasicTypeDeclaration::MATRIX) + { + basic.base_type->visit(*this); + unsigned n_elem = basic.size&0xFFFF; + r_size *= n_elem; + if(basic.kind==BasicTypeDeclaration::VECTOR) + r_alignment *= (n_elem==3 ? 4 : n_elem); + } + else if(basic.kind==BasicTypeDeclaration::ARRAY) + basic.base_type->visit(*this); +} + +void MemoryRequirementsCalculator::visit(StructDeclaration &strct) +{ + unsigned total = 0; + unsigned max_align = 1; + for(NodeList::iterator i=strct.members.body.begin(); i!=strct.members.body.end(); ++i) + { + r_size = 0; + r_alignment = 1; + r_offset = -1; + (*i)->visit(*this); + if(r_offset) + total = r_offset; + total += r_alignment-1; + total -= total%r_alignment; + total += r_size; + max_align = max(max_align, r_alignment); + } + r_size = total; + r_alignment = max_align; +} + +void MemoryRequirementsCalculator::visit(VariableDeclaration &var) +{ + if(var.layout) + { + const vector qualifiers = var.layout->qualifiers; + for(vector::const_iterator i=qualifiers.begin(); (r_offset<0 && i!=qualifiers.end()); ++i) + if(i->name=="offset") + r_offset = i->value; + } + + if(var.type_declaration) + var.type_declaration->visit(*this); + if(var.array) + if(const Literal *literal = dynamic_cast(var.array_size.get())) + if(literal->value.check_type()) + r_size += r_alignment*(literal->value.value()-1); +} + + set DependencyCollector::apply(FunctionDeclaration &func) { func.visit(*this);