summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-08-24 16:32:33 -0700
committerGitHub <noreply@github.com>2023-08-24 16:32:33 -0700
commit0470ea05a42d6c3f35d81a433fefdd440500cdbd (patch)
tree25feb7bfd539013bfa64d8ff7698262932e39110 /source/slang/slang-ir.cpp
parentc515bf9edf0ceefa9a0c9b36626ea7c8f72ce36f (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.cpp26
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()),