Quellcode durchsuchen

Support constant attributes (with a value of zero) (#1066)

* Support constant attributes (with a value of zero)

* Remove extra line
gdkchan vor 6 Jahren
Ursprung
Commit
9948a7be53

+ 4 - 1
Ryujinx.Graphics.GAL/VertexAttribDescriptor.cs

@@ -5,12 +5,15 @@ namespace Ryujinx.Graphics.GAL
         public int BufferIndex { get; }
         public int Offset      { get; }
 
+        public bool IsZero { get; }
+
         public Format Format { get; }
 
-        public VertexAttribDescriptor(int bufferIndex, int offset, Format format)
+        public VertexAttribDescriptor(int bufferIndex, int offset, bool isZero, Format format)
         {
             BufferIndex = bufferIndex;
             Offset      = offset;
+            IsZero      = isZero;
             Format      = format;
         }
     }

+ 1 - 0
Ryujinx.Graphics.Gpu/Engine/Methods.cs

@@ -532,6 +532,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
                 vertexAttribs[index] = new VertexAttribDescriptor(
                     vertexAttrib.UnpackBufferIndex(),
                     vertexAttrib.UnpackOffset(),
+                    vertexAttrib.UnpackIsConstant(),
                     format);
             }
 

+ 9 - 0
Ryujinx.Graphics.Gpu/State/VertexAttribState.cs

@@ -16,6 +16,15 @@ namespace Ryujinx.Graphics.Gpu.State
             return (int)(Attribute & 0x1f);
         }
 
+        /// <summary>
+        /// Unpacks the attribute constant flag.
+        /// </summary>
+        /// <returns>True if the attribute is constant, false otherwise</returns>
+        public bool UnpackIsConstant()
+        {
+            return (Attribute & 0x40) != 0;
+        }
+
         /// <summary>
         /// Unpacks the offset, in bytes, of the attribute on the vertex buffer.
         /// </summary>

+ 12 - 3
Ryujinx.Graphics.OpenGL/VertexArray.cs

@@ -58,8 +58,17 @@ namespace Ryujinx.Graphics.OpenGL
             {
                 FormatInfo fmtInfo = FormatTable.GetFormatInfo(attrib.Format);
 
-                GL.EnableVertexAttribArray(attribIndex);
-
+                if (attrib.IsZero)
+                {
+                    // Disabling the attribute causes the shader to read a constant value.
+                    // The value is configurable, but by default is a vector of (0, 0, 0, 1).
+                    GL.DisableVertexAttribArray(attribIndex);
+                }
+                else
+                {
+                    GL.EnableVertexAttribArray(attribIndex);
+                }
+                
                 int offset = attrib.Offset;
                 int size   = fmtInfo.Components;
 
@@ -117,7 +126,7 @@ namespace Ryujinx.Graphics.OpenGL
                     continue;
                 }
 
-                if (_needsAttribsUpdate)
+                if (_needsAttribsUpdate && !attrib.IsZero)
                 {
                     GL.EnableVertexAttribArray(attribIndex);
                 }