From 313677160a186efebf83fab4df7d08dd119a5cd2 Mon Sep 17 00:00:00 2001 From: cheneym2 Date: Thu, 5 Sep 2024 14:59:28 -0400 Subject: Initial -embed-spirv support (#4974) * Initial -embed-spirv support Add support for SPIR-V precompilation using the framework established for DXIL. Work on #4883 * SLANG_UNUSED * Add linkage attributes to exported spirv functions * Combine DXIL and SPIRV paths * Whitespace fix * Merge remaining precompiled spirv/dxil paths * Change inst accessors to return codegentarget * Add unit test for precompiled spirv --------- Co-authored-by: Yong He --- source/slang/slang-compiler.cpp | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) (limited to 'source/slang/slang-compiler.cpp') diff --git a/source/slang/slang-compiler.cpp b/source/slang/slang-compiler.cpp index 7d2dbed0d..4bb420fa7 100644 --- a/source/slang/slang-compiler.cpp +++ b/source/slang/slang-compiler.cpp @@ -767,9 +767,9 @@ namespace Slang # pragma warning(pop) #endif - SlangResult CodeGenContext::emitPrecompiledDXIL(ComPtr& outArtifact) + SlangResult CodeGenContext::emitPrecompiledDownstreamIR(ComPtr& outArtifact) { - return emitWithDownstreamForEntryPoints(outArtifact); + return _emitEntryPoints(outArtifact); } String GetHLSLProfileName(Profile profile) @@ -1257,10 +1257,7 @@ namespace Slang { CodeGenContext sourceCodeGenContext(this, sourceTarget, extensionTracker); - if (target == CodeGenTarget::DXILAssembly || target == CodeGenTarget::DXIL) - { - sourceCodeGenContext.removeAvailableInDXIL = true; - } + sourceCodeGenContext.removeAvailableInDownstreamIR = true; SLANG_RETURN_ON_FAIL(sourceCodeGenContext.emitEntryPointsSource(sourceArtifact)); sourceCodeGenContext.maybeDumpIntermediate(sourceArtifact); @@ -1561,20 +1558,23 @@ namespace Slang // Load embedded precompiled libraries from IR into library artifacts program->enumerateIRModules([&](IRModule* irModule) { - for (auto inst : irModule->getModuleInst()->getChildren()) + for (auto globalInst : irModule->getModuleInst()->getChildren()) { if (target == CodeGenTarget::DXILAssembly || target == CodeGenTarget::DXIL) { - if (inst->getOp() == kIROp_EmbeddedDXIL) + if (auto inst = as(globalInst)) { - auto slice = static_cast(inst->getOperand(0))->getStringSlice(); - ArtifactDesc desc = ArtifactDescUtil::makeDescForCompileTarget(SLANG_DXIL); - desc.kind = ArtifactKind::Library; + if (inst->getTarget() == CodeGenTarget::DXIL) + { + auto slice = inst->getBlob()->getStringSlice(); + ArtifactDesc desc = ArtifactDescUtil::makeDescForCompileTarget(SLANG_DXIL); + desc.kind = ArtifactKind::Library; - auto library = ArtifactUtil::createArtifact(desc); + auto library = ArtifactUtil::createArtifact(desc); - library->addRepresentationUnknown(StringBlob::create(slice)); - libraries.add(library); + library->addRepresentationUnknown(StringBlob::create(slice)); + libraries.add(library); + } } } } @@ -2030,7 +2030,7 @@ namespace Slang { if (auto artifact = targetProgram->getExistingWholeProgramResult()) { - if (!targetProgram->getOptionSet().getBoolOption(CompilerOptionName::EmbedDXIL)) + if (!targetProgram->getOptionSet().getBoolOption(CompilerOptionName::EmbedDownstreamIR)) { artifacts.add(ComPtr(artifact)); } @@ -2285,6 +2285,9 @@ namespace Slang auto linkage = getLinkage(); for (auto targetReq : linkage->targets) { + if (targetReq->getOptionSet().getBoolOption(CompilerOptionName::EmbedDownstreamIR)) + continue; + auto targetProgram = program->getTargetProgram(targetReq); generateOutput(targetProgram); } -- cgit v1.2.3