summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-emit.cpp')
-rw-r--r--source/slang/slang-emit.cpp62
1 files changed, 57 insertions, 5 deletions
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp
index d35acf4df..63bf8f054 100644
--- a/source/slang/slang-emit.cpp
+++ b/source/slang/slang-emit.cpp
@@ -9,6 +9,9 @@
#include "slang-ir-collect-global-uniforms.h"
#include "slang-ir-dce.h"
#include "slang-ir-entry-point-uniforms.h"
+#include "slang-ir-entry-point-raw-ptr-params.h"
+#include "slang-ir-explicit-global-context.h"
+#include "slang-ir-explicit-global-init.h"
#include "slang-ir-glsl-legalize.h"
#include "slang-ir-insts.h"
#include "slang-ir-legalize-varying-params.h"
@@ -255,11 +258,42 @@ Result linkAndOptimizeIR(
// parameters of a shader entry point and move them into
// the global scope instead.
//
- moveEntryPointUniformParamsToGlobalScope(irModule);
-#if 0
- dumpIRIfEnabled(compileRequest, irModule, "ENTRY POINT UNIFORMS MOVED");
-#endif
- validateIRModuleIfEnabled(compileRequest, irModule);
+ // TODO: We should skip this step for CUDA targets.
+ //
+ {
+ CollectEntryPointUniformParamsOptions passOptions;
+ switch( target )
+ {
+ default:
+ break;
+
+ case CodeGenTarget::CPPSource:
+ case CodeGenTarget::CUDASource:
+ passOptions.alwaysCreateCollectedParam = true;
+ break;
+ }
+
+ collectEntryPointUniformParams(irModule, passOptions);
+ #if 0
+ dumpIRIfEnabled(compileRequest, irModule, "ENTRY POINT UNIFORMS COLLECTED");
+ #endif
+ validateIRModuleIfEnabled(compileRequest, irModule);
+ }
+
+ switch( target )
+ {
+ default:
+ moveEntryPointUniformParamsToGlobalScope(irModule);
+ #if 0
+ dumpIRIfEnabled(compileRequest, irModule, "ENTRY POINT UNIFORMS MOVED");
+ #endif
+ validateIRModuleIfEnabled(compileRequest, irModule);
+ break;
+
+ case CodeGenTarget::CPPSource:
+ case CodeGenTarget::CUDASource:
+ break;
+ }
// Desguar any union types, since these will be illegal on
@@ -608,6 +642,24 @@ Result linkAndOptimizeIR(
break;
}
+
+ switch( target )
+ {
+ default:
+ break;
+
+ case CodeGenTarget::CPPSource:
+ case CodeGenTarget::CUDASource:
+ moveGlobalVarInitializationToEntryPoints(irModule);
+ introduceExplicitGlobalContext(irModule, target);
+ convertEntryPointPtrParamsToRawPtrs(irModule);
+ #if 0
+ dumpIRIfEnabled(compileRequest, irModule, "EXPLICIT GLOBAL CONTEXT INTRODUCED");
+ #endif
+ validateIRModuleIfEnabled(compileRequest, irModule);
+ break;
+ }
+
if (!compileRequest->allowDynamicCode)
{
// For all targets that don't support true dynamic dispatch through