1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
commit 0f5a49961975089977de7207c063cc58df04028e
Author: yum <yum.food.vr@gmail.com>
Date: Sat Oct 11 13:34:03 2025 -0700
Optionally disable entry point param cbuffer transform
diff --git a/include/slang.h b/include/slang.h
index a3ed2112a..abb1c967e 100644
--- a/include/slang.h
+++ b/include/slang.h
@@ -1004,6 +1004,7 @@ typedef uint32_t SlangSizeT;
NoMangle,
NoHLSLBinding,
NoHLSLPackConstantBufferElements,
+ PlainFunctionEntryPoints,
ValidateUniformity,
AllowGLSL,
EnableExperimentalPasses,
diff --git a/source/slang/slang-emit-hlsl.cpp b/source/slang/slang-emit-hlsl.cpp
index a5d634ebf..bd12335da 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)
{
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp
index 1bd1f8b5c..0a64199ed 100644
--- a/source/slang/slang-emit.cpp
+++ b/source/slang/slang-emit.cpp
@@ -829,6 +829,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;
@@ -861,10 +862,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:
|