X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Freflect.cpp;h=643c42e79be90f51f07009df7343ce67df80f09e;hb=1a5dafe20e47c764f2914c341fb7b8f1fba59fb8;hp=82ad244c1d7083c1ad8b61e4c22fee69e25e7f2f;hpb=e9a898f315b5d1396f196d785913a283c30940f2;p=libs%2Fgl.git diff --git a/source/glsl/reflect.cpp b/source/glsl/reflect.cpp index 82ad244c..643c42e7 100644 --- a/source/glsl/reflect.cpp +++ b/source/glsl/reflect.cpp @@ -1,4 +1,5 @@ #include +#include #include "reflect.h" using namespace std; @@ -49,13 +50,6 @@ bool can_convert(const BasicTypeDeclaration &from, const BasicTypeDeclaration &t unsigned TypeComparer::next_tag = 1; -TypeComparer::TypeComparer(): - first(0), - second(0), - first_tag(0), - r_result(false) -{ } - void TypeComparer::compare(Node &node1, Node &node2) { if(&node1==&node2) @@ -122,6 +116,49 @@ void TypeComparer::visit(VariableReference &var) } } +void TypeComparer::visit(UnaryExpression &unary) +{ + if(UnaryExpression *unary1 = multi_visit(unary)) + { + if(unary1->oper!=unary.oper) + r_result = false; + else + compare(*unary1->expression, *unary.expression); + } +} + +void TypeComparer::visit(BinaryExpression &binary) +{ + if(BinaryExpression *binary1 = multi_visit(binary)) + { + if(binary1->oper!=binary.oper) + r_result = false; + else + { + compare(*binary1->left, *binary.left); + if(r_result) + compare(*binary1->right, *binary.right); + } + } +} + +void TypeComparer::visit(TernaryExpression &ternary) +{ + if(TernaryExpression *ternary1 = multi_visit(ternary)) + { + if(ternary1->oper!=ternary.oper) + r_result = false; + else + { + compare(*ternary1->condition, *ternary.condition); + if(r_result) + compare(*ternary1->true_expr, *ternary.true_expr); + if(r_result) + compare(*ternary1->false_expr, *ternary.false_expr); + } + } +} + void TypeComparer::visit(BasicTypeDeclaration &basic) { if(BasicTypeDeclaration *basic1 = multi_visit(basic)) @@ -182,6 +219,8 @@ void TypeComparer::visit(VariableDeclaration &var) r_result = false; if(var1->array_size && var.array_size) compare(*var1->array_size, *var.array_size); + else if(!var1->array_size && !var.array_size) + r_result = true; } if(r_result && var1->type_declaration!=var.type_declaration) compare(*var1->type_declaration, *var.type_declaration); @@ -191,10 +230,6 @@ void TypeComparer::visit(VariableDeclaration &var) } -LocationCounter::LocationCounter(): - r_count(0) -{ } - void LocationCounter::visit(BasicTypeDeclaration &basic) { r_count = basic.kind==BasicTypeDeclaration::MATRIX ? basic.size>>16 : 1; @@ -251,6 +286,9 @@ void MemoryRequirementsCalculator::visit(BasicTypeDeclaration &basic) } else if(basic.kind==BasicTypeDeclaration::ARRAY) basic.base_type->visit(*this); + + if(basic.extended_alignment) + r_alignment = (r_alignment+15)&~15U; } void MemoryRequirementsCalculator::visit(StructDeclaration &strct) @@ -263,7 +301,7 @@ void MemoryRequirementsCalculator::visit(StructDeclaration &strct) r_alignment = 1; r_offset = -1; s->visit(*this); - if(r_offset) + if(r_offset>=0) total = r_offset; total += r_alignment-1; total -= total%r_alignment; @@ -272,23 +310,26 @@ void MemoryRequirementsCalculator::visit(StructDeclaration &strct) } r_size = total; r_alignment = max_align; + if(strct.extended_alignment) + r_alignment = (r_alignment+15)&~15U; + r_size += r_alignment-1; + r_size -= r_size%r_alignment; } void MemoryRequirementsCalculator::visit(VariableDeclaration &var) { - if(var.layout) - { - auto i = find_member(var.layout->qualifiers, string("offset"), &Layout::Qualifier::name); - if(i!=var.layout->qualifiers.end()) - r_offset = i->value; - } + r_offset = get_layout_value(var.layout.get(), "offset"); 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); + { + unsigned aligned_size = r_size+r_alignment-1; + aligned_size -= aligned_size%r_alignment; + r_size = aligned_size*literal->value.value(); + } } @@ -307,15 +348,6 @@ void DependencyCollector::visit(VariableReference &var) } } -void DependencyCollector::visit(InterfaceBlockReference &iface) -{ - if(iface.declaration) - { - dependencies.insert(iface.declaration); - iface.declaration->visit(*this); - } -} - void DependencyCollector::visit(FunctionCall &call) { if(call.declaration) @@ -348,6 +380,41 @@ void DependencyCollector::visit(FunctionDeclaration &func) } } + +set AssignmentCollector::apply(Node &node) +{ + node.visit(*this); + return assigned_variables; +} + +void AssignmentCollector::visit(VariableReference &var) +{ + if(assignment_target) + assigned_variables.insert(var.declaration); +} + +void AssignmentCollector::visit(UnaryExpression &unary) +{ + SetFlag set_assignment(assignment_target, (unary.oper->token[1]=='+' || unary.oper->token[1]=='-')); + TraversingVisitor::visit(unary); +} + +void AssignmentCollector::visit(BinaryExpression &binary) +{ + binary.left->visit(*this); + SetFlag clear_assignment(assignment_target, false); + binary.right->visit(*this); +} + +void AssignmentCollector::visit(Assignment &assign) +{ + { + SetFlag set_assignment(assignment_target); + assign.left->visit(*this); + } + assign.right->visit(*this); +} + } // namespace SL } // namespace GL } // namespace Msp