diff options
Diffstat (limited to 'source/slang/slang-emit.cpp')
| -rw-r--r-- | source/slang/slang-emit.cpp | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp index e1689ccfc..f1cc6090d 100644 --- a/source/slang/slang-emit.cpp +++ b/source/slang/slang-emit.cpp @@ -97,6 +97,7 @@ #include "slang-ir-restructure.h" #include "slang-ir-sccp.h" #include "slang-ir-simplify-for-emit.h" +#include "slang-ir-specialize-address-space.h" #include "slang-ir-specialize-arrays.h" #include "slang-ir-specialize-buffer-load-arg.h" #include "slang-ir-specialize-matrix-layout.h" @@ -1715,6 +1716,7 @@ Result linkAndOptimizeIR( if (targetProgram->getOptionSet().getBoolOption( CompilerOptionName::EnableExperimentalPasses)) introduceExplicitGlobalContext(irModule, target); + transformParamsToConstRef(irModule, codeGenContext->getSink()); #if 0 dumpIRIfEnabled(codeGenContext, irModule, "EXPLICIT GLOBAL CONTEXT INTRODUCED"); #endif @@ -1812,11 +1814,11 @@ Result linkAndOptimizeIR( if (requiredLoweringPassSet.meshOutput) legalizeMeshOutputTypes(irModule); - BufferElementTypeLoweringOptions bufferElementTypeLoweringOptions; - bufferElementTypeLoweringOptions.use16ByteArrayElementForConstantBuffer = - isWGPUTarget(targetRequest); - lowerBufferElementTypeToStorageType(targetProgram, irModule, bufferElementTypeLoweringOptions); - performForceInlining(irModule); + + // Lower all bit_cast operations on complex types into leaf-level + // bit_cast on basic types. + if (requiredLoweringPassSet.bitcast) + lowerBitCast(targetProgram, irModule, sink); // Rewrite functions that return arrays to return them via `out` parameter, // since our target languages doesn't allow returning arrays. @@ -1832,13 +1834,28 @@ Result linkAndOptimizeIR( rcpWOfPositionInput(irModule); } - // Lower all bit_cast operations on complex types into leaf-level - // bit_cast on basic types. - if (requiredLoweringPassSet.bitcast) - lowerBitCast(targetProgram, irModule, sink); - bool emitSpirvDirectly = targetProgram->shouldEmitSPIRVDirectly(); + BufferElementTypeLoweringOptions bufferElementTypeLoweringOptions; + bufferElementTypeLoweringOptions.use16ByteArrayElementForConstantBuffer = + isWGPUTarget(targetRequest); + lowerBufferElementTypeToStorageType(targetProgram, irModule, bufferElementTypeLoweringOptions); + + // If we are generating code for glsl or metal, perform address space propagation now. + // For SPIRV, we will do that during spirv legalization that happens after + // `linkAndOptimizeIR`. + if (target == CodeGenTarget::GLSL) + { + NoOpInitialAddressSpaceAssigner addrSpaceAssigner; + specializeAddressSpace(irModule, &addrSpaceAssigner); + } + else if (isMetalTarget(targetRequest)) + { + specializeAddressSpaceForMetal(irModule); + } + + performForceInlining(irModule); + if (emitSpirvDirectly) { performIntrinsicFunctionInlining(irModule); |
