CachedShaderBindings.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using Ryujinx.Graphics.GAL;
  2. using Ryujinx.Graphics.Gpu.Engine;
  3. using Ryujinx.Graphics.Gpu.Image;
  4. using Ryujinx.Graphics.Shader;
  5. using System;
  6. using System.Linq;
  7. namespace Ryujinx.Graphics.Gpu.Shader
  8. {
  9. /// <summary>
  10. /// A collection of shader bindings ready for insertion into the buffer and texture managers.
  11. /// </summary>
  12. internal class CachedShaderBindings
  13. {
  14. public TextureBindingInfo[][] TextureBindings { get; }
  15. public TextureBindingInfo[][] ImageBindings { get; }
  16. public BufferDescriptor[][] ConstantBufferBindings { get; }
  17. public BufferDescriptor[][] StorageBufferBindings { get; }
  18. public int MaxTextureBinding { get; }
  19. public int MaxImageBinding { get; }
  20. /// <summary>
  21. /// Create a new cached shader bindings collection.
  22. /// </summary>
  23. /// <param name="isCompute">Whether the shader is for compute</param>
  24. /// <param name="stages">The stages used by the shader</param>
  25. public CachedShaderBindings(bool isCompute, CachedShaderStage[] stages)
  26. {
  27. int stageCount = isCompute ? 1 : Constants.ShaderStages;
  28. TextureBindings = new TextureBindingInfo[stageCount][];
  29. ImageBindings = new TextureBindingInfo[stageCount][];
  30. ConstantBufferBindings = new BufferDescriptor[stageCount][];
  31. StorageBufferBindings = new BufferDescriptor[stageCount][];
  32. int maxTextureBinding = -1;
  33. int maxImageBinding = -1;
  34. int offset = isCompute ? 0 : 1;
  35. for (int i = 0; i < stageCount; i++)
  36. {
  37. CachedShaderStage stage = stages[i + offset];
  38. if (stage == null)
  39. {
  40. TextureBindings[i] = Array.Empty<TextureBindingInfo>();
  41. ImageBindings[i] = Array.Empty<TextureBindingInfo>();
  42. ConstantBufferBindings[i] = Array.Empty<BufferDescriptor>();
  43. StorageBufferBindings[i] = Array.Empty<BufferDescriptor>();
  44. continue;
  45. }
  46. TextureBindings[i] = stage.Info.Textures.Select(descriptor =>
  47. {
  48. Target target = ShaderTexture.GetTarget(descriptor.Type);
  49. var result = new TextureBindingInfo(
  50. target,
  51. descriptor.Binding,
  52. descriptor.CbufSlot,
  53. descriptor.HandleIndex,
  54. descriptor.Flags);
  55. if (descriptor.Binding > maxTextureBinding)
  56. {
  57. maxTextureBinding = descriptor.Binding;
  58. }
  59. return result;
  60. }).ToArray();
  61. ImageBindings[i] = stage.Info.Images.Select(descriptor =>
  62. {
  63. Target target = ShaderTexture.GetTarget(descriptor.Type);
  64. Format format = ShaderTexture.GetFormat(descriptor.Format);
  65. var result = new TextureBindingInfo(
  66. target,
  67. format,
  68. descriptor.Binding,
  69. descriptor.CbufSlot,
  70. descriptor.HandleIndex,
  71. descriptor.Flags);
  72. if (descriptor.Binding > maxImageBinding)
  73. {
  74. maxImageBinding = descriptor.Binding;
  75. }
  76. return result;
  77. }).ToArray();
  78. ConstantBufferBindings[i] = stage.Info.CBuffers.ToArray();
  79. StorageBufferBindings[i] = stage.Info.SBuffers.ToArray();
  80. }
  81. MaxTextureBinding = maxTextureBinding;
  82. MaxImageBinding = maxImageBinding;
  83. }
  84. }
  85. }