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

* Support constant attributes (with a value of zero)

* Remove extra line
This commit is contained in:
gdkchan 2020-03-29 23:11:24 -03:00 committed by GitHub
parent 8f21db810d
commit 9948a7be53
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 4 deletions

View file

@ -5,12 +5,15 @@ namespace Ryujinx.Graphics.GAL
public int BufferIndex { get; } public int BufferIndex { get; }
public int Offset { get; } public int Offset { get; }
public bool IsZero { get; }
public Format Format { 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; BufferIndex = bufferIndex;
Offset = offset; Offset = offset;
IsZero = isZero;
Format = format; Format = format;
} }
} }

View file

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

View file

@ -16,6 +16,15 @@ namespace Ryujinx.Graphics.Gpu.State
return (int)(Attribute & 0x1f); 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> /// <summary>
/// Unpacks the offset, in bytes, of the attribute on the vertex buffer. /// Unpacks the offset, in bytes, of the attribute on the vertex buffer.
/// </summary> /// </summary>

View file

@ -58,8 +58,17 @@ namespace Ryujinx.Graphics.OpenGL
{ {
FormatInfo fmtInfo = FormatTable.GetFormatInfo(attrib.Format); 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 offset = attrib.Offset;
int size = fmtInfo.Components; int size = fmtInfo.Components;
@ -117,7 +126,7 @@ namespace Ryujinx.Graphics.OpenGL
continue; continue;
} }
if (_needsAttribsUpdate) if (_needsAttribsUpdate && !attrib.IsZero)
{ {
GL.EnableVertexAttribArray(attribIndex); GL.EnableVertexAttribArray(attribIndex);
} }