summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-check-shader.cpp7
-rw-r--r--source/slang/slang-emit-hlsl.cpp12
-rw-r--r--source/slang/slang-emit.cpp8
-rw-r--r--source/slang/slang-options.cpp5
4 files changed, 30 insertions, 2 deletions
diff --git a/source/slang/slang-check-shader.cpp b/source/slang/slang-check-shader.cpp
index b714826de..180cfb413 100644
--- a/source/slang/slang-check-shader.cpp
+++ b/source/slang/slang-check-shader.cpp
@@ -743,6 +743,13 @@ bool resolveStageOfProfileWithEntryPoint(
entryPointProfile.additionalCapabilities.add(entryPointAttr->capabilitySet);
return true;
}
+
+ if (optionSet.getBoolOption(CompilerOptionName::PlainFunctionEntryPoints))
+ {
+ entryPointProfile.setStage(Stage::Dispatch);
+ return true;
+ }
+
return false;
}
diff --git a/source/slang/slang-emit-hlsl.cpp b/source/slang/slang-emit-hlsl.cpp
index a5d634ebf..60769b0bd 100644
--- a/source/slang/slang-emit-hlsl.cpp
+++ b/source/slang/slang-emit-hlsl.cpp
@@ -442,6 +442,11 @@ void HLSLSourceEmitter::emitEntryPointAttributesImpl(
{
if (profile.getVersion() >= ProfileVersion::DX_6_1)
{
+ if (m_codeGenContext->getTargetProgram()->getOptionSet().getBoolOption(
+ CompilerOptionName::PlainFunctionEntryPoints))
+ {
+ return;
+ }
char const* stageName = getStageName(stage);
if (stageName)
{
@@ -787,6 +792,13 @@ bool HLSLSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
static bool isTargetHLSL2018(HLSLSourceEmitter* emitter, CapabilitySet targetCaps, Stage stage)
{
+ if (stage == Stage::Unknown &&
+ emitter->getTargetProgram()->getOptionSet().getBoolOption(
+ CompilerOptionName::PlainFunctionEntryPoints))
+ {
+ return false;
+ }
+
auto stageAtom = getAtomFromStage(stage);
// Cache the result of this function for easier lookup.
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp
index bdd7dfe10..e8be11973 100644
--- a/source/slang/slang-emit.cpp
+++ b/source/slang/slang-emit.cpp
@@ -830,6 +830,7 @@ Result linkAndOptimizeIR(
// TODO: We should skip this step for CUDA targets.
// (NM): we actually do need to do this step for OptiX based CUDA targets
//
+ if (!targetProgram->getOptionSet().getBoolOption(CompilerOptionName::PlainFunctionEntryPoints))
{
CollectEntryPointUniformParamsOptions passOptions;
passOptions.targetReq = targetRequest;
@@ -862,10 +863,13 @@ Result linkAndOptimizeIR(
switch (target)
{
default:
- moveEntryPointUniformParamsToGlobalScope(irModule);
+ if (!targetProgram->getOptionSet().getBoolOption(CompilerOptionName::PlainFunctionEntryPoints))
+ {
+ moveEntryPointUniformParamsToGlobalScope(irModule);
#if 0
- dumpIRIfEnabled(codeGenContext, irModule, "ENTRY POINT UNIFORMS MOVED");
+ dumpIRIfEnabled(codeGenContext, irModule, "ENTRY POINT UNIFORMS MOVED");
#endif
+ }
validateIRModuleIfEnabled(codeGenContext, irModule);
break;
case CodeGenTarget::HostCPPSource:
diff --git a/source/slang/slang-options.cpp b/source/slang/slang-options.cpp
index fa185d54a..8320e4512 100644
--- a/source/slang/slang-options.cpp
+++ b/source/slang/slang-options.cpp
@@ -934,6 +934,10 @@ void initCommandOptions(CommandOptions& options)
"-embed-downstream-ir",
nullptr,
"Embed downstream IR into emitted slang IR"},
+ {OptionKind::PlainFunctionEntryPoints,
+ "-plain-function-entry-points",
+ nullptr,
+ "Keep entry points as plain functions without moving uniform parameters into global constant buffers"},
};
_addOptions(makeConstArrayView(experimentalOpts), options);
@@ -2279,6 +2283,7 @@ SlangResult OptionsParser::_parse(int argc, char const* const* argv)
case OptionKind::IncompleteLibrary:
case OptionKind::NoHLSLBinding:
case OptionKind::NoHLSLPackConstantBufferElements:
+ case OptionKind::PlainFunctionEntryPoints:
case OptionKind::LoopInversion:
case OptionKind::UnscopedEnum:
case OptionKind::PreserveParameters: