VertexInfoBuffer.cs 2.2 KB

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