diff options
| author | Yong He <yonghe@outlook.com> | 2024-09-05 11:53:56 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-05 11:53:56 -0700 |
| commit | 33e8bfd43f66613f6f834fb0e1816ef43071f2e4 (patch) | |
| tree | 65ea9179edd27325fe4d8dfb0c6d4ca33db67671 /source | |
| parent | 879ee3d187e577189eba9aed7bc6326b740cb627 (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.cpp | 26 |
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, |
