Эх сурвалжийг харах

Implement PointCoord and PointSize shader attributes (#353)

* Implement PointCoord and PointSize shader attributes

* Address feedback
ReinUsesLisp 7 жил өмнө
parent
commit
6e1a6c5b2b

+ 12 - 6
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);
         }
     }
-}
+}

+ 10 - 3
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;