diff options
| -rw-r--r-- | build/visual-studio/slang/slang.vcxproj | 2 | ||||
| -rw-r--r-- | build/visual-studio/slang/slang.vcxproj.filters | 6 | ||||
| -rw-r--r-- | source/slang/slang-diagnostic-defs.h | 1 | ||||
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 13 | ||||
| -rw-r--r-- | source/slang/slang-spirv-val.cpp | 40 | ||||
| -rw-r--r-- | source/slang/slang-spirv-val.h | 10 |
6 files changed, 72 insertions, 0 deletions
diff --git a/build/visual-studio/slang/slang.vcxproj b/build/visual-studio/slang/slang.vcxproj index 71775be78..20d84e0e4 100644 --- a/build/visual-studio/slang/slang.vcxproj +++ b/build/visual-studio/slang/slang.vcxproj @@ -496,6 +496,7 @@ IF EXIST ..\..\..\external\slang-glslang\bin\windows-aarch64\release\slang-glsla <ClInclude Include="..\..\..\source\slang\slang-serialize-types.h" />
<ClInclude Include="..\..\..\source\slang\slang-serialize-value-type-info.h" />
<ClInclude Include="..\..\..\source\slang\slang-serialize.h" />
+ <ClInclude Include="..\..\..\source\slang\slang-spirv-val.h" />
<ClInclude Include="..\..\..\source\slang\slang-syntax.h" />
<ClInclude Include="..\..\..\source\slang\slang-type-layout.h" />
<ClInclude Include="..\..\..\source\slang\slang-type-system-shared.h" />
@@ -698,6 +699,7 @@ IF EXIST ..\..\..\external\slang-glslang\bin\windows-aarch64\release\slang-glsla <ClCompile Include="..\..\..\source\slang\slang-serialize-source-loc.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-serialize-types.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-serialize.cpp" />
+ <ClCompile Include="..\..\..\source\slang\slang-spirv-val.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-stdlib-api.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-stdlib.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-syntax.cpp" />
diff --git a/build/visual-studio/slang/slang.vcxproj.filters b/build/visual-studio/slang/slang.vcxproj.filters index 2ca64e72d..1ff77e487 100644 --- a/build/visual-studio/slang/slang.vcxproj.filters +++ b/build/visual-studio/slang/slang.vcxproj.filters @@ -576,6 +576,9 @@ <ClInclude Include="..\..\..\source\slang\slang-serialize.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="..\..\..\source\slang\slang-spirv-val.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
<ClInclude Include="..\..\..\source\slang\slang-syntax.h">
<Filter>Header Files</Filter>
</ClInclude>
@@ -1178,6 +1181,9 @@ <ClCompile Include="..\..\..\source\slang\slang-serialize.cpp">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="..\..\..\source\slang\slang-spirv-val.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
<ClCompile Include="..\..\..\source\slang\slang-stdlib-api.cpp">
<Filter>Source Files</Filter>
</ClCompile>
diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h index 14a03884b..e2c00ec38 100644 --- a/source/slang/slang-diagnostic-defs.h +++ b/source/slang/slang-diagnostic-defs.h @@ -726,6 +726,7 @@ DIAGNOSTIC(99999, Internal, internalCompilerError, "Slang internal compiler erro DIAGNOSTIC(99999, Error, compilationAborted, "Slang compilation aborted due to internal error") DIAGNOSTIC(99999, Error, compilationAbortedDueToException, "Slang compilation aborted due to an exception of $0: $1") DIAGNOSTIC(99999, Internal, serialDebugVerificationFailed, "Verification of serial debug information failed.") +DIAGNOSTIC(99999, Internal, spirvValidationFailed, "Validation of generated SPIR-V failed.") DIAGNOSTIC(99999, Internal, noBlocksOrIntrinsic, "no blocks found for function definition, is there a '$0' intrinsic missing?") diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index 1386de4eb..c16ee6a90 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -9,6 +9,7 @@ #include "slang-ir-layout.h" #include "slang-ir-spirv-snippet.h" #include "slang-ir-spirv-legalize.h" +#include "slang-spirv-val.h" #include "spirv/unified1/spirv.h" #include "../core/slang-memory-arena.h" @@ -3078,6 +3079,18 @@ SlangResult emitSPIRVFromIR( (uint8_t const*) context.m_words.getBuffer(), context.m_words.getCount() * sizeof(context.m_words[0])); + const auto validationResult = debugValidateSPIRV(spirvOut); + // If validation isn't available, don't say it failed, it's just a debug + // feature so we can skip + if(SLANG_FAILED(validationResult) && validationResult != SLANG_E_NOT_AVAILABLE) + { + codeGenContext->getSink()->diagnoseWithoutSourceView( + SourceLoc{}, + Diagnostics::spirvValidationFailed + ); + return validationResult; + } + return SLANG_OK; } diff --git a/source/slang/slang-spirv-val.cpp b/source/slang/slang-spirv-val.cpp new file mode 100644 index 000000000..990ccd909 --- /dev/null +++ b/source/slang/slang-spirv-val.cpp @@ -0,0 +1,40 @@ +#include "slang-spirv-val.h" + +namespace Slang +{ + +SlangResult debugValidateSPIRV(const List<uint8_t>& spirv) +{ + // Set up our process + CommandLine commandLine; + commandLine.m_executableLocation.setName("spirv-val"); + RefPtr<Process> p; + const auto createResult = Process::create(commandLine, 0, p); + // If we failed to even start the process, then validation isn't available + if(SLANG_FAILED(createResult)) + return SLANG_E_NOT_AVAILABLE; + const auto in = p->getStream(StdStreamType::In); + const auto out = p->getStream(StdStreamType::Out); + const auto err = p->getStream(StdStreamType::ErrorOut); + + // Write the assembly + SLANG_RETURN_ON_FAIL(in->write(spirv.getBuffer(), spirv.getCount())); + in->close(); + + // Wait for it to finish + if(!p->waitForTermination(1000)) + return SLANG_FAIL; + + // TODO: allow inheriting stderr in Process + List<Byte> outData; + SLANG_RETURN_ON_FAIL(StreamUtil::readAll(out, 0, outData)); + fwrite(outData.getBuffer(), outData.getCount(), 1, stderr); + outData.clear(); + SLANG_RETURN_ON_FAIL(StreamUtil::readAll(err, 0, outData)); + fwrite(outData.getBuffer(), outData.getCount(), 1, stderr); + + const auto ret = p->getReturnValue(); + return ret == 0 ? SLANG_OK : SLANG_FAIL; +} + +} diff --git a/source/slang/slang-spirv-val.h b/source/slang/slang-spirv-val.h new file mode 100644 index 000000000..08e08b373 --- /dev/null +++ b/source/slang/slang-spirv-val.h @@ -0,0 +1,10 @@ +#pragma once + +#include <cstdint> +#include "slang-compiler.h" + +namespace Slang +{ +SlangResult debugValidateSPIRV(const List<uint8_t>& spirv); +} + |
