X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fcompatibility.h;h=212007131e80a3d0e37173364005d68f3b8d1166;hb=c315e77b7791fe92d42e1566b5adaddf2699a758;hp=fdbd3d07fb304c0c79202445f4df04befaef9a58;hpb=0ca367ce305ae6f2025739b3b199a7f75d4132db;p=libs%2Fgl.git diff --git a/source/glsl/compatibility.h b/source/glsl/compatibility.h index fdbd3d07..21200713 100644 --- a/source/glsl/compatibility.h +++ b/source/glsl/compatibility.h @@ -8,12 +8,14 @@ namespace Msp { namespace GL { namespace SL { -class DefaultPrecisionGenerator: private BlockModifier +/** Generates default precision declarations if they are missing, to satisfy +GLSL ES requirements. */ +class DefaultPrecisionGenerator: private TraversingVisitor { private: - Stage::Type stage_type; - bool toplevel; + Stage *stage; std::set have_default; + NodeList::iterator insert_point; public: DefaultPrecisionGenerator(); @@ -24,38 +26,47 @@ private: virtual void visit(Block &); virtual void visit(Precision &); virtual void visit(VariableDeclaration &); - using BlockModifier::visit; }; -class PrecisionRemover: private BlockModifier +/** Removes precision qualifiers from variable declarations, as well as +default precision declarations. */ +class PrecisionRemover: private TraversingVisitor { +private: + std::set nodes_to_remove; + public: - void apply(Stage &s) { visit(s.content); } + void apply(Stage &); private: virtual void visit(Precision &); virtual void visit(VariableDeclaration &); - using BlockModifier::visit; }; -class LegacyConverter: private BlockModifier +/** Converts structures of the syntax tree to match a particular set of +features. */ +class LegacyConverter: private TraversingVisitor { private: Stage *stage; - GLApi target_api; - Version target_version; - std::string type; + Features features; + std::string r_type; VariableDeclaration *frag_out; + NodeList::iterator uniform_insert_point; + std::set nodes_to_remove; public: LegacyConverter(); - LegacyConverter(const Version &); - virtual void apply(Stage &); + virtual void apply(Stage &, const Features &); private: + void unsupported(const std::string &); + + virtual void visit(Block &); bool check_version(const Version &) const; - bool check_extension(const Extension &) const; + bool check_extension(bool Features::*) const; + bool supports_stage(Stage::Type) const; bool supports_unified_interface_syntax() const; virtual void visit(VariableReference &); virtual void visit(Assignment &); @@ -67,7 +78,6 @@ private: virtual void visit(VariableDeclaration &); bool supports_interface_blocks(const std::string &) const; virtual void visit(InterfaceBlock &); - using BlockModifier::visit; }; } // namespace SL