X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Freflect.cpp;h=c38e3aecbb3d487c6c7c2f10f510b6495092e872;hb=677744faccc5d3ac14fd468267f622ba6187dc74;hp=93d64e5fdb62aac1087d080efb37a0687fd99901;hpb=c701c8787cb19fbb6dc5b0bfae1a94e2b07dd549;p=libs%2Fgl.git diff --git a/source/glsl/reflect.cpp b/source/glsl/reflect.cpp index 93d64e5f..c38e3aec 100644 --- a/source/glsl/reflect.cpp +++ b/source/glsl/reflect.cpp @@ -51,6 +51,36 @@ T *TypeComparer::multi_visit(T &node) return 0; } +void TypeComparer::visit(Literal &literal) +{ + if(Literal *lit1 = multi_visit(literal)) + { + if(!lit1->type || !literal.type) + r_result = false; + else + { + compare(*lit1->type, *literal.type); + if(r_result) + r_result = (literal.value.check_type() && lit1->value.value()==literal.value.value()); + } + } +} + +void TypeComparer::visit(VariableReference &var) +{ + if(VariableReference *var1 = multi_visit(var)) + { + if(!var1->declaration || !var.declaration) + r_result = false; + else if(!var1->declaration->constant || !var.declaration->constant) + r_result = false; + else if(!var1->declaration->init_expression || !var.declaration->init_expression) + r_result = false; + else + compare(*var1->declaration->init_expression, *var.declaration->init_expression); + } +} + void TypeComparer::visit(BasicTypeDeclaration &basic) { if(BasicTypeDeclaration *basic1 = multi_visit(basic)) @@ -106,8 +136,13 @@ void TypeComparer::visit(VariableDeclaration &var) r_result = false; else { - // TODO Compare array sizes - if(var1->type_declaration!=var.type_declaration) + if(var1->array) + { + r_result = false; + if(var1->array_size && var.array_size) + compare(*var1->array_size, *var.array_size); + } + if(r_result && var1->type_declaration!=var.type_declaration) compare(*var1->type_declaration, *var.type_declaration); // TODO Compare layout qualifiers for interface block members } @@ -244,7 +279,10 @@ void DependencyCollector::visit(InterfaceBlockReference &iface) void DependencyCollector::visit(FunctionCall &call) { if(call.declaration) + { dependencies.insert(call.declaration); + call.declaration->visit(*this); + } TraversingVisitor::visit(call); } @@ -260,6 +298,15 @@ void DependencyCollector::visit(VariableDeclaration &var) TraversingVisitor::visit(var); } +void DependencyCollector::visit(FunctionDeclaration &func) +{ + if(!visited_functions.count(&func)) + { + visited_functions.insert(&func); + TraversingVisitor::visit(func); + } +} + } // namespace SL } // namespace GL } // namespace Msp