| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- using Ryujinx.Graphics.GAL;
- using System;
- using System.Collections.Generic;
- namespace Ryujinx.Graphics.Vulkan
- {
- class ResourceLayoutBuilder
- {
- private const int TotalSets = PipelineBase.DescriptorSetLayouts;
- private readonly List<ResourceDescriptor>[] _resourceDescriptors;
- private readonly List<ResourceUsage>[] _resourceUsages;
- public ResourceLayoutBuilder()
- {
- _resourceDescriptors = new List<ResourceDescriptor>[TotalSets];
- _resourceUsages = new List<ResourceUsage>[TotalSets];
- for (int index = 0; index < TotalSets; index++)
- {
- _resourceDescriptors[index] = [];
- _resourceUsages[index] = [];
- }
- }
- public ResourceLayoutBuilder Add(ResourceStages stages, ResourceType type, int binding, bool write = false)
- {
- int setIndex = type switch
- {
- ResourceType.UniformBuffer => PipelineBase.UniformSetIndex,
- ResourceType.StorageBuffer => PipelineBase.StorageSetIndex,
- ResourceType.TextureAndSampler or ResourceType.BufferTexture => PipelineBase.TextureSetIndex,
- ResourceType.Image or ResourceType.BufferImage => PipelineBase.ImageSetIndex,
- _ => throw new ArgumentException($"Invalid resource type \"{type}\"."),
- };
- _resourceDescriptors[setIndex].Add(new ResourceDescriptor(binding, 1, type, stages));
- _resourceUsages[setIndex].Add(new ResourceUsage(binding, 1, type, stages, write));
- return this;
- }
- public ResourceLayout Build()
- {
- ResourceDescriptorCollection[] descriptors = new ResourceDescriptorCollection[TotalSets];
- ResourceUsageCollection[] usages = new ResourceUsageCollection[TotalSets];
- for (int index = 0; index < TotalSets; index++)
- {
- descriptors[index] = new ResourceDescriptorCollection(_resourceDescriptors[index].ToArray().AsReadOnly());
- usages[index] = new ResourceUsageCollection(_resourceUsages[index].ToArray().AsReadOnly());
- }
- return new ResourceLayout(descriptors.AsReadOnly(), usages.AsReadOnly());
- }
- }
- }
|