diff --git a/ChocolArm64/AOpCodeTable.cs b/ChocolArm64/AOpCodeTable.cs index 3500fba0..5bddc3b9 100644 --- a/ChocolArm64/AOpCodeTable.cs +++ b/ChocolArm64/AOpCodeTable.cs @@ -206,6 +206,7 @@ namespace ChocolArm64 SetA64("0>101110000xxxxx00011101<100000111110xxxxxxxxxx", AInstEmit.Fabs_V, typeof(AOpCodeSimd)); SetA64("000111100x1xxxxx001010xxxxxxxxxx", AInstEmit.Fadd_S, typeof(AOpCodeSimdReg)); SetA64("0>0011100<1xxxxx110101xxxxxxxxxx", AInstEmit.Fadd_V, typeof(AOpCodeSimdReg)); SetA64("0>1011100<1xxxxx110101xxxxxxxxxx", AInstEmit.Faddp_V, typeof(AOpCodeSimdReg)); diff --git a/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs b/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs index 0dfe0bd3..5aea6b04 100644 --- a/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs +++ b/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs @@ -309,6 +309,14 @@ namespace ChocolArm64.Instruction }); } + public static void Fabs_V(AILEmitterCtx Context) + { + EmitVectorUnaryOpF(Context, () => + { + EmitUnaryMathCall(Context, nameof(Math.Abs)); + }); + } + public static void Fadd_S(AILEmitterCtx Context) { if (AOptimizations.UseSse2) diff --git a/Ryujinx.Graphics/Gal/GalTextureFormat.cs b/Ryujinx.Graphics/Gal/GalTextureFormat.cs index 3bac2f80..7d19dc26 100644 --- a/Ryujinx.Graphics/Gal/GalTextureFormat.cs +++ b/Ryujinx.Graphics/Gal/GalTextureFormat.cs @@ -10,6 +10,7 @@ namespace Ryujinx.Graphics.Gal B5G6R5 = 0x15, BC7U = 0x17, G8R8 = 0x18, + R16 = 0x1b, R8 = 0x1d, BC1 = 0x24, BC2 = 0x25, diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs index 50b802c1..c8000603 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs @@ -66,6 +66,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL case GalTextureFormat.A1B5G5R5: return (PixelFormat.Rgba, PixelType.UnsignedShort5551); case GalTextureFormat.B5G6R5: return (PixelFormat.Rgb, PixelType.UnsignedShort565); case GalTextureFormat.G8R8: return (PixelFormat.Rg, PixelType.UnsignedByte); + case GalTextureFormat.R16: return (PixelFormat.Red, PixelType.HalfFloat); case GalTextureFormat.R8: return (PixelFormat.Red, PixelType.UnsignedByte); } diff --git a/Ryujinx.Graphics/Gal/Shader/GlslDecl.cs b/Ryujinx.Graphics/Gal/Shader/GlslDecl.cs index 43a04813..4002c29a 100644 --- a/Ryujinx.Graphics/Gal/Shader/GlslDecl.cs +++ b/Ryujinx.Graphics/Gal/Shader/GlslDecl.cs @@ -159,7 +159,8 @@ namespace Ryujinx.Graphics.Gal.Shader case ShaderIrOperAbuf Abuf: { //This is a built-in input variable. - if (Abuf.Offs == VertexIdAttr) + if (Abuf.Offs == VertexIdAttr || + Abuf.Offs == InstanceIdAttr) { break; } diff --git a/Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs b/Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs index 71a53a5a..1bcedacb 100644 --- a/Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs +++ b/Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs @@ -975,7 +975,8 @@ namespace Ryujinx.Graphics.Gal.Shader switch (Node) { case ShaderIrOperAbuf Abuf: - return Abuf.Offs == GlslDecl.VertexIdAttr + return Abuf.Offs == GlslDecl.VertexIdAttr || + Abuf.Offs == GlslDecl.InstanceIdAttr ? OperType.I32 : OperType.F32; diff --git a/Ryujinx.Graphics/Gal/Shader/ShaderDecodeHelper.cs b/Ryujinx.Graphics/Gal/Shader/ShaderDecodeHelper.cs index 3299ebab..a8ad5ec2 100644 --- a/Ryujinx.Graphics/Gal/Shader/ShaderDecodeHelper.cs +++ b/Ryujinx.Graphics/Gal/Shader/ShaderDecodeHelper.cs @@ -14,7 +14,7 @@ namespace Ryujinx.Graphics.Gal.Shader for (int Index = 0; Index <= Size; Index++) { - Opers[Index] = new ShaderIrOperAbuf(Abuf, Reg); + Opers[Index] = new ShaderIrOperAbuf(Abuf + Index * 4, Reg); } return Opers; diff --git a/Ryujinx.HLE/Gpu/TextureHelper.cs b/Ryujinx.HLE/Gpu/TextureHelper.cs index f1b3f0b3..e48e25ad 100644 --- a/Ryujinx.HLE/Gpu/TextureHelper.cs +++ b/Ryujinx.HLE/Gpu/TextureHelper.cs @@ -33,6 +33,7 @@ namespace Ryujinx.HLE.Gpu case GalTextureFormat.A1B5G5R5: return Texture.Width * Texture.Height * 2; case GalTextureFormat.B5G6R5: return Texture.Width * Texture.Height * 2; case GalTextureFormat.G8R8: return Texture.Width * Texture.Height * 2; + case GalTextureFormat.R16: return Texture.Width * Texture.Height * 2; case GalTextureFormat.R8: return Texture.Width * Texture.Height; case GalTextureFormat.BC1: diff --git a/Ryujinx.HLE/Gpu/TextureReader.cs b/Ryujinx.HLE/Gpu/TextureReader.cs index 4436e07f..9e9ff783 100644 --- a/Ryujinx.HLE/Gpu/TextureReader.cs +++ b/Ryujinx.HLE/Gpu/TextureReader.cs @@ -17,6 +17,7 @@ namespace Ryujinx.HLE.Gpu case GalTextureFormat.A1B5G5R5: return Read5551 (Memory, Texture); case GalTextureFormat.B5G6R5: return Read565 (Memory, Texture); case GalTextureFormat.G8R8: return Read2Bpp (Memory, Texture); + case GalTextureFormat.R16: return Read2Bpp (Memory, Texture); case GalTextureFormat.R8: return Read1Bpp (Memory, Texture); case GalTextureFormat.BC7U: return Read16Bpt4x4(Memory, Texture); case GalTextureFormat.BC1: return Read8Bpt4x4 (Memory, Texture); diff --git a/Ryujinx.HLE/Hid/Hid.cs b/Ryujinx.HLE/Hid/Hid.cs index 054c4fac..2f007f1f 100644 --- a/Ryujinx.HLE/Hid/Hid.cs +++ b/Ryujinx.HLE/Hid/Hid.cs @@ -130,9 +130,7 @@ namespace Ryujinx.HLE.Input { long BaseControllerOffset = Position + HidControllersOffset + 8 * HidControllerSize; - HidControllerType Type = - HidControllerType.ControllerType_Handheld | - HidControllerType.ControllerType_JoyconPair; + HidControllerType Type = HidControllerType.ControllerType_Handheld; bool IsHalf = false; @@ -276,4 +274,4 @@ namespace Ryujinx.HLE.Input return (long)((ulong)Environment.TickCount * 19_200); } } -} \ No newline at end of file +}