summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorcheneym2 <acheney@nvidia.com>2024-08-15 12:36:41 -0400
committerGitHub <noreply@github.com>2024-08-15 12:36:41 -0400
commit27b2229baa635f4cd6316d987a05ae8979ceab68 (patch)
tree1d25f4c1225e8f0782c0bdf2d082ff859ffe178d /source
parent99673d783761d954e7e8333110d104144ae1d51a (diff)
Make precompileForTargets work with Slang API (#4845)
* Make precompileForTargets work with Slang API precompileForTargets, renamed to precompileForTarget, does not need an EndToEndCompileRequest and some objects created from it are not necessary either. Take only a target enum and a diagnostic blob as input and handle everything else internally, such as creating the TargetReq with chosen profile. Fixes #4790 * Update slang-module.cpp * Update slang-module.cpp
Diffstat (limited to 'source')
-rw-r--r--source/slang-record-replay/record/slang-module.cpp11
-rw-r--r--source/slang-record-replay/record/slang-module.h3
-rw-r--r--source/slang/slang-compiler-tu.cpp84
-rwxr-xr-xsource/slang/slang-compiler.h7
-rw-r--r--source/slang/slang.cpp8
5 files changed, 49 insertions, 64 deletions
diff --git a/source/slang-record-replay/record/slang-module.cpp b/source/slang-record-replay/record/slang-module.cpp
index b59aaa18b..42dcd9eea 100644
--- a/source/slang-record-replay/record/slang-module.cpp
+++ b/source/slang-record-replay/record/slang-module.cpp
@@ -213,6 +213,17 @@ 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;
+ }
+
SLANG_NO_THROW slang::ISession* ModuleRecorder::getSession()
{
slangRecordLog(LogLevel::Verbose, "%s\n", __PRETTY_FUNCTION__);
diff --git a/source/slang-record-replay/record/slang-module.h b/source/slang-record-replay/record/slang-module.h
index ca0403c2d..22339f1cd 100644
--- a/source/slang-record-replay/record/slang-module.h
+++ b/source/slang-record-replay/record/slang-module.h
@@ -39,6 +39,9 @@ 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 b007e7b71..d4f3976a6 100644
--- a/source/slang/slang-compiler-tu.cpp
+++ b/source/slang/slang-compiler-tu.cpp
@@ -8,60 +8,24 @@
namespace Slang
{
- SLANG_NO_THROW SlangResult SLANG_MCALL Module::precompileForTargets(
- DiagnosticSink* sink,
- EndToEndCompileRequest* endToEndReq,
- TargetRequest* targetReq)
+ SLANG_NO_THROW SlangResult SLANG_MCALL Module::precompileForTarget(
+ SlangCompileTarget target,
+ slang::IBlob** outDiagnostics)
{
- auto module = getIRModule();
- Slang::Session* session = endToEndReq->getSession();
- Slang::ASTBuilder* astBuilder = session->getGlobalASTBuilder();
- Slang::Linkage* builtinLinkage = session->getBuiltinLinkage();
- Slang::Linkage linkage(session, astBuilder, builtinLinkage);
-
- CapabilityName precompileRequirement = CapabilityName::Invalid;
- switch (targetReq->getTarget())
+ if (target != SLANG_DXIL)
{
- case CodeGenTarget::DXIL:
- linkage.addTarget(Slang::CodeGenTarget::DXIL);
- precompileRequirement = CapabilityName::dxil_lib;
- break;
- default:
- assert(!"Unhandled target");
- break;
+ return SLANG_FAIL;
}
- SLANG_ASSERT(precompileRequirement != CapabilityName::Invalid);
+ CodeGenTarget targetEnum = CodeGenTarget(target);
- // Ensure precompilation capability requirements are met.
- auto targetCaps = targetReq->getTargetCaps();
- auto precompileRequirementsCapabilitySet = CapabilitySet(precompileRequirement);
- if (targetCaps.atLeastOneSetImpliedInOther(precompileRequirementsCapabilitySet) == CapabilitySet::ImpliesReturnFlags::NotImplied)
- {
- // If `RestrictiveCapabilityCheck` is true we will error, else we will warn.
- // error ...: dxil libraries require $0, entry point compiled with $1.
- // warn ...: dxil libraries require $0, entry point compiled with $1, implicitly upgrading capabilities.
- maybeDiagnoseWarningOrError(
- sink,
- targetReq->getOptionSet(),
- DiagnosticCategory::Capability,
- SourceLoc(),
- Diagnostics::incompatibleWithPrecompileLib,
- Diagnostics::incompatibleWithPrecompileLibRestrictive,
- precompileRequirementsCapabilitySet,
- targetCaps);
-
- // add precompile requirements to the cooked targetCaps
- targetCaps.join(precompileRequirementsCapabilitySet);
- if (targetCaps.isInvalid())
- {
- sink->diagnose(SourceLoc(), Diagnostics::unknownCapability, targetCaps);
- return SLANG_FAIL;
- }
- else
- {
- targetReq->setTargetCaps(targetCaps);
- }
- }
+ auto module = getIRModule();
+ auto linkage = getLinkage();
+
+ DiagnosticSink sink(linkage->getSourceManager(), Lexer::sourceLocationLexer);
+ applySettingsToDiagnosticSink(&sink, &sink, linkage->m_optionSet);
+ applySettingsToDiagnosticSink(&sink, &sink, m_optionSet);
+
+ TargetRequest* targetReq = new TargetRequest(linkage, targetEnum);
List<RefPtr<ComponentType>> allComponentTypes;
allComponentTypes.add(this); // Add Module as a component type
@@ -72,23 +36,34 @@ namespace Slang
}
auto composite = CompositeComponentType::create(
- &linkage,
+ linkage,
allComponentTypes);
TargetProgram tp(composite, targetReq);
- tp.getOrCreateLayout(sink);
+ tp.getOrCreateLayout(&sink);
Slang::Index const entryPointCount = m_entryPoints.getCount();
+ tp.getOptionSet().add(CompilerOptionName::GenerateWholeProgram, true);
+
+ switch (targetReq->getTarget())
+ {
+ case CodeGenTarget::DXIL:
+ tp.getOptionSet().add(CompilerOptionName::Profile, Profile::RawEnum::DX_Lib_6_6);
+ break;
+ }
CodeGenContext::EntryPointIndices entryPointIndices;
entryPointIndices.setCount(entryPointCount);
for (Index i = 0; i < entryPointCount; i++)
entryPointIndices[i] = i;
- CodeGenContext::Shared sharedCodeGenContext(&tp, entryPointIndices, sink, endToEndReq);
+ CodeGenContext::Shared sharedCodeGenContext(&tp, entryPointIndices, &sink, nullptr);
CodeGenContext codeGenContext(&sharedCodeGenContext);
ComPtr<IArtifact> outArtifact;
SlangResult res = codeGenContext.emitTranslationUnit(outArtifact);
+
+ sink.getBlobIfNeeded(outDiagnostics);
+
if (res != SLANG_OK)
{
return res;
@@ -105,9 +80,6 @@ namespace Slang
case CodeGenTarget::DXIL:
builder.emitEmbeddedDXIL(blob);
break;
- default:
- assert(!"Unhandled target");
- break;
}
return SLANG_OK;
diff --git a/source/slang/slang-compiler.h b/source/slang/slang-compiler.h
index 1180d4be2..ac85f175e 100755
--- a/source/slang/slang-compiler.h
+++ b/source/slang/slang-compiler.h
@@ -1482,10 +1482,9 @@ namespace Slang
SlangInt32 index) override;
/// Precompile TU to target language
- virtual SLANG_NO_THROW SlangResult SLANG_MCALL precompileForTargets(
- DiagnosticSink* sink,
- EndToEndCompileRequest* endToEndReq,
- TargetRequest* targetReq);
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL precompileForTarget(
+ SlangCompileTarget target,
+ slang::IBlob** outDiagnostics) override;
virtual void buildHash(DigestBuilder<SHA1>& builder) SLANG_OVERRIDE;
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index 81171fdcc..f08a6fc44 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -3252,10 +3252,10 @@ SlangResult EndToEndCompileRequest::executeActionsInner()
for (auto translationUnit : frontEndReq->translationUnits)
{
- translationUnit->getModule()->precompileForTargets(
- getSink(),
- this,
- targetReq);
+ SlangCompileTarget target = SlangCompileTarget(targetReq->getTarget());
+ translationUnit->getModule()->precompileForTarget(
+ target,
+ nullptr);
}
}
}