X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=d21512f6c82e4e6bdef3ccbdf38f70cd6e018e66;hp=06ea0f49c98a03b4c8186449eaac823d922a4719;hb=4737d137d0a1c7fed868c4adc7a3d7e00ba7681c;hpb=3c2397dbb6e45fe72214f71048c4edfe4f11ac73 diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 06ea0f49..d21512f6 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -604,6 +604,17 @@ T ConstantFolder::evaluate_int_special_op(char oper, T left, T right) } } +template +void ConstantFolder::convert_to_result(const Variant &value) +{ + if(value.check_type()) + set_result(static_cast(value.value())); + else if(value.check_type()) + set_result(static_cast(value.value())); + else if(value.check_type()) + set_result(static_cast(value.value())); +} + void ConstantFolder::set_result(const Variant &value, bool literal) { r_constant_value = value; @@ -776,6 +787,28 @@ void ConstantFolder::visit(TernaryExpression &ternary) void ConstantFolder::visit(FunctionCall &call) { + if(call.constructor && call.type && call.arguments.size()==1) + { + const BasicTypeDeclaration *basic = dynamic_cast(call.type); + if(basic) + { + call.arguments[0]->visit(*this); + bool can_fold = r_constant; + r_constant = false; + if(!can_fold) + return; + + if(basic->kind==BasicTypeDeclaration::BOOL) + convert_to_result(r_constant_value); + else if(basic->kind==BasicTypeDeclaration::INT && basic->size==32) + convert_to_result(r_constant_value); + else if(basic->kind==BasicTypeDeclaration::FLOAT && basic->size==32) + convert_to_result(r_constant_value); + + return; + } + } + TraversingVisitor::visit(call); r_constant = false; }