+++ /dev/null
-#ifndef MSP_GL_PROGRAMCOMPILER_H_
-#define MSP_GL_PROGRAMCOMPILER_H_
-
-#include <set>
-#include "programparser.h"
-#include "programsyntax.h"
-
-namespace Msp {
-namespace GL {
-
-class Program;
-class Resources;
-
-class ProgramCompiler
-{
-private:
- struct Visitor: ProgramSyntax::TraversingVisitor
- {
- typedef void ResultType;
-
- ProgramSyntax::Stage *stage;
-
- Visitor();
-
- virtual void apply(ProgramSyntax::Stage &);
- void get_result() const { }
- };
-
- struct BlockModifier: Visitor
- {
- bool remove_node;
- std::vector<RefPtr<ProgramSyntax::Node> > insert_nodes;
-
- BlockModifier();
-
- void flatten_block(ProgramSyntax::Block &);
- void apply_and_increment(ProgramSyntax::Block &, std::list<RefPtr<ProgramSyntax::Node> >::iterator &);
- using Visitor::visit;
- virtual void visit(ProgramSyntax::Block &);
- };
-
- struct Formatter: Visitor
- {
- typedef std::string ResultType;
-
- std::string formatted;
- unsigned indent;
- bool parameter_list;
- unsigned else_if;
- std::string block_interface;
-
- Formatter();
-
- virtual void apply(ProgramSyntax::Stage &);
- const std::string &get_result() const { return formatted; }
- using Visitor::visit;
- virtual void visit(ProgramSyntax::Block &);
- virtual void visit(ProgramSyntax::Literal &);
- virtual void visit(ProgramSyntax::ParenthesizedExpression &);
- virtual void visit(ProgramSyntax::VariableReference &);
- virtual void visit(ProgramSyntax::MemberAccess &);
- virtual void visit(ProgramSyntax::UnaryExpression &);
- virtual void visit(ProgramSyntax::BinaryExpression &);
- virtual void visit(ProgramSyntax::Assignment &);
- virtual void visit(ProgramSyntax::FunctionCall &);
- virtual void visit(ProgramSyntax::ExpressionStatement &);
- virtual void visit(ProgramSyntax::Import &);
- virtual void visit(ProgramSyntax::Precision &);
- virtual void visit(ProgramSyntax::Layout &);
- virtual void visit(ProgramSyntax::InterfaceLayout &);
- virtual void visit(ProgramSyntax::StructDeclaration &);
- virtual void visit(ProgramSyntax::VariableDeclaration &);
- virtual void visit(ProgramSyntax::InterfaceBlock &);
- virtual void visit(ProgramSyntax::FunctionDeclaration &);
- virtual void visit(ProgramSyntax::Conditional &);
- virtual void visit(ProgramSyntax::Iteration &);
- virtual void visit(ProgramSyntax::Return &);
- virtual void visit(ProgramSyntax::Jump &);
- };
-
- template<typename T>
- struct NodeGatherer: Visitor
- {
- typedef std::vector<T *> ResultType;
-
- std::vector<T *> nodes;
-
- const ResultType &get_result() const { return nodes; }
- using Visitor::visit;
- virtual void visit(T &n) { nodes.push_back(&n); }
- };
-
- struct DeclarationCombiner: BlockModifier
- {
- bool toplevel;
- std::map<std::string, std::vector<ProgramSyntax::FunctionDeclaration *> > functions;
- std::map<std::string, ProgramSyntax::VariableDeclaration *> variables;
-
- DeclarationCombiner();
-
- using Visitor::visit;
- virtual void visit(ProgramSyntax::Block &);
- virtual void visit(ProgramSyntax::FunctionDeclaration &);
- virtual void visit(ProgramSyntax::VariableDeclaration &);
- };
-
- struct VariableResolver: Visitor
- {
- std::vector<ProgramSyntax::Block *> blocks;
- ProgramSyntax::StructDeclaration *type;
- bool anonymous;
- std::string block_interface;
- bool record_target;
- ProgramSyntax::VariableDeclaration *assignment_target;
- bool self_referencing;
-
- VariableResolver();
-
- virtual void apply(ProgramSyntax::Stage &);
- using Visitor::visit;
- virtual void visit(ProgramSyntax::Block &);
- virtual void visit(ProgramSyntax::VariableReference &);
- virtual void visit(ProgramSyntax::MemberAccess &);
- virtual void visit(ProgramSyntax::BinaryExpression &);
- virtual void visit(ProgramSyntax::Assignment &);
- virtual void visit(ProgramSyntax::StructDeclaration &);
- virtual void visit(ProgramSyntax::VariableDeclaration &);
- virtual void visit(ProgramSyntax::InterfaceBlock &);
- };
-
- struct FunctionResolver: Visitor
- {
- std::map<std::string, std::vector<ProgramSyntax::FunctionDeclaration *> > functions;
-
- using Visitor::visit;
- virtual void visit(ProgramSyntax::FunctionCall &);
- virtual void visit(ProgramSyntax::FunctionDeclaration &);
- };
-
- struct InterfaceGenerator: BlockModifier
- {
- std::string in_prefix;
- std::string out_prefix;
- unsigned scope_level;
- std::map<std::string, RefPtr<ProgramSyntax::VariableDeclaration> > iface_declarations;
-
- InterfaceGenerator();
-
- static std::string get_out_prefix(ProgramSyntax::StageType);
- virtual void apply(ProgramSyntax::Stage &);
- using Visitor::visit;
- virtual void visit(ProgramSyntax::Block &);
- std::string change_prefix(const std::string &, const std::string &) const;
- bool generate_interface(ProgramSyntax::VariableDeclaration &, const std::string &, const std::string &);
- void insert_assignment(const std::string &, ProgramSyntax::Expression *);
- virtual void visit(ProgramSyntax::VariableReference &);
- virtual void visit(ProgramSyntax::VariableDeclaration &);
- virtual void visit(ProgramSyntax::Passthrough &);
- };
-
- struct DeclarationReorderer: Visitor
- {
- enum DeclarationKind
- {
- NO_DECLARATION,
- LAYOUT,
- STRUCT,
- VARIABLE,
- 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 &);
- virtual void visit(ProgramSyntax::InterfaceBlock &) { kind = VARIABLE; }
- virtual void visit(ProgramSyntax::FunctionDeclaration &);
- };
-
- struct InlineableFunctionLocator: Visitor
- {
- typedef std::set<ProgramSyntax::FunctionDeclaration *> ResultType;
-
- std::map<ProgramSyntax::FunctionDeclaration *, unsigned> refcounts;
- std::set<ProgramSyntax::FunctionDeclaration *> inlineable;
- ProgramSyntax::FunctionDeclaration *in_function;
-
- InlineableFunctionLocator();
-
- const ResultType &get_result() const { return inlineable; }
- using Visitor::visit;
- virtual void visit(ProgramSyntax::FunctionCall &);
- virtual void visit(ProgramSyntax::FunctionDeclaration &);
- };
-
- struct FunctionInliner: Visitor
- {
- std::set<ProgramSyntax::FunctionDeclaration *> inlineable;
- unsigned extract_result;
- RefPtr<ProgramSyntax::Expression> inline_result;
-
- FunctionInliner();
- FunctionInliner(const std::set<ProgramSyntax::FunctionDeclaration *> &);
-
- void visit_and_inline(RefPtr<ProgramSyntax::Expression> &);
- using Visitor::visit;
- 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 &);
- };
-
- struct ExpressionEvaluator: ProgramSyntax::NodeVisitor
- {
- typedef std::map<ProgramSyntax::VariableDeclaration *, ProgramSyntax::Expression *> ValueMap;
-
- const ValueMap *variable_values;
- float result;
- bool result_valid;
-
- ExpressionEvaluator();
- ExpressionEvaluator(const ValueMap &);
-
- using ProgramSyntax::NodeVisitor::visit;
- virtual void visit(ProgramSyntax::Literal &);
- virtual void visit(ProgramSyntax::ParenthesizedExpression &);
- virtual void visit(ProgramSyntax::VariableReference &);
- virtual void visit(ProgramSyntax::UnaryExpression &);
- virtual void visit(ProgramSyntax::BinaryExpression &);
- };
-
- 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 &);
- virtual void visit(ProgramSyntax::Iteration &);
- };
-
- struct UnusedVariableLocator: Visitor
- {
- struct VariableInfo
- {
- bool local;
- std::vector<ProgramSyntax::Node *> assignments;
- bool conditionally_assigned;
- bool referenced;
-
- VariableInfo();
- };
-
- typedef std::set<ProgramSyntax::Node *> ResultType;
- typedef std::map<ProgramSyntax::VariableDeclaration *, VariableInfo> BlockVariableMap;
-
- std::set<ProgramSyntax::Node *> unused_nodes;
- std::map<ProgramSyntax::VariableDeclaration *, ProgramSyntax::Node *> aggregates;
- ProgramSyntax::Node *aggregate;
- std::vector<BlockVariableMap> variables;
- ProgramSyntax::Assignment *assignment;
- bool assignment_target;
- bool global_scope;
-
- UnusedVariableLocator();
-
- virtual void apply(ProgramSyntax::Stage &);
- const ResultType &get_result() const { return unused_nodes; }
- using Visitor::visit;
- virtual void visit(ProgramSyntax::VariableReference &);
- virtual void visit(ProgramSyntax::MemberAccess &);
- virtual void visit(ProgramSyntax::BinaryExpression &);
- virtual void visit(ProgramSyntax::Assignment &);
- void record_assignment(ProgramSyntax::VariableDeclaration &, ProgramSyntax::Node &, bool);
- void clear_assignments(VariableInfo &, bool);
- virtual void visit(ProgramSyntax::ExpressionStatement &);
- virtual void visit(ProgramSyntax::StructDeclaration &);
- virtual void visit(ProgramSyntax::VariableDeclaration &);
- virtual void visit(ProgramSyntax::InterfaceBlock &);
- virtual void visit(ProgramSyntax::FunctionDeclaration &);
- void merge_down_variables();
- virtual void visit(ProgramSyntax::Conditional &);
- virtual void visit(ProgramSyntax::Iteration &);
- };
-
- struct UnusedFunctionLocator: Visitor
- {
- typedef std::set<ProgramSyntax::Node *> ResultType;
-
- std::set<ProgramSyntax::Node *> unused_nodes;
- std::set<ProgramSyntax::FunctionDeclaration *> used_definitions;
-
- const ResultType &get_result() const { return unused_nodes; }
- using Visitor::visit;
- virtual void visit(ProgramSyntax::FunctionCall &);
- virtual void visit(ProgramSyntax::FunctionDeclaration &);
- };
-
- struct NodeRemover: Visitor
- {
- std::set<ProgramSyntax::Node *> to_remove;
-
- NodeRemover() { }
- NodeRemover(const std::set<ProgramSyntax::Node *> &);
-
- using Visitor::visit;
- virtual void visit(ProgramSyntax::Block &);
- virtual void visit(ProgramSyntax::VariableDeclaration &);
- virtual void visit(ProgramSyntax::Iteration &);
- };
-
- struct PrecisionRemover: BlockModifier
- {
- using Visitor::visit;
- virtual void visit(ProgramSyntax::Precision &);
- virtual void visit(ProgramSyntax::VariableDeclaration &);
- };
-
- struct DefaultPrecisionGenerator: BlockModifier
- {
- bool toplevel;
- std::set<std::string> have_default;
-
- DefaultPrecisionGenerator();
-
- using Visitor::visit;
- virtual void visit(ProgramSyntax::Block &);
- virtual void visit(ProgramSyntax::Precision &);
- virtual void visit(ProgramSyntax::VariableDeclaration &);
- };
-
- struct LegacyConverter: BlockModifier
- {
- GLApi target_api;
- Version target_version;
- std::string type;
- ProgramSyntax::VariableDeclaration *frag_out;
-
- LegacyConverter();
- LegacyConverter(const Version &);
-
- bool check_version(const Version &) const;
- using Visitor::visit;
- bool supports_unified_interface_syntax() const;
- virtual void visit(ProgramSyntax::VariableReference &);
- virtual void visit(ProgramSyntax::Assignment &);
- 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 &);
- };
-
- Resources *resources;
- ProgramSyntax::Module *module;
- std::set<std::string> imported_names;
-
-public:
- ProgramCompiler();
- ~ProgramCompiler();
-
- void compile(const std::string &, const std::string & = "<string>");
- void compile(IO::Base &, Resources * = 0, const std::string & = "<file>");
- void compile(IO::Base &, const std::string &);
- void add_shaders(Program &);
-
-private:
- static ProgramSyntax::Module *create_builtins_module();
- static ProgramSyntax::Module &get_builtins_module();
- static ProgramSyntax::Stage *get_builtins(ProgramSyntax::StageType);
- void append_module(ProgramSyntax::Module &);
- void append_stage(ProgramSyntax::Stage &);
- void process();
- void import(const std::string &);
- void generate(ProgramSyntax::Stage &);
- bool optimize(ProgramSyntax::Stage &);
- void finalize(ProgramSyntax::Stage &);
- static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &);
- template<typename T>
- static typename T::ResultType apply(ProgramSyntax::Stage &);
- template<typename T, typename A>
- static typename T::ResultType apply(ProgramSyntax::Stage &, const A &);
-};
-
-} // namespace GL
-} // namespace Msp
-
-#endif