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:
parent
8f21db810d
commit
9948a7be53
4 changed files with 26 additions and 4 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -532,6 +532,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
|||
vertexAttribs[index] = new VertexAttribDescriptor(
|
||||
vertexAttrib.UnpackBufferIndex(),
|
||||
vertexAttrib.UnpackOffset(),
|
||||
vertexAttrib.UnpackIsConstant(),
|
||||
format);
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Reference in a new issue