using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace Ryujinx.Graphics.Gpu.Shader { /// /// Shader code addresses in memory for each shader stage. /// struct ShaderAddresses : IEquatable { #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 /// /// Check if the addresses are equal. /// /// Shader addresses structure to compare with /// True if they are equal, false otherwise public override bool Equals(object other) { return other is ShaderAddresses addresses && Equals(addresses); } /// /// Check if the addresses are equal. /// /// Shader addresses structure to compare with /// True if they are equal, false otherwise public bool Equals(ShaderAddresses other) { return VertexA == other.VertexA && VertexB == other.VertexB && TessControl == other.TessControl && TessEvaluation == other.TessEvaluation && Geometry == other.Geometry && Fragment == other.Fragment; } /// /// Computes hash code from the addresses. /// /// Hash code public override int GetHashCode() { return HashCode.Combine(VertexA, VertexB, TessControl, TessEvaluation, Geometry, Fragment); } /// /// Gets a view of the structure as a span of addresses. /// /// Span of addresses public Span AsSpan() { return MemoryMarshal.CreateSpan(ref VertexA, Unsafe.SizeOf() / sizeof(ulong)); } } }