diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang-record-replay/record/slang-module.cpp | 11 | ||||
| -rw-r--r-- | source/slang-record-replay/record/slang-module.h | 3 | ||||
| -rw-r--r-- | source/slang/slang-compiler-tu.cpp | 80 | ||||
| -rwxr-xr-x | source/slang/slang-compiler.h | 38 | ||||
| -rw-r--r-- | source/slang/slang.cpp | 4 |
5 files changed, 121 insertions, 15 deletions
diff --git a/source/slang-record-replay/record/slang-module.cpp b/source/slang-record-replay/record/slang-module.cpp index 1ad04d4dc..5f624a2e0 100644 --- a/source/slang-record-replay/record/slang-module.cpp +++ b/source/slang-record-replay/record/slang-module.cpp @@ -213,17 +213,6 @@ namespace SlangRecord return res; } - SLANG_NO_THROW SlangResult ModuleRecorder::precompileForTarget( - SlangCompileTarget target, - ISlangBlob** outDiagnostics) - { - // TODO: We should record this call - // https://github.com/shader-slang/slang/issues/4853 - slangRecordLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__); - SlangResult res = m_actualModule->precompileForTarget(target, outDiagnostics); - return res; - } - IEntryPointRecorder* ModuleRecorder::getEntryPointRecorder(slang::IEntryPoint* entryPoint) { IEntryPointRecorder* entryPointRecord = nullptr; diff --git a/source/slang-record-replay/record/slang-module.h b/source/slang-record-replay/record/slang-module.h index ce009eac8..2a22bd214 100644 --- a/source/slang-record-replay/record/slang-module.h +++ b/source/slang-record-replay/record/slang-module.h @@ -46,9 +46,6 @@ namespace SlangRecord virtual SLANG_NO_THROW SlangInt32 SLANG_MCALL getDependencyFileCount() override; virtual SLANG_NO_THROW char const* SLANG_MCALL getDependencyFilePath( SlangInt32 index) override; - virtual SLANG_NO_THROW SlangResult SLANG_MCALL precompileForTarget( - SlangCompileTarget target, - ISlangBlob** outDiagnostics) override; // Interfaces for `IComponentType` virtual SLANG_NO_THROW slang::ISession* SLANG_MCALL getSession() override diff --git a/source/slang/slang-compiler-tu.cpp b/source/slang/slang-compiler-tu.cpp index 57a1133fc..8ae06a419 100644 --- a/source/slang/slang-compiler-tu.cpp +++ b/source/slang/slang-compiler-tu.cpp @@ -210,7 +210,87 @@ namespace Slang builder.setInsertInto(module); builder.emitEmbeddedDownstreamIR(targetReq->getTarget(), blob); + return SLANG_OK; + } + + SLANG_NO_THROW SlangResult SLANG_MCALL Module::getPrecompiledTargetCode( + SlangCompileTarget target, + slang::IBlob** outCode, + slang::IBlob** outDiagnostics) + { + SLANG_UNUSED(outDiagnostics); + for (auto globalInst : getIRModule()->getModuleInst()->getChildren()) + { + if (auto inst = as<IREmbeddedDownstreamIR>(globalInst)) + { + static_assert(CodeGenTarget::DXIL == static_cast<CodeGenTarget>(SLANG_DXIL)); + static_assert(CodeGenTarget::SPIRV == static_cast<CodeGenTarget>(SLANG_SPIRV)); + if (inst->getTarget() == static_cast<CodeGenTarget>(target)) + { + auto slice = inst->getBlob()->getStringSlice(); + auto blob = StringBlob::create(slice); + *outCode = blob.detach(); + return SLANG_OK; + } + } + } + return SLANG_FAIL; + } + + SLANG_NO_THROW SlangInt SLANG_MCALL Module::getModuleDependencyCount() + { + return 0; + } + + SLANG_NO_THROW SlangResult SLANG_MCALL Module::getModuleDependency( + SlangInt dependencyIndex, + IModule** outModule, + slang::IBlob** outDiagnostics) + { + SLANG_UNUSED(dependencyIndex); + SLANG_UNUSED(outModule); + SLANG_UNUSED(outDiagnostics); + return SLANG_OK; + } + // ComponentType + + SLANG_NO_THROW SlangResult SLANG_MCALL ComponentType::precompileForTarget( + SlangCompileTarget target, + slang::IBlob** outDiagnostics) + { + SLANG_UNUSED(target); + SLANG_UNUSED(outDiagnostics); + return SLANG_FAIL; + } + + SLANG_NO_THROW SlangResult SLANG_MCALL ComponentType::getPrecompiledTargetCode( + SlangCompileTarget target, + slang::IBlob** outCode, + slang::IBlob** outDiagnostics) + { + SLANG_UNUSED(target); + SLANG_UNUSED(outCode); + SLANG_UNUSED(outDiagnostics); + return SLANG_FAIL; + } + + SLANG_NO_THROW SlangInt SLANG_MCALL ComponentType::getModuleDependencyCount() + { + return getModuleDependencies().getCount(); + } + + SLANG_NO_THROW SlangResult SLANG_MCALL ComponentType::getModuleDependency( + SlangInt dependencyIndex, + slang::IModule** outModule, + slang::IBlob** outDiagnostics) + { + SLANG_UNUSED(outDiagnostics); + if (dependencyIndex < 0 || dependencyIndex >= getModuleDependencies().getCount()) + { + return SLANG_E_INVALID_ARG; + } + *outModule = getModuleDependencies()[dependencyIndex]; return SLANG_OK; } } diff --git a/source/slang/slang-compiler.h b/source/slang/slang-compiler.h index 17501163f..7271c2e19 100755 --- a/source/slang/slang-compiler.h +++ b/source/slang/slang-compiler.h @@ -294,7 +294,7 @@ namespace Slang /// Base class for "component types" that represent the pieces a final /// shader program gets linked together from. /// - class ComponentType : public RefObject, public slang::IComponentType + class ComponentType : public RefObject, public slang::IComponentType, public slang::IModulePrecompileService_Experimental { public: // @@ -370,6 +370,27 @@ namespace Slang slang::CompilerOptionEntry* entries, ISlangBlob** outDiagnostics) override; + + // + // slang::IModulePrecompileService interface + // + SLANG_NO_THROW SlangResult SLANG_MCALL precompileForTarget( + SlangCompileTarget target, + slang::IBlob** outDiagnostics) SLANG_OVERRIDE; + + SLANG_NO_THROW SlangResult SLANG_MCALL getPrecompiledTargetCode( + SlangCompileTarget target, + slang::IBlob** outCode, + slang::IBlob** outDiagnostics = nullptr) SLANG_OVERRIDE; + + SLANG_NO_THROW SlangInt SLANG_MCALL getModuleDependencyCount() + SLANG_OVERRIDE; + + SLANG_NO_THROW SlangResult SLANG_MCALL getModuleDependency( + SlangInt dependencyIndex, + slang::IModule** outModule, + slang::IBlob** outDiagnostics = nullptr) SLANG_OVERRIDE; + CompilerOptionSet& getOptionSet() { return m_optionSet; } /// Get the linkage (aka "session" in the public API) for this component type. @@ -1550,11 +1571,26 @@ namespace Slang virtual SLANG_NO_THROW char const* SLANG_MCALL getDependencyFilePath( SlangInt32 index) override; + + // IModulePrecompileService_Experimental /// Precompile TU to target language virtual SLANG_NO_THROW SlangResult SLANG_MCALL precompileForTarget( SlangCompileTarget target, slang::IBlob** outDiagnostics) override; + virtual SLANG_NO_THROW SlangResult SLANG_MCALL getPrecompiledTargetCode( + SlangCompileTarget target, + slang::IBlob** outCode, + slang::IBlob** outDiagnostics = nullptr) override; + + virtual SLANG_NO_THROW SlangInt SLANG_MCALL getModuleDependencyCount() + SLANG_OVERRIDE; + + virtual SLANG_NO_THROW SlangResult SLANG_MCALL getModuleDependency( + SlangInt dependencyIndex, + slang::IModule** outModule, + slang::IBlob** outDiagnostics = nullptr) SLANG_OVERRIDE; + virtual void buildHash(DigestBuilder<SHA1>& builder) SLANG_OVERRIDE; virtual slang::DeclReflection* getModuleReflection() SLANG_OVERRIDE; diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp index c9717272b..d0fe28185 100644 --- a/source/slang/slang.cpp +++ b/source/slang/slang.cpp @@ -4284,6 +4284,8 @@ ISlangUnknown* Module::getInterface(const Guid& guid) { if(guid == IModule::getTypeGuid()) return asExternal(this); + if (guid == IModulePrecompileService_Experimental::getTypeGuid()) + return static_cast<slang::IModulePrecompileService_Experimental*>(this); return Super::getInterface(guid); } @@ -4500,6 +4502,8 @@ ISlangUnknown* ComponentType::getInterface(Guid const& guid) { return static_cast<slang::IComponentType*>(this); } + if(guid == IModulePrecompileService_Experimental::getTypeGuid()) + return static_cast<slang::IModulePrecompileService_Experimental*>(this); return nullptr; } |
