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 }