diff options
Diffstat (limited to 'source/slang-glslang')
| -rw-r--r-- | source/slang-glslang/slang-glslang.cpp | 36 | ||||
| -rw-r--r-- | source/slang-glslang/slang-glslang.h | 43 |
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 |
