aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Shader/SupportBuffer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/SupportBuffer.cs')
-rw-r--r--src/Ryujinx.Graphics.Shader/SupportBuffer.cs58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Shader/SupportBuffer.cs b/src/Ryujinx.Graphics.Shader/SupportBuffer.cs
new file mode 100644
index 00000000..5fe99327
--- /dev/null
+++ b/src/Ryujinx.Graphics.Shader/SupportBuffer.cs
@@ -0,0 +1,58 @@
+using Ryujinx.Common.Memory;
+using System.Runtime.CompilerServices;
+
+namespace Ryujinx.Graphics.Shader
+{
+ public struct Vector4<T>
+ {
+ public T X;
+ public T Y;
+ public T Z;
+ public T W;
+ }
+
+ public struct SupportBuffer
+ {
+ public static int FieldSize;
+ public static int RequiredSize;
+
+ public static int FragmentAlphaTestOffset;
+ public static int FragmentIsBgraOffset;
+ public static int ViewportInverseOffset;
+ public static int FragmentRenderScaleCountOffset;
+ public static int GraphicsRenderScaleOffset;
+ public static int ComputeRenderScaleOffset;
+
+ public const int FragmentIsBgraCount = 8;
+ // One for the render target, 64 for the textures, and 8 for the images.
+ public const int RenderScaleMaxCount = 1 + 64 + 8;
+
+ private static int OffsetOf<T>(ref SupportBuffer storage, ref T target)
+ {
+ return (int)Unsafe.ByteOffset(ref Unsafe.As<SupportBuffer, T>(ref storage), ref target);
+ }
+
+ static SupportBuffer()
+ {
+ FieldSize = Unsafe.SizeOf<Vector4<float>>();
+ RequiredSize = Unsafe.SizeOf<SupportBuffer>();
+
+ SupportBuffer instance = new SupportBuffer();
+
+ FragmentAlphaTestOffset = OffsetOf(ref instance, ref instance.FragmentAlphaTest);
+ FragmentIsBgraOffset = OffsetOf(ref instance, ref instance.FragmentIsBgra);
+ ViewportInverseOffset = OffsetOf(ref instance, ref instance.ViewportInverse);
+ FragmentRenderScaleCountOffset = OffsetOf(ref instance, ref instance.FragmentRenderScaleCount);
+ GraphicsRenderScaleOffset = OffsetOf(ref instance, ref instance.RenderScale);
+ ComputeRenderScaleOffset = GraphicsRenderScaleOffset + FieldSize;
+ }
+
+ public Vector4<int> FragmentAlphaTest;
+ public Array8<Vector4<int>> FragmentIsBgra;
+ public Vector4<float> ViewportInverse;
+ public Vector4<int> FragmentRenderScaleCount;
+
+ // Render scale max count: 1 + 64 + 8. First scale is fragment output scale, others are textures/image inputs.
+ public Array73<Vector4<float>> RenderScale;
+ }
+} \ No newline at end of file