summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-type-layout.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-09-05 10:26:59 -0700
committerGitHub <noreply@github.com>2024-09-05 10:26:59 -0700
commita88055c6f5190ca62bb4aa853b4f0fa11546278f (patch)
tree0f4a417153110d43cf361c0abe29c8996b806f3c /source/slang/slang-type-layout.cpp
parent959f55de964ff108947db72a3f8d25b39995f2c8 (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.cpp27
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_ = {