ResourceLayoutBuilder.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using Ryujinx.Graphics.GAL;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Runtime.Versioning;
  5. namespace Ryujinx.Graphics.Metal
  6. {
  7. [SupportedOSPlatform("macos")]
  8. class ResourceLayoutBuilder
  9. {
  10. private const int TotalSets = MetalRenderer.TotalSets;
  11. private readonly List<ResourceDescriptor>[] _resourceDescriptors;
  12. private readonly List<ResourceUsage>[] _resourceUsages;
  13. public ResourceLayoutBuilder()
  14. {
  15. _resourceDescriptors = new List<ResourceDescriptor>[TotalSets];
  16. _resourceUsages = new List<ResourceUsage>[TotalSets];
  17. for (int index = 0; index < TotalSets; index++)
  18. {
  19. _resourceDescriptors[index] = new();
  20. _resourceUsages[index] = new();
  21. }
  22. }
  23. public ResourceLayoutBuilder Add(ResourceStages stages, ResourceType type, int binding, bool write = false)
  24. {
  25. uint setIndex = type switch
  26. {
  27. ResourceType.UniformBuffer => Constants.ConstantBuffersSetIndex,
  28. ResourceType.StorageBuffer => Constants.StorageBuffersSetIndex,
  29. ResourceType.TextureAndSampler or ResourceType.BufferTexture => Constants.TexturesSetIndex,
  30. ResourceType.Image or ResourceType.BufferImage => Constants.ImagesSetIndex,
  31. _ => throw new ArgumentException($"Invalid resource type \"{type}\"."),
  32. };
  33. _resourceDescriptors[setIndex].Add(new ResourceDescriptor(binding, 1, type, stages));
  34. _resourceUsages[setIndex].Add(new ResourceUsage(binding, 1, type, stages, write));
  35. return this;
  36. }
  37. public ResourceLayout Build()
  38. {
  39. var descriptors = new ResourceDescriptorCollection[TotalSets];
  40. var usages = new ResourceUsageCollection[TotalSets];
  41. for (int index = 0; index < TotalSets; index++)
  42. {
  43. descriptors[index] = new ResourceDescriptorCollection(_resourceDescriptors[index].ToArray().AsReadOnly());
  44. usages[index] = new ResourceUsageCollection(_resourceUsages[index].ToArray().AsReadOnly());
  45. }
  46. return new ResourceLayout(descriptors.AsReadOnly(), usages.AsReadOnly());
  47. }
  48. }
  49. }