summaryrefslogtreecommitdiff
path: root/source/slang-glslang
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang-glslang')
-rw-r--r--source/slang-glslang/slang-glslang.cpp31
-rw-r--r--source/slang-glslang/slang-glslang.h1
2 files changed, 32 insertions, 0 deletions
diff --git a/source/slang-glslang/slang-glslang.cpp b/source/slang-glslang/slang-glslang.cpp
index 4abcada62..ca45be05b 100644
--- a/source/slang-glslang/slang-glslang.cpp
+++ b/source/slang-glslang/slang-glslang.cpp
@@ -182,6 +182,37 @@ extern "C"
return tools.Validate(contents, contentsSize, options);
}
+// Disassemble the given SPIRV-ASM instructions.
+extern "C"
+#ifdef _MSC_VER
+ _declspec(dllexport)
+#else
+ __attribute__((__visibility__("default")))
+#endif
+ bool glslang_disassembleSPIRV(const uint32_t* contents, int contentsSize)
+{
+ static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_5;
+
+ uint32_t options = SPV_BINARY_TO_TEXT_OPTION_NONE;
+ options |= SPV_BINARY_TO_TEXT_OPTION_COMMENT;
+ options |= SPV_BINARY_TO_TEXT_OPTION_PRINT;
+ options |= SPV_BINARY_TO_TEXT_OPTION_COLOR;
+
+ spv_diagnostic diagnostic = nullptr;
+ spv_context context = spvContextCreate(kDefaultEnvironment);
+ spv_result_t error =
+ spvBinaryToText(context, contents, contentsSize, options, nullptr, &diagnostic);
+ spvContextDestroy(context);
+ if (error)
+ {
+ spvDiagnosticPrint(diagnostic);
+ spvDiagnosticDestroy(diagnostic);
+ return false;
+ }
+
+ return true;
+}
+
// Apply the SPIRV-Tools optimizer to generated SPIR-V based on the desired optimization level
// TODO: add flag for optimizing SPIR-V size as well
static void glslang_optimizeSPIRV(
diff --git a/source/slang-glslang/slang-glslang.h b/source/slang-glslang/slang-glslang.h
index cfeed975a..7b955c5af 100644
--- a/source/slang-glslang/slang-glslang.h
+++ b/source/slang-glslang/slang-glslang.h
@@ -156,5 +156,6 @@ typedef int (*glslang_CompileFunc_1_0)(glslang_CompileRequest_1_0* request);
typedef int (*glslang_CompileFunc_1_1)(glslang_CompileRequest_1_1* request);
typedef int (*glslang_CompileFunc_1_2)(glslang_CompileRequest_1_2* request);
typedef bool (*glslang_ValidateSPIRVFunc)(const uint32_t* contents, int contentsSize);
+typedef bool (*glslang_DisassembleSPIRVFunc)(const uint32_t* contents, int contentsSize);
#endif