From 438bf95f3fe6b145b93b4771660518223948e2c4 Mon Sep 17 00:00:00 2001 From: jebbs Date: Fri, 29 May 2026 09:45:50 +0800 Subject: [PATCH] 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. --- .../Translation/Translator.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Ryujinx.Graphics.Shader/Translation/Translator.cs b/src/Ryujinx.Graphics.Shader/Translation/Translator.cs index 2a1110632..897e54199 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Translator.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Translator.cs @@ -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); } }