From cd9e1f67184c1361558e18993e5cb392dc1131f0 Mon Sep 17 00:00:00 2001 From: Lujin Wang <143145775+lujinwangnv@users.noreply.github.com> Date: Fri, 22 Aug 2025 13:48:20 -0700 Subject: Fix mesh shader OutputIndices subscript error by adding missing ref accessor (#7929) Fixes the Slang compiler internal error "subscript had no getter" when reading from mesh shader output index arrays (e.g., `triangles[0].x`). ## Problem The `OutputIndices` struct was missing a `ref` accessor in its `__subscript` implementation, causing the compiler to fail when trying to materialize subscript expressions as r-values. ## Solution Added the missing `ref` accessor to `OutputIndices.__subscript` using the `kIROp_MeshOutputRef` intrinsic operation, matching the pattern used in `OutputVertices` and `OutputPrimitives`. ## Files Changed - `source/slang/core.meta.slang` - Added missing `ref` accessor - `tests/bugs/gh-7925.slang` - Test case to reproduce and verify the fix Fixes #7925 Generated with [Claude Code](https://claude.ai/code) --------- Co-authored-by: Claude Co-authored-by: Lujin Wang Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: slangbot Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com> --- source/slang/core.meta.slang | 5 +++++ source/slang/slang-emit-spirv.cpp | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) (limited to 'source') diff --git a/source/slang/core.meta.slang b/source/slang/core.meta.slang index 2c6bf04d1..3306403f5 100644 --- a/source/slang/core.meta.slang +++ b/source/slang/core.meta.slang @@ -2349,6 +2349,11 @@ struct OutputIndices case spirv: __setIndices(this, index, newValue); } } + + // If a 'OutputIndices[index]' is referred to by a '__ref', call 'kIROp_MeshOutputRef(index)' + [require(glsl_hlsl_metal_spirv, meshshading)] + __intrinsic_op($(kIROp_MeshOutputRef)) + ref; } }; diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index d6f4ac176..0facaac3f 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -4032,6 +4032,9 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex case kIROp_GetOffsetPtr: result = emitGetOffsetPtr(parent, inst); break; + case kIROp_MeshOutputRef: + result = emitMeshOutputRef(parent, inst); + break; case kIROp_GetElement: result = emitGetElement(parent, as(inst)); break; @@ -7002,6 +7005,19 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex makeArray(inst->getIndex())); } + SpvInst* emitMeshOutputRef(SpvInstParent* parent, IRInst* inst) + { + // MeshOutputRef takes two operands: the mesh output array and the index + // It should return a reference (address) to the element at that index + auto base = inst->getOperand(0); + auto index = inst->getOperand(1); + + const SpvWord baseId = getID(ensureInst(base)); + + // Use OpAccessChain to get the address of the element + return emitOpAccessChain(parent, inst, inst->getFullType(), baseId, makeArray(index)); + } + SpvInst* emitGetElement(SpvInstParent* parent, IRGetElement* inst) { requireVariableBufferCapabilityIfNeeded(inst->getDataType()); -- cgit v1.2.3