summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-ir-glsl-legalize.cpp12
-rw-r--r--tests/pipeline/tessellation/scalar-tessellation-factor.slang52
2 files changed, 64 insertions, 0 deletions
diff --git a/source/slang/slang-ir-glsl-legalize.cpp b/source/slang/slang-ir-glsl-legalize.cpp
index f001384a4..ac4d5c336 100644
--- a/source/slang/slang-ir-glsl-legalize.cpp
+++ b/source/slang/slang-ir-glsl-legalize.cpp
@@ -2094,6 +2094,18 @@ ScalarizedVal adaptType(IRBuilder* builder, IRInst* val, IRType* toType, IRType*
}
}
}
+ else if (auto toArray = as<IRArrayType>(toType))
+ {
+ // Handle scalar-to-array conversion for tessellation factors
+ if (as<IRBasicType>(fromType))
+ {
+ // Convert the scalar value to the array's element type first
+ auto arrayElementType = toArray->getElementType();
+ auto convertedVal = builder->emitCast(arrayElementType, val);
+ val = builder->emitMakeArrayFromElement(toType, convertedVal);
+ return ScalarizedVal::value(val);
+ }
+ }
// TODO: actually consider what needs to go on here...
return ScalarizedVal::value(builder->emitCast(toType, val));
}
diff --git a/tests/pipeline/tessellation/scalar-tessellation-factor.slang b/tests/pipeline/tessellation/scalar-tessellation-factor.slang
new file mode 100644
index 000000000..9fc97732d
--- /dev/null
+++ b/tests/pipeline/tessellation/scalar-tessellation-factor.slang
@@ -0,0 +1,52 @@
+//TEST:SIMPLE(filecheck=CHECK): -target spirv -stage hull -entry hullMain -warnings-disable 39001
+
+// Test for issue #7000: scalar tessellation factors should convert to arrays properly
+
+struct VSOutput
+{
+ float4 Pos : SV_POSITION;
+ float3 Normal;
+ float2 UV;
+};
+
+struct HSOutput
+{
+ float4 Pos : SV_POSITION;
+ float3 Normal;
+ float2 UV;
+};
+
+struct ConstantsHSOutput
+{
+ float TessLevelOuter[3] : SV_TessFactor;
+ float TessLevelInner : SV_InsideTessFactor; // Scalar (should convert to float[2] for GLSL)
+};
+
+ConstantsHSOutput ConstantsHS()
+{
+ ConstantsHSOutput output;
+ output.TessLevelInner = 4.0;
+ output.TessLevelOuter[0] = 4.0;
+ output.TessLevelOuter[1] = 4.0;
+ output.TessLevelOuter[2] = 4.0;
+ return output;
+}
+
+[shader("hull")]
+[domain("tri")]
+[partitioning("integer")]
+[outputtopology("triangle_cw")]
+[outputcontrolpoints(3)]
+[patchconstantfunc("ConstantsHS")]
+HSOutput hullMain(InputPatch<VSOutput, 3> patch, uint InvocationID: SV_OutputControlPointID)
+{
+ HSOutput output;
+ output.Pos = patch[InvocationID].Pos;
+ output.Normal = patch[InvocationID].Normal;
+ output.UV = patch[InvocationID].UV;
+ return output;
+}
+
+// CHECK: OpExecutionMode
+// CHECK-DAG: OpDecorate {{.*}} BuiltIn TessLevelInner
+// CHECK-DAG: OpDecorate {{.*}} BuiltIn TessLevelOuter \ No newline at end of file