From d3956adca8db59e81031aa0ed1696f2916e04983 Mon Sep 17 00:00:00 2001 From: Ben Doherty Date: Thu, 26 Jan 2023 11:30:51 -0800 Subject: [PATCH] matdbg: take desktop/mobile into account for SPIR-V to GLSL translation (#6488) --- libs/matdbg/include/matdbg/ShaderExtractor.h | 3 ++- libs/matdbg/src/DebugServer.cpp | 7 ++++--- libs/matdbg/src/ShaderExtractor.cpp | 12 +++++++++--- tools/matinfo/src/main.cpp | 7 ++++--- 4 files changed, 19 insertions(+), 10 deletions(-) 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 {