X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=06ea0f49c98a03b4c8186449eaac823d922a4719;hb=3c2397dbb6e45fe72214f71048c4edfe4f11ac73;hp=63dfcb5c2823758dc054f92cb4d1960650e05d44;hpb=188b3b2bf686aada8772475aabf899a0420cbd0f;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 63dfcb5c..06ea0f49 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "optimize.h" #include "reflect.h" @@ -591,6 +592,18 @@ T ConstantFolder::evaluate_arithmetic(char oper, T left, T right) } } +template +T ConstantFolder::evaluate_int_special_op(char oper, T left, T right) +{ + switch(oper) + { + case '%': return left%right; + case '<': return left<': return left>>right; + default: return T(); + } +} + void ConstantFolder::set_result(const Variant &value, bool literal) { r_constant_value = value; @@ -617,7 +630,11 @@ void ConstantFolder::visit(RefPtr &expr) else if(r_constant_value.check_type()) literal->token = lexical_cast(r_constant_value.value()); else if(r_constant_value.check_type()) + { literal->token = lexical_cast(r_constant_value.value()); + if(isnumrc(literal->token)) + literal->token += ".0"; + } else { r_constant = false; @@ -740,15 +757,8 @@ void ConstantFolder::visit(BinaryExpression &binary) } else if(oper=='%' || ((oper=='<' || oper=='>') && oper2==oper)) { - if(!left_value.check_type()) - return; - - if(oper=='%') - set_result(left_value.value()%r_constant_value.value()); - else if(oper=='<') - set_result(left_value.value()<()); - else if(oper=='>') - set_result(left_value.value()>>r_constant_value.value()); + if(left_value.check_type()) + set_result(evaluate_int_special_op(oper, left_value.value(), r_constant_value.value())); } }