]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programcompiler.h
Avoid some brain damage from Windows headers
[libs/gl.git] / source / programcompiler.h
index be2afab6fdd4d5746c5605aa8c1e9e1ea9707146..06306743fb7945b5f2783c70663bf11ff4a04828 100644 (file)
@@ -29,7 +29,7 @@ private:
        struct BlockModifier: Visitor
        {
                bool remove_node;
-               std::list<RefPtr<ProgramSyntax::Node> > insert_nodes;
+               std::vector<RefPtr<ProgramSyntax::Node> > insert_nodes;
 
                BlockModifier();
 
@@ -81,9 +81,9 @@ private:
        template<typename T>
        struct NodeGatherer: Visitor
        {
-               typedef std::list<T *> ResultType;
+               typedef std::vector<T *> ResultType;
 
-               std::list<T *> nodes;
+               std::vector<T *> nodes;
 
                const ResultType &get_result() const { return nodes; }
                using Visitor::visit;
@@ -169,17 +169,21 @@ private:
                        FUNCTION
                };
 
+               unsigned scope_level;
                DeclarationKind kind;
+               std::set<ProgramSyntax::Node *> ordered_funcs;
+               std::set<ProgramSyntax::Node *> needed_funcs;
 
                DeclarationReorderer();
 
                using Visitor::visit;
                virtual void visit(ProgramSyntax::Block &);
+               virtual void visit(ProgramSyntax::FunctionCall &);
                virtual void visit(ProgramSyntax::InterfaceLayout &) { kind = LAYOUT; }
                virtual void visit(ProgramSyntax::StructDeclaration &) { kind = STRUCT; }
-               virtual void visit(ProgramSyntax::VariableDeclaration &) { kind = VARIABLE; }
+               virtual void visit(ProgramSyntax::VariableDeclaration &);
                virtual void visit(ProgramSyntax::InterfaceBlock &) { kind = VARIABLE; }
-               virtual void visit(ProgramSyntax::FunctionDeclaration &) { kind = FUNCTION; }
+               virtual void visit(ProgramSyntax::FunctionDeclaration &);
        };
 
        struct InlineableFunctionLocator: Visitor
@@ -212,7 +216,9 @@ private:
                virtual void visit(ProgramSyntax::Block &);
                virtual void visit(ProgramSyntax::UnaryExpression &);
                virtual void visit(ProgramSyntax::BinaryExpression &);
+               virtual void visit(ProgramSyntax::MemberAccess &);
                virtual void visit(ProgramSyntax::FunctionCall &);
+               virtual void visit(ProgramSyntax::VariableDeclaration &);
                virtual void visit(ProgramSyntax::Return &);
        };
 
@@ -238,12 +244,14 @@ private:
        struct ConstantConditionEliminator: BlockModifier
        {
                unsigned scope_level;
+               bool record_only;
                ExpressionEvaluator::ValueMap variable_values;
 
                ConstantConditionEliminator();
 
                using Visitor::visit;
                virtual void visit(ProgramSyntax::Block &);
+               virtual void visit(ProgramSyntax::UnaryExpression &);
                virtual void visit(ProgramSyntax::Assignment &);
                virtual void visit(ProgramSyntax::VariableDeclaration &);
                virtual void visit(ProgramSyntax::Conditional &);
@@ -317,6 +325,7 @@ private:
                using Visitor::visit;
                virtual void visit(ProgramSyntax::Block &);
                virtual void visit(ProgramSyntax::VariableDeclaration &);
+               virtual void visit(ProgramSyntax::Iteration &);
        };
 
        struct PrecisionRemover: BlockModifier
@@ -357,6 +366,8 @@ private:
                bool supports_unified_sampling_functions() const;
                virtual void visit(ProgramSyntax::FunctionCall &);
                bool supports_interface_layouts() const;
+               bool supports_centroid_sampling() const;
+               bool supports_sample_sampling() const;
                virtual void visit(ProgramSyntax::VariableDeclaration &);
                bool supports_interface_blocks(const std::string &) const;
                virtual void visit(ProgramSyntax::InterfaceBlock &);