diff options
| author | Yong He <yonghe@outlook.com> | 2024-09-05 10:26:59 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-05 10:26:59 -0700 |
| commit | a88055c6f5190ca62bb4aa853b4f0fa11546278f (patch) | |
| tree | 0f4a417153110d43cf361c0abe29c8996b806f3c /source/slang/slang-type-layout.cpp | |
| parent | 959f55de964ff108947db72a3f8d25b39995f2c8 (diff) | |
Respect matrix layout in uniform and in/out parameters for HLSL target. (#5013)
* Respect matrix layout in uniform and in/out parameters for HLSL target.
* Update test.
* Fix test.
* fix test.
* Fix metal layout calculation.
* Fix compile error.
* Fix compiler error.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-type-layout.cpp')
| -rw-r--r-- | source/slang/slang-type-layout.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/source/slang/slang-type-layout.cpp b/source/slang/slang-type-layout.cpp index 7d6d047d3..f654135a1 100644 --- a/source/slang/slang-type-layout.cpp +++ b/source/slang/slang-type-layout.cpp @@ -606,6 +606,28 @@ struct CUDALayoutRulesImpl : DefaultLayoutRulesImpl } }; +struct MetalLayoutRulesImpl : public CPULayoutRulesImpl +{ + SimpleLayoutInfo GetVectorLayout(BaseType elementType, SimpleLayoutInfo elementInfo, size_t elementCount) override + { + SLANG_UNUSED(elementType); + + const auto elementSize = elementInfo.size.getFiniteValue(); + auto alignedElementCount = 1 << Math::Log2Ceil((uint32_t)elementCount); + + // Metal aligns vectors to 2/4 element boundaries. + size_t size = elementSize * elementCount; + size_t alignment = alignedElementCount * elementSize; + + SimpleLayoutInfo vectorInfo; + vectorInfo.kind = elementInfo.kind; + vectorInfo.size = size; + vectorInfo.alignment = alignment; + + return vectorInfo; + } +}; + struct HLSLStructuredBufferLayoutRulesImpl : DefaultLayoutRulesImpl { // HLSL structured buffers drop the restrictions added for constant buffers, @@ -1696,6 +1718,7 @@ struct MetalArgumentBufferElementLayoutRulesImpl : ObjectLayoutRulesImpl, Defaul static MetalObjectLayoutRulesImpl kMetalObjectLayoutRulesImpl; static MetalArgumentBufferElementLayoutRulesImpl kMetalArgumentBufferElementLayoutRulesImpl; +static MetalLayoutRulesImpl kMetalLayoutRulesImpl; LayoutRulesImpl kMetalAnyValueLayoutRulesImpl_ = { &kMetalLayoutRulesFamilyImpl, @@ -1704,7 +1727,7 @@ LayoutRulesImpl kMetalAnyValueLayoutRulesImpl_ = { }; LayoutRulesImpl kMetalConstantBufferLayoutRulesImpl_ = { - &kMetalLayoutRulesFamilyImpl, & kCPULayoutRulesImpl, &kMetalObjectLayoutRulesImpl, + &kMetalLayoutRulesFamilyImpl, & kMetalLayoutRulesImpl, &kMetalObjectLayoutRulesImpl, }; LayoutRulesImpl kMetalParameterBlockLayoutRulesImpl_ = { @@ -1712,7 +1735,7 @@ LayoutRulesImpl kMetalParameterBlockLayoutRulesImpl_ = { }; LayoutRulesImpl kMetalStructuredBufferLayoutRulesImpl_ = { - &kMetalLayoutRulesFamilyImpl, &kCPULayoutRulesImpl, & kMetalObjectLayoutRulesImpl, + &kMetalLayoutRulesFamilyImpl, &kMetalLayoutRulesImpl, & kMetalObjectLayoutRulesImpl, }; LayoutRulesImpl kMetalVaryingInputLayoutRulesImpl_ = { |
