summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRonan <ro.cailleau@gmail.com>2025-10-08 11:19:13 +0200
committerGitHub <noreply@github.com>2025-10-08 09:19:13 +0000
commit1300678a36bf8d7081647aef3e2a37dbd496aaf5 (patch)
tree01c7cbf78aefccd9de9e9e2f56e77c1d145765a9
parent54e1d02715747ee81585bfd23e96a1f4956dbf66 (diff)
`ExprLoweringVisitorBase::getDefaultVal(Type*)` use `MakeVector/MatrixFromScalar` (#8512)
- Allows using `Vector/Matrix` type with yet unresolved dimensions - Simpler implementation and in-line with default `Array` - Added `test/bugs/gh-8512.slang`
-rw-r--r--source/slang/slang-lower-to-ir.cpp25
-rw-r--r--tests/bugs/gh-8512-2.slang40
-rw-r--r--tests/bugs/gh-8512.slang39
3 files changed, 83 insertions, 21 deletions
diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp
index d3f7d4e4c..c4492cfbb 100644
--- a/source/slang/slang-lower-to-ir.cpp
+++ b/source/slang/slang-lower-to-ir.cpp
@@ -4948,34 +4948,17 @@ struct ExprLoweringVisitorBase : public ExprVisitor<Derived, LoweredValInfo>
}
else if (auto vectorType = as<VectorExpressionType>(type))
{
- UInt elementCount = (UInt)getIntVal(vectorType->getElementCount());
-
auto irDefaultValue =
getSimpleVal(context, getDefaultVal(vectorType->getElementType()));
-
- List<IRInst*> args;
- for (UInt ee = 0; ee < elementCount; ++ee)
- {
- args.add(irDefaultValue);
- }
return LoweredValInfo::simple(
- getBuilder()->emitMakeVector(irType, args.getCount(), args.getBuffer()));
+ getBuilder()->emitMakeVectorFromScalar(irType, irDefaultValue));
}
else if (auto matrixType = as<MatrixExpressionType>(type))
{
- UInt rowCount = (UInt)getIntVal(matrixType->getRowCount());
-
- auto rowType = matrixType->getRowType();
-
- auto irDefaultValue = getSimpleVal(context, getDefaultVal(rowType));
-
- List<IRInst*> args;
- for (UInt rr = 0; rr < rowCount; ++rr)
- {
- args.add(irDefaultValue);
- }
+ auto irDefaultValue =
+ getSimpleVal(context, getDefaultVal(matrixType->getElementType()));
return LoweredValInfo::simple(
- getBuilder()->emitMakeMatrix(irType, args.getCount(), args.getBuffer()));
+ getBuilder()->emitMakeMatrixFromScalar(irType, irDefaultValue));
}
else if (auto arrayType = as<ArrayExpressionType>(type))
{
diff --git a/tests/bugs/gh-8512-2.slang b/tests/bugs/gh-8512-2.slang
new file mode 100644
index 000000000..4c51af696
--- /dev/null
+++ b/tests/bugs/gh-8512-2.slang
@@ -0,0 +1,40 @@
+//TEST:INTERPRET(filecheck=ICHECK):
+
+__generic <Scalar : __BuiltinFloatingPointType, int Mode>
+struct Spectrum
+{
+ static const int Samples = Mode & 0xFF;
+ typealias VecT = vector<Scalar, Samples>;
+ VecT data;
+
+ static const bool IsRGB = (Mode & 0x100) != 0;
+
+ __generic <Float : __BuiltinFloatingPointType>
+ __init(vector<Float, Samples> v)
+ {
+ this.data = VecT(v);
+ }
+
+ static This MakeFromRGB<Float : __BuiltinFloatingPointType>(vector<Float, 3> rgb)
+ {
+ if(IsRGB)
+ {
+ return (Spectrum<Scalar, 0x103>(rgb) as This).value;
+ }
+ else
+ {
+ return {};
+ }
+ }
+}
+
+static const int DefaultMode = 0x103;
+typealias Spec = Spectrum<float, DefaultMode>;
+
+void main()
+{
+ float3 color = {1, 2, 3};
+ let spec = Spec::MakeFromRGB(color);
+ // ICHECK: (1, 2, 3)
+ printf("(%.0f, %.0f, %.0f)", spec.data[0], spec.data[1], spec.data[2]);
+}
diff --git a/tests/bugs/gh-8512.slang b/tests/bugs/gh-8512.slang
new file mode 100644
index 000000000..e94d95719
--- /dev/null
+++ b/tests/bugs/gh-8512.slang
@@ -0,0 +1,39 @@
+//TEST:SIMPLE(filecheck=CHECK): -target spirv
+// CHECK: OpEntryPoint
+
+__generic <Scalar : __BuiltinFloatingPointType, int Mode>
+struct Spectrum
+{
+ static const int Samples = Mode & 0xFF;
+ typealias VecT = vector<Scalar, Samples>;
+ VecT data;
+
+ static const bool IsRGB = (Mode & 0x100) != 0;
+
+ __generic <Float : __BuiltinFloatingPointType>
+ __init(vector<Float, Samples> v)
+ {
+ this.data = VecT(v);
+ }
+
+ static This MakeFromRGB<Float : __BuiltinFloatingPointType>(vector<Float, 3> rgb)
+ {
+ if(IsRGB)
+ {
+ return (Spectrum<Scalar, 0x103>(rgb) as This).value;
+ }
+ else
+ {
+ return {};
+ }
+ }
+}
+
+static const int DefaultMode = 0x103;
+typealias Spec = Spectrum<float, DefaultMode>;
+
+[shader("vertex")]
+Spec main(float3 vertex_color : COLOR0) : COLOR0
+{
+ return Spec::MakeFromRGB(vertex_color);
+}