diff options
| author | Yong He <yonghe@outlook.com> | 2022-02-28 18:09:27 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-28 18:09:27 -0800 |
| commit | e6c9625e0f0d5d9703451fd2ebb8b206d210009c (patch) | |
| tree | ad2c46f5e9a5f7a6e67cacf5b7227d726f392088 /source/slang | |
| parent | c31577953d5041c82375c22d847c2eba06106c58 (diff) | |
Use GLSL scalar layout for constant buffers. (#2147)
Diffstat (limited to 'source/slang')
| -rw-r--r-- | source/slang/slang-emit-glsl.cpp | 10 | ||||
| -rw-r--r-- | source/slang/slang-parameter-binding.cpp | 9 | ||||
| -rw-r--r-- | source/slang/slang-type-layout.cpp | 71 | ||||
| -rw-r--r-- | source/slang/slang-type-layout.h | 6 |
4 files changed, 57 insertions, 39 deletions
diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp index 44326a18e..044f93569 100644 --- a/source/slang/slang-emit-glsl.cpp +++ b/source/slang/slang-emit-glsl.cpp @@ -290,14 +290,18 @@ void GLSLSourceEmitter::_emitGLSLParameterGroup(IRGlobalParam* varDecl, IRUnifor } else if (as<IRGLSLShaderStorageBufferType>(type)) { - // Is writable - m_writer->emit("layout(std430) buffer "); + // Is writable + m_writer->emit("layout("); + m_writer->emit(m_targetRequest->getForceGLSLScalarBufferLayout() ? "scalar" : "std430"); + m_writer->emit(") buffer "); } // TODO: what to do with HLSL `tbuffer` style buffers? else { // uniform is implicitly read only - m_writer->emit("layout(std140) uniform "); + m_writer->emit("layout("); + m_writer->emit(m_targetRequest->getForceGLSLScalarBufferLayout() ? "scalar" : "std140"); + m_writer->emit(") uniform "); } // Generate a dummy name for the block diff --git a/source/slang/slang-parameter-binding.cpp b/source/slang/slang-parameter-binding.cpp index abbc010f8..7fbc59dc7 100644 --- a/source/slang/slang-parameter-binding.cpp +++ b/source/slang/slang-parameter-binding.cpp @@ -678,7 +678,7 @@ RefPtr<TypeLayout> getTypeLayoutForGlobalShaderParameter( // An "ordinary" global variable is implicitly a uniform // shader parameter. return createTypeLayout( - layoutContext.with(rules->getConstantBufferRules()), + layoutContext.with(rules->getConstantBufferRules(context->getTargetRequest())), type); } @@ -2080,7 +2080,8 @@ static RefPtr<TypeLayout> computeEntryPointParameterTypeLayout( // constant buffer (e.g., the `$Params` constant buffer seen in fxc/dxc output). // return createTypeLayout( - context->layoutContext.with(context->getRulesFamily()->getConstantBufferRules()), + context->layoutContext.with( + context->getRulesFamily()->getConstantBufferRules(context->getTargetRequest())), paramType); } else @@ -2431,7 +2432,9 @@ static ParameterBindingAndKindInfo maybeAllocateConstantBufferBinding( UInt space = context->shared->defaultSpace; auto usedRangeSet = findUsedRangeSetForSpace(context, space); - auto layoutInfo = context->getRulesFamily()->getConstantBufferRules()->GetObjectLayout( + auto layoutInfo = context->getRulesFamily() + ->getConstantBufferRules(context->getTargetRequest()) + ->GetObjectLayout( ShaderParameterKind::ConstantBuffer); ParameterBindingAndKindInfo info; diff --git a/source/slang/slang-type-layout.cpp b/source/slang/slang-type-layout.cpp index e59573cef..b48e70eae 100644 --- a/source/slang/slang-type-layout.cpp +++ b/source/slang/slang-type-layout.cpp @@ -767,14 +767,14 @@ CUDARayTracingLayoutRulesImpl kCUDAHitAttributesParameterLayoutRulesImpl(LayoutR struct GLSLLayoutRulesFamilyImpl : LayoutRulesFamilyImpl { virtual LayoutRulesImpl* getAnyValueRules() override; - virtual LayoutRulesImpl* getConstantBufferRules() override; + virtual LayoutRulesImpl* getConstantBufferRules(TargetRequest* request) override; virtual LayoutRulesImpl* getPushConstantBufferRules() override; virtual LayoutRulesImpl* getTextureBufferRules() override; virtual LayoutRulesImpl* getVaryingInputRules() override; virtual LayoutRulesImpl* getVaryingOutputRules() override; virtual LayoutRulesImpl* getSpecializationConstantRules() override; virtual LayoutRulesImpl* getShaderStorageBufferRules(TargetRequest* request) override; - virtual LayoutRulesImpl* getParameterBlockRules() override; + virtual LayoutRulesImpl* getParameterBlockRules(TargetRequest* request) override; LayoutRulesImpl* getRayPayloadParameterRules() override; LayoutRulesImpl* getCallablePayloadParameterRules() override; @@ -782,20 +782,20 @@ struct GLSLLayoutRulesFamilyImpl : LayoutRulesFamilyImpl LayoutRulesImpl* getShaderRecordConstantBufferRules() override; - LayoutRulesImpl* getStructuredBufferRules() override; + LayoutRulesImpl* getStructuredBufferRules(TargetRequest* request) override; }; struct HLSLLayoutRulesFamilyImpl : LayoutRulesFamilyImpl { virtual LayoutRulesImpl* getAnyValueRules() override; - virtual LayoutRulesImpl* getConstantBufferRules() override; + virtual LayoutRulesImpl* getConstantBufferRules(TargetRequest* request) override; virtual LayoutRulesImpl* getPushConstantBufferRules() override; virtual LayoutRulesImpl* getTextureBufferRules() override; virtual LayoutRulesImpl* getVaryingInputRules() override; virtual LayoutRulesImpl* getVaryingOutputRules() override; virtual LayoutRulesImpl* getSpecializationConstantRules() override; virtual LayoutRulesImpl* getShaderStorageBufferRules(TargetRequest* request) override; - virtual LayoutRulesImpl* getParameterBlockRules() override; + virtual LayoutRulesImpl* getParameterBlockRules(TargetRequest* request) override; LayoutRulesImpl* getRayPayloadParameterRules() override; LayoutRulesImpl* getCallablePayloadParameterRules() override; @@ -803,47 +803,47 @@ struct HLSLLayoutRulesFamilyImpl : LayoutRulesFamilyImpl LayoutRulesImpl* getShaderRecordConstantBufferRules() override; - LayoutRulesImpl* getStructuredBufferRules() override; + LayoutRulesImpl* getStructuredBufferRules(TargetRequest* request) override; }; struct CPULayoutRulesFamilyImpl : LayoutRulesFamilyImpl { virtual LayoutRulesImpl* getAnyValueRules() override; - virtual LayoutRulesImpl* getConstantBufferRules() override; + virtual LayoutRulesImpl* getConstantBufferRules(TargetRequest* request) override; virtual LayoutRulesImpl* getPushConstantBufferRules() override; virtual LayoutRulesImpl* getTextureBufferRules() override; virtual LayoutRulesImpl* getVaryingInputRules() override; virtual LayoutRulesImpl* getVaryingOutputRules() override; virtual LayoutRulesImpl* getSpecializationConstantRules() override; virtual LayoutRulesImpl* getShaderStorageBufferRules(TargetRequest* request) override; - virtual LayoutRulesImpl* getParameterBlockRules() override; + virtual LayoutRulesImpl* getParameterBlockRules(TargetRequest* request) override; LayoutRulesImpl* getRayPayloadParameterRules() override; LayoutRulesImpl* getCallablePayloadParameterRules() override; LayoutRulesImpl* getHitAttributesParameterRules() override; LayoutRulesImpl* getShaderRecordConstantBufferRules() override; - LayoutRulesImpl* getStructuredBufferRules() override; + LayoutRulesImpl* getStructuredBufferRules(TargetRequest* request) override; }; struct CUDALayoutRulesFamilyImpl : LayoutRulesFamilyImpl { virtual LayoutRulesImpl* getAnyValueRules() override; - virtual LayoutRulesImpl* getConstantBufferRules() override; + virtual LayoutRulesImpl* getConstantBufferRules(TargetRequest* request) override; virtual LayoutRulesImpl* getPushConstantBufferRules() override; virtual LayoutRulesImpl* getTextureBufferRules() override; virtual LayoutRulesImpl* getVaryingInputRules() override; virtual LayoutRulesImpl* getVaryingOutputRules() override; virtual LayoutRulesImpl* getSpecializationConstantRules() override; virtual LayoutRulesImpl* getShaderStorageBufferRules(TargetRequest* request) override; - virtual LayoutRulesImpl* getParameterBlockRules() override; + virtual LayoutRulesImpl* getParameterBlockRules(TargetRequest* request) override; LayoutRulesImpl* getRayPayloadParameterRules() override; LayoutRulesImpl* getCallablePayloadParameterRules() override; LayoutRulesImpl* getHitAttributesParameterRules() override; LayoutRulesImpl* getShaderRecordConstantBufferRules() override; - LayoutRulesImpl* getStructuredBufferRules() override; + LayoutRulesImpl* getStructuredBufferRules(TargetRequest* request) override; }; GLSLLayoutRulesFamilyImpl kGLSLLayoutRulesFamilyImpl; @@ -1013,6 +1013,12 @@ LayoutRulesImpl kStd430LayoutRulesImpl_ = { &kGLSLLayoutRulesFamilyImpl, &kStd430LayoutRulesImpl, &kGLSLObjectLayoutRulesImpl, }; +LayoutRulesImpl kScalarLayoutRulesImpl_ = { + &kGLSLLayoutRulesFamilyImpl, + &kDefaultLayoutRulesImpl, + &kGLSLObjectLayoutRulesImpl, +}; + LayoutRulesImpl kGLSLAnyValueLayoutRulesImpl_ = { &kGLSLLayoutRulesFamilyImpl, &kDefaultLayoutRulesImpl, @@ -1099,14 +1105,17 @@ LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getAnyValueRules() return &kGLSLAnyValueLayoutRulesImpl_; } -LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getConstantBufferRules() +LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getConstantBufferRules(TargetRequest* targetReq) { + if (targetReq->getForceGLSLScalarBufferLayout()) + return &kScalarLayoutRulesImpl_; return &kStd140LayoutRulesImpl_; } -LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getParameterBlockRules() +LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getParameterBlockRules(TargetRequest* targetReq) { - // TODO: actually pick something appropriate + if (targetReq->getForceGLSLScalarBufferLayout()) + return &kScalarLayoutRulesImpl_; return &kStd140LayoutRulesImpl_; } @@ -1143,7 +1152,7 @@ LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getSpecializationConstantRules() LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getShaderStorageBufferRules(TargetRequest* request) { if (request->getForceGLSLScalarBufferLayout()) - return &kHLSLStructuredBufferLayoutRulesImpl_; + return &kScalarLayoutRulesImpl_; return &kStd430LayoutRulesImpl_; } @@ -1162,8 +1171,10 @@ LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getHitAttributesParameterRules() return &kGLSLHitAttributesParameterLayoutRulesImpl_; } -LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getStructuredBufferRules() +LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getStructuredBufferRules(TargetRequest* targetReq) { + if (targetReq->getForceGLSLScalarBufferLayout()) + return &kScalarLayoutRulesImpl_; return &kGLSLStructuredBufferLayoutRulesImpl_; } @@ -1174,12 +1185,12 @@ LayoutRulesImpl* HLSLLayoutRulesFamilyImpl::getAnyValueRules() return &kHLSLAnyValueLayoutRulesImpl_; } -LayoutRulesImpl* HLSLLayoutRulesFamilyImpl::getConstantBufferRules() +LayoutRulesImpl* HLSLLayoutRulesFamilyImpl::getConstantBufferRules(TargetRequest*) { return &kHLSLConstantBufferLayoutRulesImpl_; } -LayoutRulesImpl* HLSLLayoutRulesFamilyImpl::getParameterBlockRules() +LayoutRulesImpl* HLSLLayoutRulesFamilyImpl::getParameterBlockRules(TargetRequest*) { // TODO: actually pick something appropriate... return &kHLSLConstantBufferLayoutRulesImpl_; @@ -1196,7 +1207,7 @@ LayoutRulesImpl* HLSLLayoutRulesFamilyImpl::getShaderRecordConstantBufferRules() return &kHLSLConstantBufferLayoutRulesImpl_; } -LayoutRulesImpl* HLSLLayoutRulesFamilyImpl::getStructuredBufferRules() +LayoutRulesImpl* HLSLLayoutRulesFamilyImpl::getStructuredBufferRules(TargetRequest*) { return &kHLSLStructuredBufferLayoutRulesImpl_; } @@ -1248,7 +1259,7 @@ LayoutRulesImpl* CPULayoutRulesFamilyImpl::getAnyValueRules() return &kCPUAnyValueLayoutRulesImpl_; } -LayoutRulesImpl* CPULayoutRulesFamilyImpl::getConstantBufferRules() +LayoutRulesImpl* CPULayoutRulesFamilyImpl::getConstantBufferRules(TargetRequest*) { return &kCPULayoutRulesImpl_; } @@ -1279,7 +1290,7 @@ LayoutRulesImpl* CPULayoutRulesFamilyImpl::getShaderStorageBufferRules(TargetReq { return nullptr; } -LayoutRulesImpl* CPULayoutRulesFamilyImpl::getParameterBlockRules() +LayoutRulesImpl* CPULayoutRulesFamilyImpl::getParameterBlockRules(TargetRequest*) { // Not clear - just use similar to CPU return &kCPULayoutRulesImpl_; @@ -1302,7 +1313,7 @@ LayoutRulesImpl* CPULayoutRulesFamilyImpl::getShaderRecordConstantBufferRules() return &kCPULayoutRulesImpl_; } -LayoutRulesImpl* CPULayoutRulesFamilyImpl::getStructuredBufferRules() +LayoutRulesImpl* CPULayoutRulesFamilyImpl::getStructuredBufferRules(TargetRequest*) { return &kCPULayoutRulesImpl_; } @@ -1314,7 +1325,7 @@ LayoutRulesImpl* CUDALayoutRulesFamilyImpl::getAnyValueRules() return &kCUDAAnyValueLayoutRulesImpl_; } -LayoutRulesImpl* CUDALayoutRulesFamilyImpl::getConstantBufferRules() +LayoutRulesImpl* CUDALayoutRulesFamilyImpl::getConstantBufferRules(TargetRequest*) { return &kCUDALayoutRulesImpl_; } @@ -1345,7 +1356,7 @@ LayoutRulesImpl* CUDALayoutRulesFamilyImpl::getShaderStorageBufferRules(TargetRe { return nullptr; } -LayoutRulesImpl* CUDALayoutRulesFamilyImpl::getParameterBlockRules() +LayoutRulesImpl* CUDALayoutRulesFamilyImpl::getParameterBlockRules(TargetRequest*) { // Not clear - just use similar to CPU return &kCUDALayoutRulesImpl_; @@ -1369,7 +1380,7 @@ LayoutRulesImpl* CUDALayoutRulesFamilyImpl::getShaderRecordConstantBufferRules() return &kCUDALayoutRulesImpl_; } -LayoutRulesImpl* CUDALayoutRulesFamilyImpl::getStructuredBufferRules() +LayoutRulesImpl* CUDALayoutRulesFamilyImpl::getStructuredBufferRules(TargetRequest*) { return &kCUDALayoutRulesImpl_; } @@ -1436,7 +1447,7 @@ TypeLayoutContext getInitialLayoutContextForTarget(TargetRequest* targetReq, Pro if( rulesFamily ) { - context.rules = rulesFamily->getConstantBufferRules(); + context.rules = rulesFamily->getConstantBufferRules(targetReq); } return context; @@ -2545,7 +2556,7 @@ LayoutRulesImpl* getParameterBufferElementTypeLayoutRules( { if( as<ConstantBufferType>(parameterGroupType) ) { - return rules->getLayoutRulesFamily()->getConstantBufferRules(); + return rules->getLayoutRulesFamily()->getConstantBufferRules(targetRequest); } else if( as<TextureBufferType>(parameterGroupType) ) { @@ -2565,7 +2576,7 @@ LayoutRulesImpl* getParameterBufferElementTypeLayoutRules( } else if (as<ParameterBlockType>(parameterGroupType)) { - return rules->getLayoutRulesFamily()->getParameterBlockRules(); + return rules->getLayoutRulesFamily()->getParameterBlockRules(targetRequest); } else { @@ -2647,7 +2658,7 @@ createStructuredBufferTypeLayout( Type* elementType) { // look up the appropriate rules via the `LayoutRulesFamily` - auto structuredBufferLayoutRules = context.getRulesFamily()->getStructuredBufferRules(); + auto structuredBufferLayoutRules = context.getRulesFamily()->getStructuredBufferRules(context.targetReq); // Create and save type layout for the buffer contents. auto elementTypeLayout = createTypeLayout( diff --git a/source/slang/slang-type-layout.h b/source/slang/slang-type-layout.h index 219dfad0f..e0b391232 100644 --- a/source/slang/slang-type-layout.h +++ b/source/slang/slang-type-layout.h @@ -995,14 +995,14 @@ struct LayoutRulesImpl struct LayoutRulesFamilyImpl { virtual LayoutRulesImpl* getAnyValueRules() = 0; - virtual LayoutRulesImpl* getConstantBufferRules() = 0; + virtual LayoutRulesImpl* getConstantBufferRules(TargetRequest* request) = 0; virtual LayoutRulesImpl* getPushConstantBufferRules() = 0; virtual LayoutRulesImpl* getTextureBufferRules() = 0; virtual LayoutRulesImpl* getVaryingInputRules() = 0; virtual LayoutRulesImpl* getVaryingOutputRules() = 0; virtual LayoutRulesImpl* getSpecializationConstantRules()= 0; virtual LayoutRulesImpl* getShaderStorageBufferRules(TargetRequest* request) = 0; - virtual LayoutRulesImpl* getParameterBlockRules() = 0; + virtual LayoutRulesImpl* getParameterBlockRules(TargetRequest* request) = 0; virtual LayoutRulesImpl* getRayPayloadParameterRules() = 0; virtual LayoutRulesImpl* getCallablePayloadParameterRules() = 0; @@ -1010,7 +1010,7 @@ struct LayoutRulesFamilyImpl virtual LayoutRulesImpl* getShaderRecordConstantBufferRules() = 0; - virtual LayoutRulesImpl* getStructuredBufferRules() = 0; + virtual LayoutRulesImpl* getStructuredBufferRules(TargetRequest* request) = 0; }; struct TypeLayoutContext |
