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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user