X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Freflect.cpp;h=8c10acccd697c265063d481a8f1a8b055ac492bb;hb=91e65bc9e24a6889995081035f6f6f0a78a6c20e;hp=93d64e5fdb62aac1087d080efb37a0687fd99901;hpb=c701c8787cb19fbb6dc5b0bfae1a94e2b07dd549;p=libs%2Fgl.git diff --git a/source/glsl/reflect.cpp b/source/glsl/reflect.cpp index 93d64e5f..8c10accc 100644 --- a/source/glsl/reflect.cpp +++ b/source/glsl/reflect.cpp @@ -6,6 +6,46 @@ namespace Msp { namespace GL { namespace SL { +bool is_scalar(const BasicTypeDeclaration &type) +{ + return (type.kind==BasicTypeDeclaration::INT || type.kind==BasicTypeDeclaration::FLOAT); +} + +bool is_vector_or_matrix(const BasicTypeDeclaration &type) +{ + return (type.kind==BasicTypeDeclaration::VECTOR || type.kind==BasicTypeDeclaration::MATRIX); +} + +BasicTypeDeclaration *get_element_type(BasicTypeDeclaration &type) +{ + if(is_vector_or_matrix(type) || type.kind==BasicTypeDeclaration::ARRAY) + { + BasicTypeDeclaration *basic_base = dynamic_cast(type.base_type); + return (basic_base ? get_element_type(*basic_base) : 0); + } + else + return &type; +} + +bool can_convert(const BasicTypeDeclaration &from, const BasicTypeDeclaration &to) +{ + if(from.kind==BasicTypeDeclaration::INT && to.kind==BasicTypeDeclaration::FLOAT) + return from.size<=to.size; + else if(from.kind!=to.kind) + return false; + else if(from.kind==BasicTypeDeclaration::INT && from.sign!=to.sign) + return from.sign && from.size<=to.size; + else if(is_vector_or_matrix(from) && from.size==to.size) + { + BasicTypeDeclaration *from_base = dynamic_cast(from.base_type); + BasicTypeDeclaration *to_base = dynamic_cast(to.base_type); + return (from_base && to_base && can_convert(*from_base, *to_base)); + } + else + return false; +} + + unsigned TypeComparer::next_tag = 1; TypeComparer::TypeComparer(): @@ -51,11 +91,41 @@ 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)) { - if(basic1->kind!=basic.kind || basic1->size!=basic.size) + if(basic1->kind!=basic.kind || basic1->size!=basic.size || basic1->sign!=basic.sign) r_result = false; else if(basic1->base_type && basic.base_type) compare(*basic1->base_type, *basic.base_type); @@ -106,8 +176,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 +319,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 +338,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