virtual void fail(const std::string &m) { Test::fail(m); }
};
+class GlslCompilerIdempotence: public Msp::Test::RegisteredTest<GlslCompilerIdempotence>, private GlslCompilerHelper
+{
+public:
+ GlslCompilerIdempotence();
+
+ static const char *get_name() { return "GLSL compiler idempotence"; }
+
+private:
+ void run_test_case(const TestCase *);
+ virtual void fail(const std::string &m) { Test::fail(m); }
+};
+
using namespace std;
using namespace Msp;
if(find(stages, s.first)==stages.end())
fail(format("Compiler didn't produce stage %s", GL::SL::Stage::get_stage_name(s.first)));
}
+
+
+GlslCompilerIdempotence::GlslCompilerIdempotence()
+{
+ load_all_test_cases("glsl");
+ for(const auto &tc: test_cases)
+ if(tc.expected_error.empty())
+ add(&GlslCompilerIdempotence::run_test_case, &tc, tc.name);
+}
+
+void GlslCompilerIdempotence::run_test_case(const TestCase *test_case)
+{
+ GL::SL::Compiler compiler(GL::SL::Features::all());
+ compiler.set_source(test_case->source, "<test>");
+ if(test_case->compile_mode==GL::SL::Compiler::PROGRAM)
+ compiler.specialize(test_case->spec_values);
+ compiler.compile(test_case->compile_mode);
+
+ GL::SL::Compiler compiler2(GL::SL::Features::all());
+ compiler2.set_source(compiler.get_combined_glsl(), "<loopback>");
+ compiler2.compile(test_case->compile_mode);
+
+ auto stages = compiler.get_stages();
+ auto stages2 = compiler2.get_stages();
+ auto i = stages.begin();
+ auto j = stages2.begin();
+ for(; (i!=stages.end() && j!=stages2.end() && *i==*j); ++i, ++j)
+ {
+ string output = compiler.get_stage_glsl(*i);
+ string output2 = compiler2.get_stage_glsl(*j);
+
+ verify_output(output2, output);
+ }
+
+ if(i!=stages.end())
+ fail(format("Second pass didn't produce stage %s", GL::SL::Stage::get_stage_name(*i)));
+ if(j!=stages2.end())
+ fail(format("Second pass produced extra stage %s", GL::SL::Stage::get_stage_name(*j)));
+}