]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/generate.h
Resolve and validate the parameters of constructors in GLSL
[libs/gl.git] / source / glsl / generate.h
index 0a940cea5599a8f1381aadf6b9051989ac607a29..58bc4ca202e6bdbf60f5d625c1f5b5ba2004ef14 100644 (file)
@@ -11,23 +11,6 @@ namespace Msp {
 namespace GL {
 namespace SL {
 
-/** Combines multiple declarations of the same identifier into one. */
-class DeclarationCombiner: private TraversingVisitor
-{
-private:
-       std::map<std::string, std::vector<FunctionDeclaration *> > functions;
-       std::map<std::string, VariableDeclaration *> variables;
-       std::set<Node *> nodes_to_remove;
-
-public:
-       void apply(Stage &);
-
-private:
-       virtual void visit(Block &);
-       virtual void visit(VariableDeclaration &);
-       virtual void visit(FunctionDeclaration &) { }
-};
-
 /** Manipulates specialization constants.  If values are specified, turns
 specialization constants into normal constants.  Without values assigns
 automatic constant_ids to specialization constants. */
@@ -99,6 +82,8 @@ private:
        bool record_target;
        bool r_self_referencing;
        Assignment::Target r_assignment_target;
+       std::vector<VariableDeclaration *> redeclared_builtins;
+       std::set<Node *> nodes_to_remove;
 
 public:
        VariableResolver();
@@ -116,6 +101,7 @@ private:
        virtual void visit(Swizzle &);
        virtual void visit(BinaryExpression &);
        virtual void visit(Assignment &);
+       void merge_layouts(Layout &, const Layout &);
        virtual void visit(VariableDeclaration &);
        virtual void visit(InterfaceBlock &);
 };
@@ -132,8 +118,15 @@ private:
                SAME_TYPE
        };
 
+       struct ArgumentInfo
+       {
+               BasicTypeDeclaration *type;
+               unsigned component_count;
+       };
+
        Stage *stage;
        std::vector<BasicTypeDeclaration *> basic_types;
+       NodeList<Statement>::iterator insert_point;
        bool r_any_resolved;
 
 public:
@@ -151,10 +144,11 @@ private:
        BasicTypeDeclaration *find_type(BasicTypeDeclaration &, BasicTypeDeclaration::Kind, unsigned);
        void convert_to(RefPtr<Expression> &, BasicTypeDeclaration &);
        bool convert_to_element(RefPtr<Expression> &, BasicTypeDeclaration &);
+       bool truncate_vector(RefPtr<Expression> &, unsigned);
        void resolve(Expression &, TypeDeclaration *, bool);
 
+       virtual void visit(Block &);
        virtual void visit(Literal &);
-       virtual void visit(ParenthesizedExpression &);
        virtual void visit(VariableReference &);
        virtual void visit(InterfaceBlockReference &);
        virtual void visit(MemberAccess &);
@@ -164,6 +158,7 @@ private:
        virtual void visit(BinaryExpression &);
        virtual void visit(Assignment &);
        virtual void visit(TernaryExpression &);
+       void visit_constructor(FunctionCall &);
        virtual void visit(FunctionCall &);
        virtual void visit(BasicTypeDeclaration &);
        virtual void visit(VariableDeclaration &);