summaryrefslogtreecommitdiff
path: root/tools/render-test/slang-support.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/render-test/slang-support.cpp')
-rw-r--r--tools/render-test/slang-support.cpp77
1 files changed, 65 insertions, 12 deletions
diff --git a/tools/render-test/slang-support.cpp b/tools/render-test/slang-support.cpp
index 06a11ad4c..bec651e87 100644
--- a/tools/render-test/slang-support.cpp
+++ b/tools/render-test/slang-support.cpp
@@ -12,6 +12,7 @@ struct SlangShaderCompilerWrapper : public ShaderCompiler
{
ShaderCompiler* innerCompiler;
SlangCompileTarget target;
+ SlangSourceLanguage sourceLanguage;
virtual ShaderProgram* compileProgram(ShaderCompileRequest const& request) override
{
@@ -20,16 +21,58 @@ struct SlangShaderCompilerWrapper : public ShaderCompiler
spSetCodeGenTarget(slangRequest, target);
- // Define a macro so that shader code in a test can detect when it is being
- // compiled as Slang source code.
- spAddPreprocessorDefine(slangRequest, "__SLANG__", "1");
+ // Define a macro so that shader code in a test can detect what language we
+ // are nominally working with.
+ char const* langDefine = nullptr;
+ switch (sourceLanguage)
+ {
+ case SLANG_SOURCE_LANGUAGE_GLSL: langDefine = "__GLSL__"; break;
+ case SLANG_SOURCE_LANGUAGE_HLSL: langDefine = "__HLSL__"; break;
+ case SLANG_SOURCE_LANGUAGE_SLANG: langDefine = "__SLANG__"; break;
+ default:
+ assert(!"unexpected");
+ break;
+ }
+ spAddPreprocessorDefine(slangRequest, langDefine, "1");
+
+ int vertexTranslationUnit = 0;
+ int fragmentTranslationUnit = 0;
+ if( sourceLanguage == SLANG_SOURCE_LANGUAGE_GLSL )
+ {
+ // GLSL presents unique challenges because, frankly, it got the whole
+ // compilation model wrong. One aspect of working around this is that
+ // we will compile the same source file multiple times: once per
+ // entry point, and we will have different preprocessor definitions
+ // active in each case.
+
+ vertexTranslationUnit = spAddTranslationUnit(slangRequest, sourceLanguage, nullptr);
+ spAddTranslationUnitSourceString(slangRequest, vertexTranslationUnit, request.source.path, request.source.text);
- int translationUnitIndex = spAddTranslationUnit(slangRequest, SLANG_SOURCE_LANGUAGE_SLANG, nullptr);
+ spTranslationUnit_addPreprocessorDefine(slangRequest, vertexTranslationUnit, "__GLSL_VERTEX__", "1");
- spAddTranslationUnitSourceString(slangRequest, translationUnitIndex, request.source.path, request.source.text);
+ fragmentTranslationUnit = spAddTranslationUnit(slangRequest, sourceLanguage, nullptr);
+ spAddTranslationUnitSourceString(slangRequest, fragmentTranslationUnit, request.source.path, request.source.text);
+
+ spTranslationUnit_addPreprocessorDefine(slangRequest, fragmentTranslationUnit, "__GLSL_FRAGMENT__", "1");
+ }
+ else
+ {
+ int translationUnit = spAddTranslationUnit(slangRequest, sourceLanguage, nullptr);
+ spAddTranslationUnitSourceString(slangRequest, translationUnit, request.source.path, request.source.text);
+
+ vertexTranslationUnit = translationUnit;
+ fragmentTranslationUnit = translationUnit;
+ }
- int vertexEntryPoint = spAddTranslationUnitEntryPoint(slangRequest, translationUnitIndex, request.vertexShader.name, spFindProfile(slangSession, request.vertexShader.profile));
- int fragmentEntryPoint = spAddTranslationUnitEntryPoint(slangRequest, translationUnitIndex, request.fragmentShader.name, spFindProfile(slangSession, request.fragmentShader.profile));
+
+ // If we aren't dealing with true Slang input, then don't enable checking.
+ if (sourceLanguage != SLANG_SOURCE_LANGUAGE_SLANG)
+ {
+ spSetCompileFlags(slangRequest, SLANG_COMPILE_FLAG_NO_CHECKING);
+ }
+
+ int vertexEntryPoint = spAddTranslationUnitEntryPoint(slangRequest, vertexTranslationUnit, request.vertexShader.name, spFindProfile(slangSession, request.vertexShader.profile));
+ int fragmentEntryPoint = spAddTranslationUnitEntryPoint(slangRequest, fragmentTranslationUnit, request.fragmentShader.name, spFindProfile(slangSession, request.fragmentShader.profile));
int compileErr = spCompile(slangRequest);
if(auto diagnostics = spGetDiagnosticOutput(slangRequest))
@@ -43,12 +86,18 @@ struct SlangShaderCompilerWrapper : public ShaderCompiler
return nullptr;
}
- char const* translatedCode = spGetTranslationUnitSource(slangRequest, translationUnitIndex);
- char const* vertexCode = spGetEntryPointSource(slangRequest, translationUnitIndex, vertexEntryPoint);
- char const* fragmentCode = spGetEntryPointSource(slangRequest, translationUnitIndex, fragmentEntryPoint);
ShaderCompileRequest innerRequest = request;
- innerRequest.source.text = translatedCode;
+
+ if( sourceLanguage != SLANG_SOURCE_LANGUAGE_GLSL )
+ {
+ char const* translatedCode = spGetTranslationUnitSource(slangRequest, 0);
+ innerRequest.source.text = translatedCode;
+ }
+
+ char const* vertexCode = spGetEntryPointSource(slangRequest, vertexTranslationUnit, vertexEntryPoint);
+ char const* fragmentCode = spGetEntryPointSource(slangRequest, fragmentTranslationUnit, fragmentEntryPoint);
+
innerRequest.vertexShader.source.text = vertexCode;
innerRequest.fragmentShader.source.text = fragmentCode;
@@ -66,10 +115,14 @@ struct SlangShaderCompilerWrapper : public ShaderCompiler
}
};
-ShaderCompiler* createSlangShaderCompiler(ShaderCompiler* innerCompiler, SlangCompileTarget target)
+ShaderCompiler* createSlangShaderCompiler(
+ ShaderCompiler* innerCompiler,
+ SlangSourceLanguage sourceLanguage,
+ SlangCompileTarget target)
{
auto result = new SlangShaderCompilerWrapper();
result->innerCompiler = innerCompiler;
+ result->sourceLanguage = sourceLanguage;
result->target = target;
return result;