summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-lower-buffer-element-type.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-08-31 13:49:40 -0700
committerGitHub <noreply@github.com>2023-08-31 13:49:40 -0700
commitcc412af89e54b04ead508ca84825a18d001b92d0 (patch)
treeda7bb020c494cc4dc62a9c641fb88d7b0b9f89f2 /source/slang/slang-ir-lower-buffer-element-type.cpp
parent1996785e1c5d76254a102c1ec0df5dd7e2e4d68a (diff)
Add SPIRV atomics intrinsics and fix buffer layout lowering. (#3170)
* Fix atomics intrinsics and buffer layout lowering. * Fix. * Add more test. * Fix. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-ir-lower-buffer-element-type.cpp')
-rw-r--r--source/slang/slang-ir-lower-buffer-element-type.cpp41
1 files changed, 29 insertions, 12 deletions
diff --git a/source/slang/slang-ir-lower-buffer-element-type.cpp b/source/slang/slang-ir-lower-buffer-element-type.cpp
index bf87d72fe..bc8e47e91 100644
--- a/source/slang/slang-ir-lower-buffer-element-type.cpp
+++ b/source/slang/slang-ir-lower-buffer-element-type.cpp
@@ -165,7 +165,9 @@ namespace Slang
for (IRIntegerValue ii = 0; ii < count; ++ii)
{
auto packedElement = builder.emitElementExtract(packedArray, ii);
- auto originalElement = builder.emitCallInst(innerTypeInfo.originalType, innerTypeInfo.convertLoweredToOriginal, 1, &packedElement);
+ auto originalElement = innerTypeInfo.convertLoweredToOriginal
+ ? builder.emitCallInst(innerTypeInfo.originalType, innerTypeInfo.convertLoweredToOriginal, 1, &packedElement)
+ : packedElement;
args[(Index)ii] = originalElement;
}
auto result = builder.emitMakeArray(arrayType, (UInt)args.getCount(), args.getBuffer());
@@ -194,7 +196,9 @@ namespace Slang
for (IRIntegerValue ii = 0; ii < count; ++ii)
{
auto originalElement = builder.emitElementExtract(originalParam, ii);
- auto packedElement = builder.emitCallInst(innerTypeInfo.loweredType, innerTypeInfo.convertOriginalToLowered, 1, &originalElement);
+ auto packedElement = innerTypeInfo.convertOriginalToLowered
+ ? builder.emitCallInst(innerTypeInfo.loweredType, innerTypeInfo.convertOriginalToLowered, 1, &originalElement)
+ : originalElement;
args[(Index)ii] = packedElement;
}
auto packedArray = builder.emitMakeArray(innerArrayType, (UInt)args.getCount(), args.getBuffer());
@@ -259,7 +263,7 @@ namespace Slang
auto arrayType = builder.getArrayType(
vectorType,
isColMajor?matrixType->getColumnCount():matrixType->getRowCount(),
- builder.getIntValue(builder.getIntType(), elementSizeAlignment.size));
+ builder.getIntValue(builder.getIntType(), elementSizeAlignment.getStride()));
builder.createStructField(loweredType, structKey, arrayType);
info.loweredType = loweredType;
@@ -272,10 +276,16 @@ namespace Slang
else if (auto arrayType = as<IRArrayType>(type))
{
auto loweredInnerTypeInfo = getLoweredTypeInfo(arrayType->getElementType(), rules);
- if (!loweredInnerTypeInfo.convertLoweredToOriginal)
+ // For spirv backend, we always want to lower all array types, even if the element type
+ // comes out the same. This is because different layout rules may have different array
+ // stride requirements.
+ if (!target->shouldEmitSPIRVDirectly())
{
- info.loweredType = type;
- return info;
+ if (!loweredInnerTypeInfo.convertLoweredToOriginal)
+ {
+ info.loweredType = type;
+ return info;
+ }
}
auto loweredType = builder.createStructType();
info.loweredType = loweredType;
@@ -287,12 +297,12 @@ namespace Slang
auto structKey = builder.createStructKey();
builder.addNameHintDecoration(structKey, UnownedStringSlice("data"));
IRSizeAndAlignment elementSizeAlignment;
- getSizeAndAlignment(rules, loweredType, &elementSizeAlignment);
+ getSizeAndAlignment(rules, loweredInnerTypeInfo.loweredType, &elementSizeAlignment);
elementSizeAlignment = rules->alignCompositeElement(elementSizeAlignment);
auto innerArrayType = builder.getArrayType(
loweredInnerTypeInfo.loweredType,
arrayType->getElementCount(),
- builder.getIntValue(builder.getIntType(), elementSizeAlignment.size));
+ builder.getIntValue(builder.getIntType(), elementSizeAlignment.getStride()));
builder.createStructField(loweredType, structKey, innerArrayType);
info.loweredInnerArrayType = innerArrayType;
info.loweredInnerStructKey = structKey;
@@ -312,12 +322,19 @@ namespace Slang
if (loweredFieldTypeInfo.convertLoweredToOriginal || rules->ruleName != IRTypeLayoutRuleName::Natural)
isTrivial = false;
}
- if (isTrivial)
+
+ // For spirv backend, we always want to lower all array types, even if the element type
+ // comes out the same. This is because different layout rules may have different array
+ // stride requirements.
+ if (!target->shouldEmitSPIRVDirectly())
{
- info.loweredType = type;
- return info;
+ // For non-spirv target, we skip lowering this type if all field types are unchanged.
+ if (isTrivial)
+ {
+ info.loweredType = type;
+ return info;
+ }
}
-
auto loweredType = builder.createStructType();
StringBuilder nameSB;
getTypeNameHint(nameSB, type);