X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=tests%2Fglsl%2Fglslcompiler.cpp;h=e4b36a398e6b88ca965098b3d3a8a3ed37902e64;hb=12a95b6552d6c67d68ea8aca2561abf3fb2b80e6;hp=01c1fba28e2e4fe90d0f2268a485538fd671f258;hpb=7563b92050d7c249c9ce848c1310dbfb993eadb7;p=libs%2Fgl.git diff --git a/tests/glsl/glslcompiler.cpp b/tests/glsl/glslcompiler.cpp index 01c1fba2..e4b36a39 100644 --- a/tests/glsl/glslcompiler.cpp +++ b/tests/glsl/glslcompiler.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -58,13 +59,29 @@ private: virtual void fail(const std::string &m) { Test::fail(m); } }; +class GlslCompilerSpirV: public Msp::Test::RegisteredTest, private GlslCompilerHelper +{ +private: + spvtools::SpirvTools spirv_tools; + +public: + GlslCompilerSpirV(); + + static const char *get_name() { return "GLSL to SPIR-V compilation"; } + +private: + void run_test_case(const TestCase *); + void diagnostic(spv_message_level_t, const char *, const spv_position_t &, const char *); + virtual void fail(const std::string &m) { Test::fail(m); } +}; + using namespace std; using namespace Msp; void GlslCompilerHelper::load_all_test_cases(const FS::Path &tests_dir) { - list test_files = FS::list_filtered(tests_dir, "\\.glsl$"); - test_files.sort(); + vector test_files = FS::list_filtered(tests_dir, "\\.glsl$"); + sort(test_files); for(const auto &fn: test_files) load_test_case((tests_dir/fn).str()); } @@ -318,3 +335,41 @@ void GlslCompilerIdempotence::run_test_case(const TestCase *test_case) if(j!=stages2.end()) fail(format("Second pass produced extra stage %s", GL::SL::Stage::get_stage_name(*j))); } + + +GlslCompilerSpirV::GlslCompilerSpirV(): + spirv_tools(SPV_ENV_UNIVERSAL_1_5) +{ + load_all_test_cases("glsl"); + for(const auto &tc: test_cases) + if(tc.expect_success) + add(&GlslCompilerSpirV::run_test_case, &tc, tc.name); + + using namespace std::placeholders; + spirv_tools.SetMessageConsumer(std::bind(std::mem_fn(&GlslCompilerSpirV::diagnostic), this, _1, _2, _3, _4)); +} + +void GlslCompilerSpirV::run_test_case(const TestCase *test_case) +{ + GL::SL::Compiler compiler(GL::SL::Features::latest()); + compiler.set_source(test_case->source, ""); + compiler.compile(GL::SL::Compiler::SPIRV); + + vector code = compiler.get_combined_spirv(); + if(!spirv_tools.Validate(code)) + fail("Invalid SPIR-V generated"); +} + +void GlslCompilerSpirV::diagnostic(spv_message_level_t level, const char *, const spv_position_t &, const char *message) +{ + const char *prefix; + switch(level) + { + case SPV_MSG_DEBUG: prefix = "debug: "; break; + case SPV_MSG_INFO: prefix = "info: "; break; + case SPV_MSG_WARNING: prefix = "warning: "; break; + case SPV_MSG_ERROR: prefix = "error: "; break; + default: prefix = ""; + } + info(format("%s%s", prefix, message)); +}