diff options
| author | Yong He <yonghe@outlook.com> | 2023-09-26 23:56:06 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-27 14:56:06 +0800 |
| commit | ebe8ddefc48478307d5f206cd3e40c41d28a36e3 (patch) | |
| tree | 8e13977979909a26394eea532d8b95cd5ad0f6d1 /source/slang/slang-spirv-opt.cpp | |
| parent | c5c8cfbb360d9a763f549df48636effde839eacd (diff) | |
Various SPIRV fixes. (#3231)
* Various SPIRV fixes.
- Geometry shader support (WIP).
- Fix texture get dimension and load.
- Fold global GetElement(MakeArray/MakeVector) insts.
- Call spvopt to inline all functions.
- Translate OpImageSubscript.
- Emit struct member names and global variable names.
- Fix lowering of OpBitNot -> OpNot, instead of OpBitReverse.
* Fix test.
* Fix geometry shader.
* Fix geometry shader emit.
* Add atomic Image access test.
* Fix tests.
* don't fail if spirv-opt fails.
* Update comments.
* Fix test.
* Cleanups.
* indentation
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Co-authored-by: Ellie Hermaszewska <ellieh@nvidia.com>
Diffstat (limited to 'source/slang/slang-spirv-opt.cpp')
| -rw-r--r-- | source/slang/slang-spirv-opt.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/source/slang/slang-spirv-opt.cpp b/source/slang/slang-spirv-opt.cpp new file mode 100644 index 000000000..34c87db9f --- /dev/null +++ b/source/slang/slang-spirv-opt.cpp @@ -0,0 +1,68 @@ +#include "slang-spirv-opt.h" +#include "slang-spirv-val.h" + +namespace Slang +{ + +struct RemoveFileRAII +{ + String fileName; + + RemoveFileRAII(String inFileName) + :fileName(inFileName) + {} + + ~RemoveFileRAII() + { + File::remove(fileName); + } +}; + +SlangResult optimizeSPIRV(const List<uint8_t>& spirv, String& outErr, List<uint8_t>& outSpv) +{ + // Set up our process + CommandLine commandLine; + commandLine.m_executableLocation.setName("spirv-opt"); + commandLine.addArg("--merge-return"); + commandLine.addArg("--inline-entry-points-exhaustive"); + commandLine.addArg("--eliminate-dead-functions"); + commandLine.addArg("--eliminate-local-single-block"); + commandLine.addArg("--eliminate-local-single-store"); + commandLine.addArg("--eliminate-dead-code-aggressive"); + + commandLine.addArg("-o"); + String outFileName; + File::generateTemporary(UnownedStringSlice("out_spv"), outFileName); + RemoveFileRAII removeFile(outFileName); + + commandLine.addArg(outFileName); + + RefPtr<Process> p; + + // If we failed to even start the process, then spirv-opt isn't available + SLANG_RETURN_ON_FAIL(Process::create(commandLine, 0, p)); + const auto in = p->getStream(StdStreamType::In); + const auto out = p->getStream(StdStreamType::Out); + const auto err = p->getStream(StdStreamType::ErrorOut); + + List<Byte> outErrData; + SLANG_RETURN_ON_FAIL(StreamUtil::readAndWrite(in, spirv.getArrayView(), out, outSpv, err, outErrData)); + + outSpv.clear(); + File::readAllBytes(outFileName, outSpv); + + SLANG_RETURN_ON_FAIL(p->waitForTermination(3600000)); + + outErr = String( + reinterpret_cast<const char*>(outErrData.begin()), + reinterpret_cast<const char*>(outErrData.end()) + ); + + const auto ret = p->getReturnValue(); + if (ret != 0) + return SLANG_FAIL; + + return debugValidateSPIRV(outSpv); +} + +} |
