From 35f8e092f2aa3ed5e3cf03387e712f798ff4850e Mon Sep 17 00:00:00 2001 From: Julius Ikkala Date: Thu, 21 Aug 2025 08:47:18 +0300 Subject: Introduce CDataLayout & -fvk-use-c-layout (#8136) Closes #8112. ~~The issue asks for a "C layout", but in this PR I use the term "CPU layout" because this naming was pre-existing in the codebase as `kCPULayoutRulesImpl_`. The primary purpose of this layout is to match CPU-side struct definitions with the shader side. I'm open to better naming suggestions, though.~~ Edit: switched back to using `CDataLayout` & `-fvk-use-c-layout`, as the CPU target depends on the object layout rules of existing CPU layout rules, but they're incompatible with actual shaders. So a new `kCLayoutRulesImpl_` was needed anyway. --------- Co-authored-by: Ellie Hermaszewska --- source/slang/slang-type-layout.cpp | 163 +++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) (limited to 'source/slang/slang-type-layout.cpp') diff --git a/source/slang/slang-type-layout.cpp b/source/slang/slang-type-layout.cpp index 275a178d0..3e2560755 100644 --- a/source/slang/slang-type-layout.cpp +++ b/source/slang/slang-type-layout.cpp @@ -1090,6 +1090,29 @@ struct CPULayoutRulesFamilyImpl : LayoutRulesFamilyImpl LayoutRulesImpl* getStructuredBufferRules(CompilerOptionSet& compilerOptions) override; }; +struct CLayoutRulesFamilyImpl : LayoutRulesFamilyImpl +{ + virtual LayoutRulesImpl* getAnyValueRules() override; + virtual LayoutRulesImpl* getConstantBufferRules( + CompilerOptionSet& compilerOptions, + Type* containerType) override; + virtual LayoutRulesImpl* getPushConstantBufferRules() override; + virtual LayoutRulesImpl* getTextureBufferRules(CompilerOptionSet& compilerOptions) override; + virtual LayoutRulesImpl* getVaryingInputRules() override; + virtual LayoutRulesImpl* getVaryingOutputRules() override; + virtual LayoutRulesImpl* getSpecializationConstantRules() override; + virtual LayoutRulesImpl* getShaderStorageBufferRules( + CompilerOptionSet& compilerOptions) override; + virtual LayoutRulesImpl* getParameterBlockRules(CompilerOptionSet& compilerOptions) override; + + LayoutRulesImpl* getRayPayloadParameterRules() override; + LayoutRulesImpl* getCallablePayloadParameterRules() override; + LayoutRulesImpl* getHitAttributesParameterRules() override; + + LayoutRulesImpl* getShaderRecordConstantBufferRules() override; + LayoutRulesImpl* getStructuredBufferRules(CompilerOptionSet& compilerOptions) override; +}; + struct CUDALayoutRulesFamilyImpl : LayoutRulesFamilyImpl { virtual LayoutRulesImpl* getAnyValueRules() override; @@ -1170,6 +1193,7 @@ struct WGSLLayoutRulesFamilyImpl : LayoutRulesFamilyImpl GLSLLayoutRulesFamilyImpl kGLSLLayoutRulesFamilyImpl; HLSLLayoutRulesFamilyImpl kHLSLLayoutRulesFamilyImpl; CPULayoutRulesFamilyImpl kCPULayoutRulesFamilyImpl; +CLayoutRulesFamilyImpl kCLayoutRulesFamilyImpl; CUDALayoutRulesFamilyImpl kCUDALayoutRulesFamilyImpl; MetalLayoutRulesFamilyImpl kMetalLayoutRulesFamilyImpl; MetalArgumentBufferTier2LayoutRulesFamilyImpl kMetalArgumentBufferTier2LayoutRulesFamilyImpl; @@ -1341,6 +1365,69 @@ LayoutRulesImpl kCPUAnyValueLayoutRulesImpl_ = { &kCPUObjectLayoutRulesImpl, }; +// C layout + +LayoutRulesImpl kCLayoutRulesImpl_ = { + &kCLayoutRulesFamilyImpl, + &kCPULayoutRulesImpl, + &kGLSLObjectLayoutRulesImpl, +}; + +LayoutRulesImpl kCAnyValueLayoutRulesImpl_ = { + &kCLayoutRulesFamilyImpl, + &kDefaultLayoutRulesImpl, + &kCPUObjectLayoutRulesImpl, +}; + +LayoutRulesImpl kCPushConstantRulesImpl_ = { + &kCLayoutRulesFamilyImpl, + &kCPULayoutRulesImpl, + &kGLSLPushConstantBufferObjectLayoutRulesImpl_, +}; + +LayoutRulesImpl kCVaryingInputLayoutRulesImpl_ = { + &kCLayoutRulesFamilyImpl, + &kGLSLVaryingOutputLayoutRulesImpl, + &kGLSLObjectLayoutRulesImpl, +}; + +LayoutRulesImpl kCVaryingOutputLayoutRulesImpl_ = { + &kCLayoutRulesFamilyImpl, + &kGLSLVaryingOutputLayoutRulesImpl, + &kGLSLObjectLayoutRulesImpl, +}; + +LayoutRulesImpl kCSpecializationConstantLayoutRulesImpl_ = { + &kCLayoutRulesFamilyImpl, + &kGLSLSpecializationConstantLayoutRulesImpl, + &kGLSLObjectLayoutRulesImpl, +}; + +LayoutRulesImpl kCShaderRecordLayoutRulesImpl_ = { + &kCLayoutRulesFamilyImpl, + &kCPULayoutRulesImpl, + &kGLSLShaderRecordConstantBufferObjectLayoutRulesImpl_, +}; + +LayoutRulesImpl kCRayPayloadParameterLayoutRulesImpl_ = { + &kCLayoutRulesFamilyImpl, + &kGLSLRayPayloadParameterLayoutRulesImpl, + &kGLSLObjectLayoutRulesImpl, +}; + +LayoutRulesImpl kCCallablePayloadParameterLayoutRulesImpl_ = { + &kCLayoutRulesFamilyImpl, + &kGLSLCallablePayloadParameterLayoutRulesImpl, + &kGLSLObjectLayoutRulesImpl, +}; + +LayoutRulesImpl kCHitAttributesParameterLayoutRulesImpl_ = { + &kCLayoutRulesFamilyImpl, + &kGLSLHitAttributesParameterLayoutRulesImpl, + &kGLSLObjectLayoutRulesImpl, +}; + + // CUDA static CUDAObjectLayoutRulesImpl kCUDAObjectLayoutRulesImpl; @@ -1534,6 +1621,8 @@ LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getConstantBufferRules( { if (compilerOptions.shouldUseScalarLayout()) return &kScalarLayoutRulesImpl_; + else if (compilerOptions.shouldUseCLayout()) + return &kCLayoutRulesImpl_; else if (compilerOptions.shouldUseDXLayout()) return &kFXCConstantBufferLayoutRulesFamilyImpl; if (auto cbufferType = as(containerType)) @@ -1548,6 +1637,8 @@ LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getConstantBufferRules( return &kStd430LayoutRulesImpl_; case ASTNodeType::ScalarDataLayoutType: return &kScalarLayoutRulesImpl_; + case ASTNodeType::CDataLayoutType: + return &kCLayoutRulesImpl_; default: break; } @@ -1560,6 +1651,8 @@ LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getParameterBlockRules( { if (compilerOptions.shouldUseScalarLayout()) return &kScalarLayoutRulesImpl_; + else if (compilerOptions.shouldUseCLayout()) + return &kCLayoutRulesImpl_; else if (compilerOptions.shouldUseDXLayout()) return &kFXCConstantBufferLayoutRulesFamilyImpl; @@ -1581,6 +1674,8 @@ LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getTextureBufferRules( { if (compilerOptions.shouldUseScalarLayout()) return &kScalarLayoutRulesImpl_; + else if (compilerOptions.shouldUseCLayout()) + return &kCLayoutRulesImpl_; else if (compilerOptions.shouldUseDXLayout()) return &kFXCConstantBufferLayoutRulesFamilyImpl; @@ -1607,6 +1702,8 @@ LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getShaderStorageBufferRules( { if (compilerOptions.shouldUseScalarLayout()) return &kScalarLayoutRulesImpl_; + else if (compilerOptions.shouldUseCLayout()) + return &kCLayoutRulesImpl_; else if (compilerOptions.shouldUseDXLayout()) return &kFXCShaderResourceLayoutRulesFamilyImpl; @@ -1633,6 +1730,8 @@ LayoutRulesImpl* GLSLLayoutRulesFamilyImpl::getStructuredBufferRules( { if (compilerOptions.shouldUseScalarLayout()) return &kScalarLayoutRulesImpl_; + else if (compilerOptions.shouldUseCLayout()) + return &kCLayoutRulesImpl_; else if (compilerOptions.shouldUseDXLayout()) return &kFXCShaderResourceLayoutRulesFamilyImpl; @@ -1779,6 +1878,70 @@ LayoutRulesImpl* CPULayoutRulesFamilyImpl::getStructuredBufferRules(CompilerOpti return &kCPULayoutRulesImpl_; } +// C compatible layout family + +LayoutRulesImpl* CLayoutRulesFamilyImpl::getAnyValueRules() +{ + return &kCAnyValueLayoutRulesImpl_; +} + +LayoutRulesImpl* CLayoutRulesFamilyImpl::getConstantBufferRules(CompilerOptionSet&, Type*) +{ + return &kCLayoutRulesImpl_; +} + +LayoutRulesImpl* CLayoutRulesFamilyImpl::getPushConstantBufferRules() +{ + return &kCPushConstantRulesImpl_; +} + +LayoutRulesImpl* CLayoutRulesFamilyImpl::getTextureBufferRules(CompilerOptionSet&) +{ + return &kCLayoutRulesImpl_; +} + +LayoutRulesImpl* CLayoutRulesFamilyImpl::getVaryingInputRules() +{ + return &kCVaryingInputLayoutRulesImpl_; +} +LayoutRulesImpl* CLayoutRulesFamilyImpl::getVaryingOutputRules() +{ + return &kCVaryingOutputLayoutRulesImpl_; +} +LayoutRulesImpl* CLayoutRulesFamilyImpl::getSpecializationConstantRules() +{ + return &kCSpecializationConstantLayoutRulesImpl_; +} +LayoutRulesImpl* CLayoutRulesFamilyImpl::getShaderStorageBufferRules(CompilerOptionSet&) +{ + return &kCLayoutRulesImpl_; +} +LayoutRulesImpl* CLayoutRulesFamilyImpl::getParameterBlockRules(CompilerOptionSet&) +{ + return &kCLayoutRulesImpl_; +} +LayoutRulesImpl* CLayoutRulesFamilyImpl::getRayPayloadParameterRules() +{ + return &kCRayPayloadParameterLayoutRulesImpl_; +} +LayoutRulesImpl* CLayoutRulesFamilyImpl::getCallablePayloadParameterRules() +{ + return &kCCallablePayloadParameterLayoutRulesImpl_; +} +LayoutRulesImpl* CLayoutRulesFamilyImpl::getHitAttributesParameterRules() +{ + return &kCHitAttributesParameterLayoutRulesImpl_; +} +LayoutRulesImpl* CLayoutRulesFamilyImpl::getShaderRecordConstantBufferRules() +{ + return &kCShaderRecordLayoutRulesImpl_; +} + +LayoutRulesImpl* CLayoutRulesFamilyImpl::getStructuredBufferRules(CompilerOptionSet&) +{ + return &kCLayoutRulesImpl_; +} + // CUDA Family LayoutRulesImpl* CUDALayoutRulesFamilyImpl::getAnyValueRules() -- cgit v1.2.3