/ src / Ryujinx.Graphics.Shader / VertexInfoBuffer.cs
VertexInfoBuffer.cs
 1  using Ryujinx.Common.Memory;
 2  using Ryujinx.Graphics.Shader.StructuredIr;
 3  using Ryujinx.Graphics.Shader.Translation;
 4  using System.Runtime.CompilerServices;
 5  
 6  namespace Ryujinx.Graphics.Shader
 7  {
 8      enum VertexInfoBufferField
 9      {
10          // Must match the order of the fields on the struct.
11          VertexCounts,
12          GeometryCounts,
13          VertexStrides,
14          VertexOffsets,
15      }
16  
17      public struct VertexInfoBuffer
18      {
19          public static readonly int RequiredSize;
20  
21          public static readonly int VertexCountsOffset;
22          public static readonly int GeometryCountsOffset;
23          public static readonly int VertexStridesOffset;
24          public static readonly int VertexOffsetsOffset;
25  
26          private static int OffsetOf<T>(ref VertexInfoBuffer storage, ref T target)
27          {
28              return (int)Unsafe.ByteOffset(ref Unsafe.As<VertexInfoBuffer, T>(ref storage), ref target);
29          }
30  
31          static VertexInfoBuffer()
32          {
33              RequiredSize = Unsafe.SizeOf<VertexInfoBuffer>();
34  
35              VertexInfoBuffer instance = new();
36  
37              VertexCountsOffset = OffsetOf(ref instance, ref instance.VertexCounts);
38              GeometryCountsOffset = OffsetOf(ref instance, ref instance.GeometryCounts);
39              VertexStridesOffset = OffsetOf(ref instance, ref instance.VertexStrides);
40              VertexOffsetsOffset = OffsetOf(ref instance, ref instance.VertexOffsets);
41          }
42  
43          internal static StructureType GetStructureType()
44          {
45              return new StructureType(new[]
46              {
47                  new StructureField(AggregateType.Vector4 | AggregateType.U32, "vertex_counts"),
48                  new StructureField(AggregateType.Vector4 | AggregateType.U32, "geometry_counts"),
49                  new StructureField(AggregateType.Array | AggregateType.Vector4 | AggregateType.U32, "vertex_strides", ResourceReservations.MaxVertexBufferTextures),
50                  new StructureField(AggregateType.Array | AggregateType.Vector4 | AggregateType.U32, "vertex_offsets", ResourceReservations.MaxVertexBufferTextures),
51              });
52          }
53  
54          public Vector4<int> VertexCounts;
55          public Vector4<int> GeometryCounts;
56          public Array32<Vector4<int>> VertexStrides;
57          public Array32<Vector4<int>> VertexOffsets;
58      }
59  }