diff options
| author | Yong He <yonghe@outlook.com> | 2025-07-22 14:29:57 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-22 21:29:57 +0000 |
| commit | b16d4e955fdba3d68d156f944260f8b7a157fd4d (patch) | |
| tree | c63c1d929f9f3e952bded7ccdfe833fdd331cbc0 /source/slang | |
| parent | 6e0c63b723cc81efcc82c2af778b26e507c71825 (diff) | |
Fix scalar to array conversion for tessellation factors (#7837)
* Fix scalar to array conversion for tessellation factors in GLSL legalization
Add scalar-to-array conversion support in adaptType() function to handle
cases where users declare scalar tessellation factors (e.g., float TessLevelInner)
but GLSL requires arrays (float[2] for gl_TessLevelInner). This prevents the
generation of BuiltinCast instructions that crash the SPIR-V emitter.
Fixes crash: "unimplemented: Unhandled local inst in spirv-emit: BuiltinCast"
- Add scalar-to-array case in slang-ir-glsl-legalize.cpp adaptType()
- Fill all array elements with the scalar value for tessellation factors
- Add test case for scalar tessellation factor conversion
Fixes #7000
Co-authored-by: Yong He <csyonghe@users.noreply.github.com>
* Apply review feedback fixes
- Change test directive to TEST:SIMPLE
- Use IRArrayType instead of IRArrayTypeBase
- Use MakeArrayFromElement for cleaner scalar-to-array conversion
Co-authored-by: Yong He <csyonghe@users.noreply.github.com>
* Fix type conversion in scalar-to-array tessellation factor conversion
Convert scalar value to array element type before creating array to handle
cases where scalar type differs from array element type (e.g., int to float[3]).
Co-authored-by: Yong He <csyonghe@users.noreply.github.com>
* Use CHECK-DAG for order-independent tessellation factor checks
Co-authored-by: Yong He <csyonghe@users.noreply.github.com>
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Yong He <csyonghe@users.noreply.github.com>
Diffstat (limited to 'source/slang')
| -rw-r--r-- | source/slang/slang-ir-glsl-legalize.cpp | 12 |
1 files changed, 12 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)); } |
