summaryrefslogtreecommitdiff
path: root/source/slang-glslang
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-10-09 14:03:43 -0700
committerGitHub <noreply@github.com>2023-10-09 14:03:43 -0700
commit67e186f0169591c48d24bd8ff7e4e4e715e8fa45 (patch)
tree9b46dc35145d18d5b25d9b3b16759c9b7343615c /source/slang-glslang
parent17c7163c2ae8fc290e70b43d8700b68ef18b1ee1 (diff)
Run curated spirv-opt passes through slang-glslang. (#3266)
* Run curated spirv-opt passes through slang-glslang. * Cleanup. * Replace spirv-dis downstream compiler with glslang. * delete slang-spirv-opt.cpp. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang-glslang')
-rw-r--r--source/slang-glslang/slang-glslang.cpp30
-rw-r--r--source/slang-glslang/slang-glslang.h8
2 files changed, 34 insertions, 4 deletions
diff --git a/source/slang-glslang/slang-glslang.cpp b/source/slang-glslang/slang-glslang.cpp
index 32834232f..fcaa9e70d 100644
--- a/source/slang-glslang/slang-glslang.cpp
+++ b/source/slang-glslang/slang-glslang.cpp
@@ -413,6 +413,32 @@ static void glslang_optimizeSPIRV(spv_target_env targetEnv, const glslang_Compil
}
}
+static int spirv_Optimize_1_2(const glslang_CompileRequest_1_2& request)
+{
+ std::vector<SPIRVOptimizationDiagnostic> diagnostics;
+ std::vector<uint32_t> spirvBuffer;
+ size_t inputBlobSize = (char*)request.inputEnd - (char*)request.inputBegin;
+ spirvBuffer.resize(inputBlobSize / sizeof(uint32_t));
+ memcpy(spirvBuffer.data(), request.inputBegin, inputBlobSize);
+
+ glslang_optimizeSPIRV(SPV_ENV_UNIVERSAL_1_5, request, diagnostics, spirvBuffer);
+ if (request.outputFunc)
+ {
+ request.outputFunc(spirvBuffer.data(), spirvBuffer.size() * sizeof(uint32_t), request.outputUserData);
+ }
+ if (request.diagnosticFunc)
+ {
+ for (auto& diagnostic : diagnostics)
+ {
+ request.diagnosticFunc(
+ (void*)diagnostic.message.c_str(),
+ diagnostic.message.size() * sizeof(char),
+ request.diagnosticUserData);
+ }
+ }
+ return SLANG_OK;
+}
+
static glslang::EShTargetLanguageVersion _makeTargetLanguageVersion(int majorVersion, int minorVersion)
{
return glslang::EShTargetLanguageVersion((uint32_t(majorVersion) << 16) | (uint32_t(minorVersion) << 8));
@@ -770,6 +796,10 @@ static int _compile(const glslang_CompileRequest_1_2& request)
case GLSLANG_ACTION_DISSASSEMBLE_SPIRV:
result = glslang_dissassembleSPIRV(request);
break;
+
+ case GLSLANG_ACTION_OPTIMIZE_SPIRV:
+ result = spirv_Optimize_1_2(request);
+ break;
}
return result;
diff --git a/source/slang-glslang/slang-glslang.h b/source/slang-glslang/slang-glslang.h
index 40c574e08..68c24d889 100644
--- a/source/slang-glslang/slang-glslang.h
+++ b/source/slang-glslang/slang-glslang.h
@@ -12,6 +12,7 @@ enum
{
GLSLANG_ACTION_COMPILE_GLSL_TO_SPIRV,
GLSLANG_ACTION_DISSASSEMBLE_SPIRV,
+ GLSLANG_ACTION_OPTIMIZE_SPIRV,
};
struct glsl_SPIRVVersion
@@ -128,17 +129,17 @@ struct glslang_CompileRequest_1_2
const char* entryPointName; // The name of the entrypoint that will appear in output spirv.
};
-void glslang_CompileRequest_1_0::set(const glslang_CompileRequest_1_1& in)
+inline void glslang_CompileRequest_1_0::set(const glslang_CompileRequest_1_1& in)
{
SLANG_GLSLANG_COMPILE_REQUEST_1_0(SLANG_GLSLANG_FIELD_COPY)
}
-void glslang_CompileRequest_1_1::set(const glslang_CompileRequest_1_0& in)
+inline void glslang_CompileRequest_1_1::set(const glslang_CompileRequest_1_0& in)
{
SLANG_GLSLANG_COMPILE_REQUEST_1_0(SLANG_GLSLANG_FIELD_COPY)
}
-void glslang_CompileRequest_1_2::set(const glslang_CompileRequest_1_1& in)
+inline void glslang_CompileRequest_1_2::set(const glslang_CompileRequest_1_1& in)
{
memcpy(this, &in, sizeof(in));
}
@@ -147,5 +148,4 @@ 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);
-
#endif