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 }