diff options
Diffstat (limited to 'source/slang')
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 17 | ||||
| -rw-r--r-- | source/slang/slang-emit.cpp | 16 | ||||
| -rw-r--r-- | source/slang/slang-spirv-val.cpp | 41 | ||||
| -rw-r--r-- | source/slang/slang-spirv-val.h | 1 |
4 files changed, 16 insertions, 59 deletions
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index 1040017da..6b84668e3 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -6576,23 +6576,6 @@ SlangResult emitSPIRVFromIR( (uint8_t const*) context.m_words.getBuffer(), context.m_words.getCount() * Index(sizeof(context.m_words[0]))); - StringBuilder runSpirvValEnvVar; - PlatformUtil::getEnvironmentVariable(UnownedStringSlice("SLANG_RUN_SPIRV_VALIDATION"), runSpirvValEnvVar); - if (runSpirvValEnvVar.getUnownedSlice() == "1" - && !codeGenContext->shouldSkipSPIRVValidation()) - { - 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-emit.cpp b/source/slang/slang-emit.cpp index cb8460173..679d8ce88 100644 --- a/source/slang/slang-emit.cpp +++ b/source/slang/slang-emit.cpp @@ -1704,6 +1704,22 @@ SlangResult emitSPIRVForEntryPointsDirectly( PassThroughMode::SpirvOpt, codeGenContext->getSink()); if (compiler) { + if (!codeGenContext->shouldSkipSPIRVValidation()) + { + StringBuilder runSpirvValEnvVar; + PlatformUtil::getEnvironmentVariable(UnownedStringSlice("SLANG_RUN_SPIRV_VALIDATION"), runSpirvValEnvVar); + if (runSpirvValEnvVar.getUnownedSlice() == "1") + { + if (SLANG_FAILED(compiler->validate((uint32_t*)spirv.getBuffer(), int(spirv.getCount()/4)))) + { + codeGenContext->getSink()->diagnoseWithoutSourceView( + SourceLoc{}, + Diagnostics::spirvValidationFailed + ); + } + } + } + ComPtr<IArtifact> optimizedArtifact; DownstreamCompileOptions downstreamOptions; downstreamOptions.sourceArtifacts = makeSlice(artifact.readRef(), 1); diff --git a/source/slang/slang-spirv-val.cpp b/source/slang/slang-spirv-val.cpp index faacb9c59..585ff5c94 100644 --- a/source/slang/slang-spirv-val.cpp +++ b/source/slang/slang-spirv-val.cpp @@ -38,46 +38,5 @@ SlangResult disassembleSPIRV(const List<uint8_t>& spirv, String& outErr, String& return ret == 0 ? SLANG_OK : SLANG_FAIL; } -SlangResult debugValidateSPIRV(const List<uint8_t>& spirv) -{ - // Set up our process - CommandLine commandLine; - commandLine.m_executableLocation.setName("spirv-val"); - commandLine.addArg("--target-env"); - commandLine.addArg("vulkan1.3"); - commandLine.addArg("--scalar-block-layout"); - 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); - - List<Byte> outData; - List<Byte> errData; - SLANG_RETURN_ON_FAIL(StreamUtil::readAndWrite(in, spirv.getArrayView(), out, outData, err, errData)); - - // Wait for it to finish - if(!p->waitForTermination(1000)) - return SLANG_FAIL; - - // If we failed, dump the spirv first. - const auto ret = p->getReturnValue(); - if(ret != 0) - { - String spirvDisErr; - String spirvDis; - disassembleSPIRV(spirv, spirvDisErr, spirvDis); - fwrite(spirvDisErr.getBuffer(), spirvDisErr.getLength(), 1, stderr); - fwrite(spirvDis.getBuffer(), spirvDis.getLength(), 1, stderr); - } - - fwrite(outData.getBuffer(), outData.getCount(), 1, stderr); - fwrite(errData.getBuffer(), errData.getCount(), 1, stderr); - - return ret == 0 ? SLANG_OK : SLANG_FAIL; -} } diff --git a/source/slang/slang-spirv-val.h b/source/slang/slang-spirv-val.h index 7ee55693a..bb0730849 100644 --- a/source/slang/slang-spirv-val.h +++ b/source/slang/slang-spirv-val.h @@ -5,7 +5,6 @@ namespace Slang { -SlangResult debugValidateSPIRV(const List<uint8_t>& spirv); SlangResult disassembleSPIRV(const List<uint8_t>& spirv, String& outErr, String& outDis); } |
