From fcc570c9dc27889a5fe10c9df783f9760e126d17 Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 20 Nov 2023 11:00:39 -0800 Subject: Allow whole program compile when using direct spirv backend. (#3342) Co-authored-by: Yong He --- source/slang/slang-options.cpp | 10 +++++++++- tests/spirv/multi-entrypoint.slang | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 tests/spirv/multi-entrypoint.slang diff --git a/source/slang/slang-options.cpp b/source/slang/slang-options.cpp index 1c1ad8f1c..9830fb18c 100644 --- a/source/slang/slang-options.cpp +++ b/source/slang/slang-options.cpp @@ -2945,6 +2945,8 @@ SlangResult OptionsParser::_parse( (m_rawTargets[0].format == CodeGenTarget::HostCPPSource || m_rawTargets[0].format == CodeGenTarget::PyTorchCppBinding || m_rawTargets[0].format == CodeGenTarget::CUDASource || + m_rawTargets[0].format == CodeGenTarget::SPIRV || + m_rawTargets[0].format == CodeGenTarget::SPIRVAssembly || ArtifactDescUtil::makeDescForCompileTarget(asExternal(m_rawTargets[0].format)).kind == ArtifactKind::HostCallable)) { RawOutput rawOutput; @@ -3011,9 +3013,15 @@ SlangResult OptionsParser::_parse( case CodeGenTarget::ShaderSharedLibrary: case CodeGenTarget::PyTorchCppBinding: case CodeGenTarget::DXIL: - rawOutput.isWholeProgram = true; break; + case CodeGenTarget::SPIRV: + case CodeGenTarget::SPIRVAssembly: + if (getCurrentTarget()->targetFlags & SLANG_TARGET_FLAG_GENERATE_SPIRV_DIRECTLY) + { + rawOutput.isWholeProgram = true; + } + break; default: m_sink->diagnose(SourceLoc(), Diagnostics::cannotMatchOutputFileToEntryPoint, rawOutput.path); break; diff --git a/tests/spirv/multi-entrypoint.slang b/tests/spirv/multi-entrypoint.slang new file mode 100644 index 000000000..fecde32f9 --- /dev/null +++ b/tests/spirv/multi-entrypoint.slang @@ -0,0 +1,20 @@ +//TEST:SIMPLE(filecheck=CHECK1): -entry main1 -entry main2 -target spirv -fvk-use-entrypoint-name -emit-spirv-directly +//TEST:SIMPLE(filecheck=CHECK2): -target spirv -fvk-use-entrypoint-name -emit-spirv-directly + + +[shader("raygeneration")] +void main1() {} + +[shader("raygeneration")] +void main2() {} + +[shader("raygeneration")] +void main3() {} + +// CHECK1: OpEntryPoint +// CHECK1: OpEntryPoint +// CHECK1-NOT: OpEntryPoint + +// CHECK2: OpEntryPoint +// CHECK2: OpEntryPoint +// CHECK2: OpEntryPoint -- cgit v1.2.3