From 6e1a6c5b2baf0baa79d3a164167a8ffb14c99bc8 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Thu, 16 Aug 2018 02:26:03 -0300 Subject: [PATCH] Implement PointCoord and PointSize shader attributes (#353) * Implement PointCoord and PointSize shader attributes * Address feedback --- Ryujinx.Graphics/Gal/Shader/GlslDecl.cs | 18 ++++++++++++------ Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs | 13 ++++++++++--- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Ryujinx.Graphics/Gal/Shader/GlslDecl.cs b/Ryujinx.Graphics/Gal/Shader/GlslDecl.cs index 691ab800..ccc59e04 100644 --- a/Ryujinx.Graphics/Gal/Shader/GlslDecl.cs +++ b/Ryujinx.Graphics/Gal/Shader/GlslDecl.cs @@ -6,6 +6,9 @@ namespace Ryujinx.Graphics.Gal.Shader class GlslDecl { public const int LayerAttr = 0x064; + public const int PointSizeAttr = 0x06c; + public const int PointCoordAttrX = 0x2e0; + public const int PointCoordAttrY = 0x2e4; public const int TessCoordAttrX = 0x2f0; public const int TessCoordAttrY = 0x2f4; public const int TessCoordAttrZ = 0x2f8; @@ -249,11 +252,14 @@ namespace Ryujinx.Graphics.Gal.Shader case ShaderIrOperAbuf Abuf: { - //This is a built-in input variable. - if (Abuf.Offs == VertexIdAttr || - Abuf.Offs == InstanceIdAttr || - Abuf.Offs == FaceAttr || - Abuf.Offs == LayerAttr) + //This is a built-in variable. + if (Abuf.Offs == LayerAttr || + Abuf.Offs == PointSizeAttr || + Abuf.Offs == PointCoordAttrX || + Abuf.Offs == PointCoordAttrY || + Abuf.Offs == VertexIdAttr || + Abuf.Offs == InstanceIdAttr || + Abuf.Offs == FaceAttr) { break; } @@ -345,4 +351,4 @@ namespace Ryujinx.Graphics.Gal.Shader return Decls.ContainsKey(Index); } } -} \ No newline at end of file +} diff --git a/Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs b/Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs index 94bdd2fa..7f1cfabc 100644 --- a/Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs +++ b/Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs @@ -795,6 +795,9 @@ namespace Ryujinx.Graphics.Gal.Shader { switch (Abuf.Offs) { + case GlslDecl.PointCoordAttrX: return "gl_PointCoord.x"; + case GlslDecl.PointCoordAttrY: return "gl_PointCoord.y"; + //Note: It's a guess that Maxwell's face is 1 when gl_FrontFacing == true case GlslDecl.FaceAttr: return "(gl_FrontFacing ? 1 : 0)"; } @@ -813,7 +816,7 @@ namespace Ryujinx.Graphics.Gal.Shader if (!Decl.Attributes.TryGetValue(Index, out ShaderDeclInfo DeclInfo)) { //Handle special vec4 attributes here - //(for example, index 7 is aways gl_Position). + //(for example, index 7 is always gl_Position). if (Index == GlslDecl.GlPositionVec4Index) { string Name = @@ -822,6 +825,10 @@ namespace Ryujinx.Graphics.Gal.Shader return Name + Swizzle; } + else if (Abuf.Offs == GlslDecl.PointSizeAttr) + { + return "gl_PointSize"; + } throw new InvalidOperationException(); } @@ -1265,9 +1272,9 @@ namespace Ryujinx.Graphics.Gal.Shader switch (Node) { case ShaderIrOperAbuf Abuf: - return Abuf.Offs == GlslDecl.LayerAttr || + return Abuf.Offs == GlslDecl.LayerAttr || Abuf.Offs == GlslDecl.InstanceIdAttr || - Abuf.Offs == GlslDecl.VertexIdAttr || + Abuf.Offs == GlslDecl.VertexIdAttr || Abuf.Offs == GlslDecl.FaceAttr ? OperType.I32 : OperType.F32;