diff options
Diffstat (limited to 'src/Ryujinx.Graphics.Gpu/Shader/ShaderAddresses.cs')
| -rw-r--r-- | src/Ryujinx.Graphics.Gpu/Shader/ShaderAddresses.cs | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderAddresses.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderAddresses.cs new file mode 100644 index 00000000..651dfd26 --- /dev/null +++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderAddresses.cs @@ -0,0 +1,64 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Ryujinx.Graphics.Gpu.Shader +{ + /// <summary> + /// Shader code addresses in memory for each shader stage. + /// </summary> + struct ShaderAddresses : IEquatable<ShaderAddresses> + { +#pragma warning disable CS0649 + public ulong VertexA; + public ulong VertexB; + public ulong TessControl; + public ulong TessEvaluation; + public ulong Geometry; + public ulong Fragment; +#pragma warning restore CS0649 + + /// <summary> + /// Check if the addresses are equal. + /// </summary> + /// <param name="other">Shader addresses structure to compare with</param> + /// <returns>True if they are equal, false otherwise</returns> + public override bool Equals(object other) + { + return other is ShaderAddresses addresses && Equals(addresses); + } + + /// <summary> + /// Check if the addresses are equal. + /// </summary> + /// <param name="other">Shader addresses structure to compare with</param> + /// <returns>True if they are equal, false otherwise</returns> + public bool Equals(ShaderAddresses other) + { + return VertexA == other.VertexA && + VertexB == other.VertexB && + TessControl == other.TessControl && + TessEvaluation == other.TessEvaluation && + Geometry == other.Geometry && + Fragment == other.Fragment; + } + + /// <summary> + /// Computes hash code from the addresses. + /// </summary> + /// <returns>Hash code</returns> + public override int GetHashCode() + { + return HashCode.Combine(VertexA, VertexB, TessControl, TessEvaluation, Geometry, Fragment); + } + + /// <summary> + /// Gets a view of the structure as a span of addresses. + /// </summary> + /// <returns>Span of addresses</returns> + public Span<ulong> AsSpan() + { + return MemoryMarshal.CreateSpan(ref VertexA, Unsafe.SizeOf<ShaderAddresses>() / sizeof(ulong)); + } + } +}
\ No newline at end of file |
