]> git.tdb.fi Git - libs/gl.git/commitdiff
Add idempotence test cases for GLSL compiler
authorMikko Rasa <tdb@tdb.fi>
Tue, 16 Mar 2021 18:05:24 +0000 (20:05 +0200)
committerMikko Rasa <tdb@tdb.fi>
Tue, 16 Mar 2021 18:05:24 +0000 (20:05 +0200)
Already compiled GLSL code should not change when passed through the
compiler again.

tests/glsl/glslcompiler.cpp

index 0fd0855489d63ca4f6a5de05c30c0615a9307c89..371df6cc48f0fd1d738681627b4b7399e996c2ba 100644 (file)
@@ -43,6 +43,18 @@ private:
        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;
 
@@ -259,3 +271,42 @@ void GlslCompilerTest::run_test_case(const TestCase *test_case)
                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)));
+}