aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Gpu/Shader/ShaderAddresses.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Gpu/Shader/ShaderAddresses.cs')
-rw-r--r--src/Ryujinx.Graphics.Gpu/Shader/ShaderAddresses.cs64
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