diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index 353c5dfe..4785c843 100644 --- a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -40,7 +40,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// /// Version of the codegen (to be changed when codegen or guest format change). /// - private const ulong ShaderCodeGenVersion = 2816; + private const ulong ShaderCodeGenVersion = 2876; // Progress reporting helpers private volatile int _shaderCount; diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenHelper.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenHelper.cs index a52e70c3..69214a35 100644 --- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenHelper.cs +++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenHelper.cs @@ -71,8 +71,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions Add(Instruction.ExponentB2, InstType.CallUnary, "exp2"); Add(Instruction.FSIBegin, InstType.Special); Add(Instruction.FSIEnd, InstType.Special); - Add(Instruction.FindFirstSetS32, InstType.CallUnary, "findMSB"); - Add(Instruction.FindFirstSetU32, InstType.CallUnary, "findMSB"); + Add(Instruction.FindLSB, InstType.CallUnary, "findLSB"); + Add(Instruction.FindMSBS32, InstType.CallUnary, "findMSB"); + Add(Instruction.FindMSBU32, InstType.CallUnary, "findMSB"); Add(Instruction.Floor, InstType.CallUnary, "floor"); Add(Instruction.FusedMultiplyAdd, InstType.CallTernary, "fma"); Add(Instruction.GroupMemoryBarrier, InstType.CallNullary, "groupMemoryBarrier"); diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitBitfield.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitBitfield.cs index 7a141bbc..71925269 100644 --- a/Ryujinx.Graphics.Shader/Instructions/InstEmitBitfield.cs +++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitBitfield.cs @@ -166,13 +166,17 @@ namespace Ryujinx.Graphics.Shader.Instructions { Operand srcB = context.BitwiseNot(src, invert); - Operand res = isSigned - ? context.FindFirstSetS32(srcB) - : context.FindFirstSetU32(srcB); + Operand res; if (sh) { - res = context.BitwiseExclusiveOr(res, Const(31)); + res = context.FindLSB(context.BitfieldReverse(srcB)); + } + else + { + res = isSigned + ? context.FindMSBS32(srcB) + : context.FindMSBU32(srcB); } context.Copy(GetDest(rd), res); diff --git a/Ryujinx.Graphics.Shader/IntermediateRepresentation/Instruction.cs b/Ryujinx.Graphics.Shader/IntermediateRepresentation/Instruction.cs index c3fb2882..9a2c844d 100644 --- a/Ryujinx.Graphics.Shader/IntermediateRepresentation/Instruction.cs +++ b/Ryujinx.Graphics.Shader/IntermediateRepresentation/Instruction.cs @@ -68,8 +68,9 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation ExponentB2, FSIBegin, FSIEnd, - FindFirstSetS32, - FindFirstSetU32, + FindLSB, + FindMSBS32, + FindMSBU32, Floor, FusedMultiplyAdd, GroupMemoryBarrier, diff --git a/Ryujinx.Graphics.Shader/StructuredIr/InstructionInfo.cs b/Ryujinx.Graphics.Shader/StructuredIr/InstructionInfo.cs index f3397ada..7190d22a 100644 --- a/Ryujinx.Graphics.Shader/StructuredIr/InstructionInfo.cs +++ b/Ryujinx.Graphics.Shader/StructuredIr/InstructionInfo.cs @@ -79,8 +79,9 @@ namespace Ryujinx.Graphics.Shader.StructuredIr Add(Instruction.Ddy, VariableType.F32, VariableType.F32); Add(Instruction.Divide, VariableType.Scalar, VariableType.Scalar, VariableType.Scalar); Add(Instruction.ExponentB2, VariableType.Scalar, VariableType.Scalar); - Add(Instruction.FindFirstSetS32, VariableType.S32, VariableType.S32); - Add(Instruction.FindFirstSetU32, VariableType.S32, VariableType.U32); + Add(Instruction.FindLSB, VariableType.Int, VariableType.Int); + Add(Instruction.FindMSBS32, VariableType.S32, VariableType.S32); + Add(Instruction.FindMSBU32, VariableType.S32, VariableType.U32); Add(Instruction.Floor, VariableType.Scalar, VariableType.Scalar); Add(Instruction.FusedMultiplyAdd, VariableType.Scalar, VariableType.Scalar, VariableType.Scalar, VariableType.Scalar); Add(Instruction.ImageLoad, VariableType.F32); diff --git a/Ryujinx.Graphics.Shader/Translation/EmitterContextInsts.cs b/Ryujinx.Graphics.Shader/Translation/EmitterContextInsts.cs index 6baf33e1..307c08c7 100644 --- a/Ryujinx.Graphics.Shader/Translation/EmitterContextInsts.cs +++ b/Ryujinx.Graphics.Shader/Translation/EmitterContextInsts.cs @@ -181,14 +181,19 @@ namespace Ryujinx.Graphics.Shader.Translation return context.Add(Instruction.EndPrimitive); } - public static Operand FindFirstSetS32(this EmitterContext context, Operand a) + public static Operand FindLSB(this EmitterContext context, Operand a) { - return context.Add(Instruction.FindFirstSetS32, Local(), a); + return context.Add(Instruction.FindLSB, Local(), a); } - public static Operand FindFirstSetU32(this EmitterContext context, Operand a) + public static Operand FindMSBS32(this EmitterContext context, Operand a) { - return context.Add(Instruction.FindFirstSetU32, Local(), a); + return context.Add(Instruction.FindMSBS32, Local(), a); + } + + public static Operand FindMSBU32(this EmitterContext context, Operand a) + { + return context.Add(Instruction.FindMSBU32, Local(), a); } public static Operand FP32ConvertToFP64(this EmitterContext context, Operand a)