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