diff --git a/libs/matdbg/include/matdbg/ShaderExtractor.h b/libs/matdbg/include/matdbg/ShaderExtractor.h index 76503c42d2..0d1848de90 100644 --- a/libs/matdbg/include/matdbg/ShaderExtractor.h +++ b/libs/matdbg/include/matdbg/ShaderExtractor.h @@ -37,7 +37,8 @@ public: Variant variant, backend::ShaderStage stage, filaflat::ShaderContent& shader) noexcept; bool getDictionary(filaflat::BlobDictionary& dictionary) noexcept; - static utils::CString spirvToGLSL(const uint32_t* data, size_t wordCount); + static utils::CString spirvToGLSL(backend::ShaderModel shaderModel, const uint32_t* data, + size_t wordCount); static utils::CString spirvToText(const uint32_t* data, size_t wordCount); private: diff --git a/libs/matdbg/src/DebugServer.cpp b/libs/matdbg/src/DebugServer.cpp index 368b3a862e..032fe5473b 100644 --- a/libs/matdbg/src/DebugServer.cpp +++ b/libs/matdbg/src/DebugServer.cpp @@ -82,8 +82,9 @@ static void spirvToAsm(struct mg_connection *conn, const uint32_t* spirv, size_t spvContextDestroy(context); } -static void spirvToGlsl(struct mg_connection *conn, const uint32_t* spirv, size_t size) { - auto glsl = ShaderExtractor::spirvToGLSL(spirv, size / 4); +static void spirvToGlsl(ShaderModel shaderModel, struct mg_connection *conn, const uint32_t* spirv, + size_t size) { + auto glsl = ShaderExtractor::spirvToGLSL(shaderModel, spirv, size / 4); mg_printf(conn, kSuccessHeader.data(), "application/txt"); mg_printf(conn, glsl.c_str(), glsl.size()); } @@ -335,7 +336,7 @@ public: } if (language == glsl) { - spirvToGlsl(conn, (const uint32_t*) content.data(), content.size()); + spirvToGlsl(item.shaderModel, conn, (const uint32_t*) content.data(), content.size()); return true; } diff --git a/libs/matdbg/src/ShaderExtractor.cpp b/libs/matdbg/src/ShaderExtractor.cpp index c89175ac85..00a87542e4 100644 --- a/libs/matdbg/src/ShaderExtractor.cpp +++ b/libs/matdbg/src/ShaderExtractor.cpp @@ -86,12 +86,18 @@ bool ShaderExtractor::getShader(ShaderModel shaderModel, uint8_t(shaderModel), variant, uint8_t(stage)); } -CString ShaderExtractor::spirvToGLSL(const uint32_t* data, size_t wordCount) { +CString ShaderExtractor::spirvToGLSL(ShaderModel shaderModel, const uint32_t* data, + size_t wordCount) { using namespace spirv_cross; CompilerGLSL::Options emitOptions; - emitOptions.es = false; - emitOptions.version = 410; + if (shaderModel == ShaderModel::MOBILE) { + emitOptions.es = true; + emitOptions.version = 310; + } else if (shaderModel == ShaderModel::DESKTOP) { + emitOptions.es = false; + emitOptions.version = 410; + } emitOptions.vulkan_semantics = true; std::vector spirv(data, data + wordCount); diff --git a/tools/matinfo/src/main.cpp b/tools/matinfo/src/main.cpp index 7fc77e61ab..15a458335b 100644 --- a/tools/matinfo/src/main.cpp +++ b/tools/matinfo/src/main.cpp @@ -210,8 +210,9 @@ static std::ifstream::pos_type getFileSize(const char* filename) { } // Consumes SPIRV binary and produces a GLSL-ES string. -static void transpileSpirv(const std::vector& spirv) { - std::cout << ShaderExtractor::spirvToGLSL(spirv.data(), spirv.size()).c_str(); +static void transpileSpirv(filament::backend::ShaderModel shaderModel, + const std::vector& spirv) { + std::cout << ShaderExtractor::spirvToGLSL(shaderModel, spirv.data(), spirv.size()).c_str(); } // Consumes SPIRV binary and produces an ordered map from "line number" to "GLSL string" where @@ -464,7 +465,7 @@ static bool parseChunks(Config config, void* data, size_t size) { const std::vector spirv(words, words + content.size() / 4); if (config.transpile) { - transpileSpirv(spirv); + transpileSpirv(item.shaderModel, spirv); } else if (config.binary) { dumpSpirvBinary(spirv, "out.spv"); } else {