+ 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 &);
+ };
+