Shader: Align clip distance init with declared outputs

Cause: vertex output initialization wrote ClipDistance[0..7] whenever any clip distance was used, while vtg-as-compute output reservations can be sparse.

Effect: the mismatch could leave unreserved ClipDistance stores in the IR path and trigger downstream translation failures.

Fix: initialize only the ClipDistance components flagged in ClipDistancesWritten by iterating the bitmask with BitOperations.TrailingZeroCount.
This commit is contained in:
2026-05-29 09:45:50 +08:00
parent 630e7a5244
commit df6b0250d3
@@ -2,6 +2,7 @@ using Ryujinx.Graphics.Shader.Decoders;
using Ryujinx.Graphics.Shader.IntermediateRepresentation;
using System;
using System.Linq;
using System.Numerics;
using static Ryujinx.Graphics.Shader.IntermediateRepresentation.OperandHelper;
namespace Ryujinx.Graphics.Shader.Translation
@@ -259,12 +260,15 @@ namespace Ryujinx.Graphics.Shader.Translation
context.Store(StorageKind.Output, IoVariable.Position, null, Const(c), ConstF(c == 3 ? 1f : 0f));
}
if (context.Program.ClipDistancesWritten != 0)
int clipDistancesWrittenMap = context.Program.ClipDistancesWritten;
while (clipDistancesWrittenMap != 0)
{
for (int i = 0; i < 8; i++)
{
context.Store(StorageKind.Output, IoVariable.ClipDistance, null, Const(i), ConstF(0f));
}
int index = BitOperations.TrailingZeroCount(clipDistancesWrittenMap);
context.Store(StorageKind.Output, IoVariable.ClipDistance, null, Const(index), ConstF(0f));
clipDistancesWrittenMap &= ~(1 << index);
}
}