summaryrefslogtreecommitdiff
path: root/source/slang-glslang
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-08-04 15:55:06 -0700
committerGitHub <noreply@github.com>2023-08-04 15:55:06 -0700
commit856086cf2ac6fb1544b5b08ffa64b2f01931d35c (patch)
tree67f521b4750c01263ce8038cfe6d771b7c3b9cfb /source/slang-glslang
parenta2d90fb275962da84611160f8ddd74d934a68dbd (diff)
Add option to use original entrypoint in spirv output. (#3047)
* Add option to use original entrypoint in spirv output. * Fix. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang-glslang')
-rw-r--r--source/slang-glslang/slang-glslang.cpp36
-rw-r--r--source/slang-glslang/slang-glslang.h43
2 files changed, 70 insertions, 9 deletions
diff --git a/source/slang-glslang/slang-glslang.cpp b/source/slang-glslang/slang-glslang.cpp
index ffe3161ea..b23a34e65 100644
--- a/source/slang-glslang/slang-glslang.cpp
+++ b/source/slang-glslang/slang-glslang.cpp
@@ -97,7 +97,7 @@ static void dump(
}
static void dumpDiagnostics(
- const glslang_CompileRequest_1_1& request,
+ const glslang_CompileRequest_1_2& request,
std::string const& log)
{
dump(log.c_str(), log.length(), request.diagnosticFunc, request.diagnosticUserData, stderr);
@@ -147,7 +147,7 @@ struct SPIRVOptimizationDiagnostic
// 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(spv_target_env targetEnv, const glslang_CompileRequest_1_1& request, std::vector<SPIRVOptimizationDiagnostic>& outDiags, std::vector<unsigned int>& ioSpirv)
+static void glslang_optimizeSPIRV(spv_target_env targetEnv, const glslang_CompileRequest_1_2& request, std::vector<SPIRVOptimizationDiagnostic>& outDiags, std::vector<unsigned int>& ioSpirv)
{
const auto optimizationLevel = request.optimizationLevel;
@@ -509,7 +509,7 @@ static spv_target_env _getUniversalTargetEnv(glslang::EShTargetLanguageVersion i
return SPV_ENV_UNIVERSAL_1_2;
}
-static int glslang_compileGLSLToSPIRV(const glslang_CompileRequest_1_1& request)
+static int glslang_compileGLSLToSPIRV(const glslang_CompileRequest_1_2& request)
{
// Check that the encoding matches
assert(glslang::EShTargetSpv_1_4 == _makeTargetLanguageVersion(1, 4));
@@ -607,6 +607,9 @@ static int glslang_compileGLSLToSPIRV(const glslang_CompileRequest_1_1& request)
return 1;
}
+ if (request.entryPointName)
+ shader->setEntryPoint(request.entryPointName);
+
program->addShader(shader);
if (!program->link(messages))
@@ -691,7 +694,7 @@ static int glslang_compileGLSLToSPIRV(const glslang_CompileRequest_1_1& request)
return 0;
}
-static int glslang_dissassembleSPIRV(const glslang_CompileRequest_1_1& request)
+static int glslang_dissassembleSPIRV(const glslang_CompileRequest_1_2& request)
{
typedef unsigned int SPIRVWord;
@@ -744,7 +747,7 @@ public:
bool m_isInitialized = false;
};
-static int _compile(const glslang_CompileRequest_1_1& request)
+static int _compile(const glslang_CompileRequest_1_2& request)
{
int result = 0;
switch (request.action)
@@ -771,7 +774,7 @@ _declspec(dllexport)
#else
__attribute__((__visibility__("default")))
#endif
-int glslang_compile_1_1(glslang_CompileRequest_1_1* inRequest)
+int glslang_compile_1_2(glslang_CompileRequest_1_2 * inRequest)
{
static ProcessInitializer g_processInitializer;
if (!g_processInitializer.init())
@@ -786,7 +789,7 @@ int glslang_compile_1_1(glslang_CompileRequest_1_1* inRequest)
}
// If it's the right size just use it
- if (inRequest->sizeInBytes == sizeof(glslang_CompileRequest_1_1))
+ if (inRequest->sizeInBytes == sizeof(glslang_CompileRequest_1_2))
{
return _compile(*inRequest);
}
@@ -796,8 +799,8 @@ int glslang_compile_1_1(glslang_CompileRequest_1_1* inRequest)
// Try to ensure some binary compatibility, by using sizeInBytes member, and copying
- glslang_CompileRequest_1_1 request;
-
+ glslang_CompileRequest_1_2 request;
+
// Copy into request
const size_t copySize = (inRequest->sizeInBytes > sizeof(request)) ? sizeof(request) : inRequest->sizeInBytes;
::memcpy(&request, inRequest, copySize);
@@ -814,6 +817,21 @@ _declspec(dllexport)
#else
__attribute__((__visibility__("default")))
#endif
+int glslang_compile_1_1(glslang_CompileRequest_1_1* inRequest)
+{
+ glslang_CompileRequest_1_2 request;
+ memset(&request, 0, sizeof(request));
+ request.sizeInBytes = sizeof(request);
+ request.set(*inRequest);
+ return glslang_compile_1_2(&request);
+}
+
+extern "C"
+#ifdef _MSC_VER
+_declspec(dllexport)
+#else
+__attribute__((__visibility__("default")))
+#endif
int glslang_compile(glslang_CompileRequest_1_0* inRequest)
{
glslang_CompileRequest_1_1 request;
diff --git a/source/slang-glslang/slang-glslang.h b/source/slang-glslang/slang-glslang.h
index 88cab0bf9..1fb76f1f3 100644
--- a/source/slang-glslang/slang-glslang.h
+++ b/source/slang-glslang/slang-glslang.h
@@ -3,6 +3,7 @@
#define SLANG_GLSLANG_H_INCLUDED
#include <stddef.h>
+#include <memory>
typedef void (*glslang_OutputFunc)(void const* data, size_t size, void* userData);
@@ -91,6 +92,41 @@ struct glslang_CompileRequest_1_1
glsl_SPIRVVersion spirvVersion; ///< The SPIR-V version. If all are 0 will use the default which is 1.2 currently
};
+// 1.2 version
+struct glslang_CompileRequest_1_2
+{
+ /// Set from 1.1
+ void set(const glslang_CompileRequest_1_1& in);
+
+ size_t sizeInBytes; ///< Size in bytes of this structure
+
+ // START! Embed the glslang_CompileRequest_1_0 fields
+ char const* sourcePath;
+
+ void const* inputBegin;
+ void const* inputEnd;
+
+ glslang_OutputFunc diagnosticFunc;
+ void* diagnosticUserData;
+
+ glslang_OutputFunc outputFunc;
+ void* outputUserData;
+
+ int slangStage;
+
+ unsigned action;
+
+ unsigned optimizationLevel;
+ unsigned debugInfoType;
+ // END! Embed the glslang_CompileRequest_1_0 fields
+
+ const char* spirvTargetName; /// A valid TargetName. If null will use universal based on the spirVersion.
+ glsl_SPIRVVersion spirvVersion; ///< The SPIR-V version. If all are 0 will use the default which is 1.2 currently
+
+ // glslang_CompileRequest_1_2 fields
+ 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)
{
SLANG_GLSLANG_COMPILE_REQUEST_1_0(SLANG_GLSLANG_FIELD_COPY)
@@ -101,7 +137,14 @@ 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)
+{
+ memcpy(this, &in, sizeof(in));
+}
+
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