]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/syntax.cpp
Mark constant data as const
[libs/gl.git] / source / glsl / syntax.cpp
index d0273909d68db900e0d95e79c08f1d2cf9f140cd..bb8d7dab046f2ea1293927d93aa3e415818e12d4 100644 (file)
@@ -1,3 +1,4 @@
+#include <msp/core/algorithm.h>
 #include <msp/core/maputils.h>
 #include "syntax.h"
 #include "visitor.h"
@@ -69,8 +70,8 @@ template<typename C>
 NodeContainer<C>::NodeContainer(const NodeContainer &c):
        C(c)
 {
-       for(typename C::iterator i=this->begin(); i!=this->end(); ++i)
-               *i = (*i)->clone();
+       for(auto &i: *this)
+               i = i->clone();
 }
 
 
@@ -138,14 +139,16 @@ void InterfaceBlockReference::visit(NodeVisitor &visitor)
 
 
 MemberAccess::MemberAccess():
-       declaration(0)
+       declaration(0),
+       index(-1)
 { }
 
 MemberAccess::MemberAccess(const MemberAccess &other):
        Expression(other),
        left(other.left),
        member(other.member),
-       declaration(0)
+       declaration(0),
+       index(-1)
 { }
 
 void MemberAccess::visit(NodeVisitor &visitor)
@@ -269,6 +272,7 @@ void InterfaceLayout::visit(NodeVisitor &visitor)
 BasicTypeDeclaration::BasicTypeDeclaration():
        kind(ALIAS),
        size(0),
+       sign(true),
        base_type(0)
 { }
 
@@ -276,6 +280,7 @@ BasicTypeDeclaration::BasicTypeDeclaration(const BasicTypeDeclaration &other):
        TypeDeclaration(other),
        kind(other.kind),
        size(other.size),
+       sign(other.sign),
        base(other.base),
        base_type(0)
 { }
@@ -455,7 +460,7 @@ Stage::Stage(Stage::Type t):
 
 const char *Stage::get_stage_name(Type type)
 {
-       static const char *names[] = { "shared", "vertex", "geometry", "fragment" };
+       static const char *const names[] = { "shared", "vertex", "geometry", "fragment" };
        return names[type];
 }
 
@@ -485,72 +490,17 @@ string get_unused_variable_name(const Block &block, const string &base)
        }
 }
 
-bool is_same_type(const TypeDeclaration &type1, const TypeDeclaration &type2)
+int get_layout_value(const Layout &layout, const string &name, int def_value)
 {
-       if(const BasicTypeDeclaration *basic1 = dynamic_cast<const BasicTypeDeclaration *>(&type1))
-       {
-               const BasicTypeDeclaration *basic2 = dynamic_cast<const BasicTypeDeclaration *>(&type2);
-               if(!basic2)
-                       return false;
-
-               if(basic1->kind!=basic2->kind || basic1->size!=basic2->size)
-                       return false;
-
-               if(basic1->base_type && basic2->base_type)
-                       return is_same_type(*basic1->base_type, *basic2->base_type);
-               else
-                       return (!basic1->base_type && !basic2->base_type);
-       }
-       else if(const ImageTypeDeclaration *image1 = dynamic_cast<const ImageTypeDeclaration *>(&type1))
-       {
-               const ImageTypeDeclaration *image2 = dynamic_cast<const ImageTypeDeclaration *>(&type2);
-               if(!image2)
-                       return false;
-
-               if(image1->dimensions!=image2->dimensions || image1->array!=image2->array)
-                       return false;
-               if(image1->sampled!=image2->sampled || image1->shadow!=image2->shadow)
-                       return false;
-
-               if(image1->base_type && image2->base_type)
-                       return is_same_type(*image1->base_type, *image2->base_type);
-               else
-                       return (!image1->base_type && !image2->base_type);
-       }
-       else if(const StructDeclaration *strct1 = dynamic_cast<const StructDeclaration *>(&type1))
-       {
-               const StructDeclaration *strct2 = dynamic_cast<const StructDeclaration *>(&type2);
-               if(!strct2)
-                       return false;
-
-               NodeList<Statement>::const_iterator i = strct1->members.body.begin();
-               NodeList<Statement>::const_iterator j = strct2->members.body.begin();
-               for(; (i!=strct1->members.body.end() && j!=strct2->members.body.end()); ++i, ++j)
-               {
-                       const VariableDeclaration *var1 = dynamic_cast<const VariableDeclaration *>(i->get());
-                       const VariableDeclaration *var2 = dynamic_cast<const VariableDeclaration *>(j->get());
-                       if(!var1 || !var1->type_declaration || !var2 || !var2->type_declaration)
-                               return false;
-                       if(!is_same_type(*var1->type_declaration, *var2->type_declaration))
-                               return false;
-                       if(var1->name!=var2->name || var1->array!=var2->array)
-                               return false;
-                       // TODO Compare array sizes
-                       // TODO Compare layout qualifiers for interface block members
-               }
-
-               return (i==strct1->members.body.end() && j==strct2->members.body.end());
-       }
-       else
-               return false;
+       auto i = find_member(layout.qualifiers, name, &Layout::Qualifier::name);
+       return (i!=layout.qualifiers.end() ? i->value : def_value);
 }
 
-int get_layout_value(const Layout &layout, const string &name, int def_value)
+void add_to_chain(Assignment::Target &target, Assignment::Target::ChainType type, unsigned index)
 {
-       for(vector<Layout::Qualifier>::const_iterator i=layout.qualifiers.begin(); i!=layout.qualifiers.end(); ++i)
-               if(i->name==name)
-                       return i->value;
-       return def_value;
+       if(target.chain_len<7)
+               target.chain[target.chain_len] = type | min<unsigned>(index, 0x3F);
+       ++target.chain_len;
 }
 
 } // namespace SL