]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Add support for uint types in GLSL
[libs/gl.git] / source / glsl / optimize.cpp
index d21512f6c82e4e6bdef3ccbdf38f70cd6e018e66..0139ec5fbec94d4f1c47493549914d8977b2af8e 100644 (file)
@@ -611,6 +611,8 @@ void ConstantFolder::convert_to_result(const Variant &value)
                set_result(static_cast<T>(value.value<bool>()));
        else if(value.check_type<int>())
                set_result(static_cast<T>(value.value<int>()));
+       else if(value.check_type<unsigned>())
+               set_result(static_cast<T>(value.value<unsigned>()));
        else if(value.check_type<float>())
                set_result(static_cast<T>(value.value<float>()));
 }
@@ -640,6 +642,8 @@ void ConstantFolder::visit(RefPtr<Expression> &expr)
                literal->token = (r_constant_value.value<bool>() ? "true" : "false");
        else if(r_constant_value.check_type<int>())
                literal->token = lexical_cast<string>(r_constant_value.value<int>());
+       else if(r_constant_value.check_type<unsigned>())
+               literal->token = lexical_cast<string>(r_constant_value.value<unsigned>())+"u";
        else if(r_constant_value.check_type<float>())
        {
                literal->token = lexical_cast<string>(r_constant_value.value<float>());
@@ -744,11 +748,15 @@ void ConstantFolder::visit(BinaryExpression &binary)
                        set_result(evaluate_logical(oper, left_value.value<bool>(), r_constant_value.value<bool>()));
                else if(!oper2 && left_value.check_type<int>())
                        set_result(evaluate_logical(oper, left_value.value<int>(), r_constant_value.value<int>()));
+               else if(!oper2 && left_value.check_type<unsigned>())
+                       set_result(evaluate_logical(oper, left_value.value<unsigned>(), r_constant_value.value<unsigned>()));
        }
        else if((oper=='<' || oper=='>') && oper2!=oper)
        {
                if(left_value.check_type<int>())
                        set_result(evaluate_relation(binary.oper->token, left_value.value<int>(), r_constant_value.value<int>()));
+               else if(left_value.check_type<unsigned>())
+                       set_result(evaluate_relation(binary.oper->token, left_value.value<unsigned>(), r_constant_value.value<unsigned>()));
                else if(left_value.check_type<float>())
                        set_result(evaluate_relation(binary.oper->token, left_value.value<float>(), r_constant_value.value<float>()));
        }
@@ -756,13 +764,17 @@ void ConstantFolder::visit(BinaryExpression &binary)
        {
                if(left_value.check_type<int>())
                        set_result((left_value.value<int>()==r_constant_value.value<int>()) == (oper=='='));
-               if(left_value.check_type<float>())
+               else if(left_value.check_type<unsigned>())
+                       set_result((left_value.value<unsigned>()==r_constant_value.value<unsigned>()) == (oper=='='));
+               else if(left_value.check_type<float>())
                        set_result((left_value.value<float>()==r_constant_value.value<float>()) == (oper=='='));
        }
        else if(oper=='+' || oper=='-' || oper=='*' || oper=='/')
        {
                if(left_value.check_type<int>())
                        set_result(evaluate_arithmetic(oper, left_value.value<int>(), r_constant_value.value<int>()));
+               else if(left_value.check_type<unsigned>())
+                       set_result(evaluate_arithmetic(oper, left_value.value<unsigned>(), r_constant_value.value<unsigned>()));
                else if(left_value.check_type<float>())
                        set_result(evaluate_arithmetic(oper, left_value.value<float>(), r_constant_value.value<float>()));
        }
@@ -770,6 +782,8 @@ void ConstantFolder::visit(BinaryExpression &binary)
        {
                if(left_value.check_type<int>())
                        set_result(evaluate_int_special_op(oper, left_value.value<int>(), r_constant_value.value<int>()));
+               else if(left_value.check_type<unsigned>())
+                       set_result(evaluate_int_special_op(oper, left_value.value<unsigned>(), r_constant_value.value<unsigned>()));
        }
 }
 
@@ -800,8 +814,10 @@ void ConstantFolder::visit(FunctionCall &call)
 
                        if(basic->kind==BasicTypeDeclaration::BOOL)
                                convert_to_result<bool>(r_constant_value);
-                       else if(basic->kind==BasicTypeDeclaration::INT && basic->size==32)
+                       else if(basic->kind==BasicTypeDeclaration::INT && basic->size==32 && basic->sign)
                                convert_to_result<int>(r_constant_value);
+                       else if(basic->kind==BasicTypeDeclaration::INT && basic->size==32 && !basic->sign)
+                               convert_to_result<unsigned>(r_constant_value);
                        else if(basic->kind==BasicTypeDeclaration::FLOAT && basic->size==32)
                                convert_to_result<float>(r_constant_value);