summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-09-05 11:53:56 -0700
committerGitHub <noreply@github.com>2024-09-05 11:53:56 -0700
commit33e8bfd43f66613f6f834fb0e1816ef43071f2e4 (patch)
tree65ea9179edd27325fe4d8dfb0c6d4ca33db67671 /source
parent879ee3d187e577189eba9aed7bc6326b740cb627 (diff)
Fix SPIRV SV_TessFactor type adaptation logic. (#5010)
* Fix SPIRV SV_TessFactor type adaptation logic. * Fix compile error.
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-ir-glsl-legalize.cpp26
1 files changed, 22 insertions, 4 deletions
diff --git a/source/slang/slang-ir-glsl-legalize.cpp b/source/slang/slang-ir-glsl-legalize.cpp
index dabf0294f..d8c1aa91e 100644
--- a/source/slang/slang-ir-glsl-legalize.cpp
+++ b/source/slang/slang-ir-glsl-legalize.cpp
@@ -1197,13 +1197,15 @@ ScalarizedVal createSimpleGLSLGlobalVarying(
IRType* type = inType;
IRType* peeledRequiredType = nullptr;
-
+ ShortList<IRInst*> peeledRequiredArraySizes;
+ bool peeledRequiredArrayLevelMatchesUserDeclaredType = false;
// A system-value semantic might end up needing to override the type
// that the user specified.
if( systemValueInfo && systemValueInfo->requiredType )
{
type = systemValueInfo->requiredType;
peeledRequiredType = type;
+ peeledRequiredArrayLevelMatchesUserDeclaredType = true;
// Unpeel `type` using declarators so that it matches `inType`.
for (auto dd = declarator; dd; dd = dd->next)
{
@@ -1214,8 +1216,13 @@ ScalarizedVal createSimpleGLSLGlobalVarying(
if (auto arrayType = as<IRArrayTypeBase>(type))
{
type = arrayType->getElementType();
+ peeledRequiredArraySizes.add(arrayType->getElementCount());
peeledRequiredType = type;
}
+ else
+ {
+ peeledRequiredArrayLevelMatchesUserDeclaredType = false;
+ }
break;
}
}
@@ -1305,15 +1312,20 @@ ScalarizedVal createSimpleGLSLGlobalVarying(
// Construct the actual type and type-layout for the global variable
//
IRTypeLayout* typeLayout = inTypeLayout;
+ Index requiredArraySizeIndex = peeledRequiredArraySizes.getCount() - 1;
for( auto dd = declarator; dd; dd = dd->next )
{
switch(dd->flavor)
{
case GlobalVaryingDeclarator::Flavor::array:
{
+ auto elementCount = peeledRequiredArrayLevelMatchesUserDeclaredType
+ ? peeledRequiredArraySizes[requiredArraySizeIndex] : dd->elementCount;
+
auto arrayType = builder->getArrayType(
type,
- dd->elementCount);
+ elementCount);
+ requiredArraySizeIndex--;
IRArrayTypeLayout::Builder arrayTypeLayoutBuilder(builder, typeLayout);
if( auto resInfo = inTypeLayout->findSizeAttr(kind) )
@@ -1321,10 +1333,9 @@ ScalarizedVal createSimpleGLSLGlobalVarying(
// TODO: it is kind of gross to be re-running some
// of the type layout logic here.
- UInt elementCount = (UInt) getIntVal(dd->elementCount);
arrayTypeLayoutBuilder.addResourceUsage(
kind,
- resInfo->getSize() * elementCount);
+ resInfo->getSize() * getIntVal(elementCount));
}
auto arrayTypeLayout = arrayTypeLayoutBuilder.build();
@@ -1774,6 +1785,13 @@ ScalarizedVal adaptType(
val = builder->emitSwizzle(fromVector->getElementType(), val, 1, &index);
}
}
+ else if (auto fromArray = as<IRArrayTypeBase>(fromType))
+ {
+ if (as<IRBasicType>(toType))
+ {
+ val = builder->emitElementExtract(fromArray->getElementType(), val, builder->getIntValue(builder->getIntType(), 0));
+ }
+ }
// TODO: actually consider what needs to go on here...
return ScalarizedVal::value(builder->emitCast(
toType,