diff options
| author | Yong He <yonghe@outlook.com> | 2023-08-24 16:32:33 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-24 16:32:33 -0700 |
| commit | 0470ea05a42d6c3f35d81a433fefdd440500cdbd (patch) | |
| tree | 25feb7bfd539013bfa64d8ff7698262932e39110 /source/slang/slang-ir.cpp | |
| parent | c515bf9edf0ceefa9a0c9b36626ea7c8f72ce36f (diff) | |
Misc. SPIRV Fixes, Part 2. (#3147)
* Misc. SPIRV Fixes, Part 2.
* Fix up.
* Fix.
* Add system smenatic values.
* 16 bit int and floats, matrix/vector reshape, bool ops.
* Fix.
* Fix.
* Allow push constant entry point params.
* entrypoint params.
* swizzleSet and swizzledStore.
* packoffset.
* string hash.
* Fix.
* Matrix arithmetics.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-ir.cpp')
| -rw-r--r-- | source/slang/slang-ir.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp index 8d36c2e86..181970632 100644 --- a/source/slang/slang-ir.cpp +++ b/source/slang/slang-ir.cpp @@ -3771,6 +3771,32 @@ namespace Slang } if (targetVectorType->getElementCount() != sourceVectorType->getElementCount()) { + auto fromCount = as<IRIntLit>(sourceVectorType->getElementCount()); + auto toCount = as<IRIntLit>(targetVectorType->getElementCount()); + if (fromCount && toCount) + { + if (toCount->getValue() < fromCount->getValue()) + { + List<UInt> indices; + for (UInt i = 0; i < (UInt)toCount->getValue(); i++) + indices.add(i); + return emitSwizzle(targetVectorType, value, (UInt)indices.getCount(), indices.getBuffer()); + } + else if (toCount->getValue() > fromCount->getValue()) + { + List<IRInst*> args; + for (UInt i = 0; i < (UInt)fromCount->getValue(); i++) + { + auto element = emitSwizzle(sourceVectorType->getElementType(), value , 1, &i); + args.add(element); + } + for (IRIntegerValue i = fromCount->getValue(); i < toCount->getValue(); i++) + { + args.add(emitDefaultConstruct(targetVectorType->getElementType())); + } + return emitMakeVector(targetVectorType, args); + } + } auto reshape = emitIntrinsicInst( getVectorType( sourceVectorType->getElementType(), targetVectorType->getElementCount()), |
