HostShaderCacheEntryHeader.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System.Runtime.InteropServices;
  2. namespace Ryujinx.Graphics.Gpu.Shader.Cache.Definition
  3. {
  4. /// <summary>
  5. /// Flags indicating if the shader accesses certain built-ins, such as the instance ID.
  6. /// </summary>
  7. enum UseFlags : byte
  8. {
  9. /// <summary>
  10. /// None of the built-ins are used.
  11. /// </summary>
  12. None = 0,
  13. /// <summary>
  14. /// Indicates whenever the vertex shader reads the gl_InstanceID built-in.
  15. /// </summary>
  16. InstanceId = 1 << 0,
  17. /// <summary>
  18. /// Indicates whenever any of the VTG stages writes to the gl_Layer built-in.
  19. /// </summary>
  20. RtLayer = 1 << 1
  21. }
  22. /// <summary>
  23. /// Host shader entry header used for binding information.
  24. /// </summary>
  25. [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0x18)]
  26. struct HostShaderCacheEntryHeader
  27. {
  28. /// <summary>
  29. /// Count of constant buffer descriptors.
  30. /// </summary>
  31. public int CBuffersCount;
  32. /// <summary>
  33. /// Count of storage buffer descriptors.
  34. /// </summary>
  35. public int SBuffersCount;
  36. /// <summary>
  37. /// Count of texture descriptors.
  38. /// </summary>
  39. public int TexturesCount;
  40. /// <summary>
  41. /// Count of image descriptors.
  42. /// </summary>
  43. public int ImagesCount;
  44. /// <summary>
  45. /// Flags indicating if the shader accesses certain built-ins, such as the instance ID.
  46. /// </summary>
  47. public UseFlags UseFlags;
  48. /// <summary>
  49. /// Set to true if this entry is in use.
  50. /// </summary>
  51. [MarshalAs(UnmanagedType.I1)]
  52. public bool InUse;
  53. /// <summary>
  54. /// Mask of clip distances that are written to on the shader.
  55. /// </summary>
  56. public byte ClipDistancesWritten;
  57. /// <summary>
  58. /// Reserved / unused.
  59. /// </summary>
  60. public byte Reserved;
  61. /// <summary>
  62. /// Mask of components written by the fragment shader stage.
  63. /// </summary>
  64. public int FragmentOutputMap;
  65. /// <summary>
  66. /// Create a new host shader cache entry header.
  67. /// </summary>
  68. /// <param name="cBuffersCount">Count of constant buffer descriptors</param>
  69. /// <param name="sBuffersCount">Count of storage buffer descriptors</param>
  70. /// <param name="texturesCount">Count of texture descriptors</param>
  71. /// <param name="imagesCount">Count of image descriptors</param>
  72. /// <param name="usesInstanceId">Set to true if the shader uses instance id</param>
  73. /// <param name="clipDistancesWritten">Mask of clip distances that are written to on the shader</param>
  74. /// <param name="fragmentOutputMap">Mask of components written by the fragment shader stage</param>
  75. public HostShaderCacheEntryHeader(
  76. int cBuffersCount,
  77. int sBuffersCount,
  78. int texturesCount,
  79. int imagesCount,
  80. bool usesInstanceId,
  81. bool usesRtLayer,
  82. byte clipDistancesWritten,
  83. int fragmentOutputMap) : this()
  84. {
  85. CBuffersCount = cBuffersCount;
  86. SBuffersCount = sBuffersCount;
  87. TexturesCount = texturesCount;
  88. ImagesCount = imagesCount;
  89. ClipDistancesWritten = clipDistancesWritten;
  90. FragmentOutputMap = fragmentOutputMap;
  91. InUse = true;
  92. UseFlags = usesInstanceId ? UseFlags.InstanceId : UseFlags.None;
  93. if (usesRtLayer)
  94. {
  95. UseFlags |= UseFlags.RtLayer;
  96. }
  97. }
  98. }
  99. }