diff --git a/src/Ryujinx.Graphics.Vulkan/HardwareCapabilities.cs b/src/Ryujinx.Graphics.Vulkan/HardwareCapabilities.cs index 1e60c8fb44..c3a820190b 100644 --- a/src/Ryujinx.Graphics.Vulkan/HardwareCapabilities.cs +++ b/src/Ryujinx.Graphics.Vulkan/HardwareCapabilities.cs @@ -95,13 +95,7 @@ namespace Ryujinx.Graphics.Vulkan PortabilitySubsetFlags portabilitySubset, uint vertexBufferAlignment, uint subTexelPrecisionBits, - ulong minResourceAlignment, - uint maxPerStageSampledImages, - uint maxPerStageSamplers, - uint maxPerStageStorageBuffers, - uint maxPerStageStorageImages, - uint maxPerStageUniformBuffers, - uint maxPerStageResources) + ulong minResourceAlignment) { SupportsIndexTypeUint8 = supportsIndexTypeUint8; SupportsCustomBorderColor = supportsCustomBorderColor; @@ -139,12 +133,6 @@ namespace Ryujinx.Graphics.Vulkan VertexBufferAlignment = vertexBufferAlignment; SubTexelPrecisionBits = subTexelPrecisionBits; MinResourceAlignment = minResourceAlignment; - MaxPerStageSampledImages = maxPerStageSampledImages; - MaxPerStageSamplers = maxPerStageSamplers; - MaxPerStageStorageBuffers = maxPerStageStorageBuffers; - MaxPerStageStorageImages = maxPerStageStorageImages; - MaxPerStageUniformBuffers = maxPerStageUniformBuffers; - MaxPerStageResources = maxPerStageResources; } } } diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs index 0a6e070715..fb21f56dfb 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs @@ -10,100 +10,6 @@ namespace Ryujinx.Graphics.Vulkan static class PipelineLayoutFactory { - private struct ResourceCounts - { - private Array5 _uniformBuffersCount; - private Array5 _storageBuffersCount; - private Array5 _texturesCount; - private Array5 _imagesCount; - private Array5 _samplersCount; - private Array5 _totalCount; - - private void AddToStage(in ResourceDescriptor descriptor, int stageIndex) - { - switch (descriptor.Type) - { - case ResourceType.UniformBuffer: - _uniformBuffersCount[stageIndex] += descriptor.Count; - break; - case ResourceType.StorageBuffer: - _storageBuffersCount[stageIndex] += descriptor.Count; - break; - case ResourceType.Texture: - case ResourceType.TextureAndSampler: - case ResourceType.BufferTexture: - _texturesCount[stageIndex] += descriptor.Count; - break; - case ResourceType.Image: - case ResourceType.BufferImage: - _imagesCount[stageIndex] += descriptor.Count; - break; - case ResourceType.Sampler: - _samplersCount[stageIndex] += descriptor.Count; - break; - } - - _totalCount[stageIndex] += descriptor.Count; - } - - public void Add(in ResourceDescriptor descriptor) - { - if (descriptor.Stages.HasFlag(ResourceStages.Vertex) || descriptor.Stages.HasFlag(ResourceStages.Compute)) - { - AddToStage(descriptor, 0); - } - - if (descriptor.Stages.HasFlag(ResourceStages.TessellationControl)) - { - AddToStage(descriptor, 1); - } - - if (descriptor.Stages.HasFlag(ResourceStages.TessellationEvaluation)) - { - AddToStage(descriptor, 2); - } - - if (descriptor.Stages.HasFlag(ResourceStages.Geometry)) - { - AddToStage(descriptor, 3); - } - - if (descriptor.Stages.HasFlag(ResourceStages.Fragment)) - { - AddToStage(descriptor, 4); - } - } - - private static int Sum(ReadOnlySpan values) - { - int sum = 0; - - foreach (int value in values) - { - sum += value; - } - - return sum; - } - - public bool IsExceedingAnyMaxLimit(VulkanRenderer gd) - { - int maxUniformBuffers = Sum(_uniformBuffersCount.AsSpan()); - int maxStorageBuffers = Sum(_storageBuffersCount.AsSpan()); - int maxTextures = Sum(_texturesCount.AsSpan()); - int maxImages = Sum(_imagesCount.AsSpan()); - int maxSamplers = Sum(_samplersCount.AsSpan()); - int maxTotal = Sum(_totalCount.AsSpan()); - - return (uint)maxUniformBuffers > gd.Capabilities.MaxPerStageUniformBuffers || - (uint)maxStorageBuffers > gd.Capabilities.MaxPerStageStorageBuffers || - (uint)maxTextures > gd.Capabilities.MaxPerStageSampledImages || - (uint)maxImages > gd.Capabilities.MaxPerStageStorageImages || - (uint)maxSamplers > gd.Capabilities.MaxPerStageSamplers || - (uint)maxTotal > gd.Capabilities.MaxPerStageResources; - } - } - public static unsafe ResourceLayouts Create( VulkanRenderer gd, Device device, @@ -119,7 +25,6 @@ namespace Ryujinx.Graphics.Vulkan { ResourceDescriptorCollection rdc = setDescriptors[setIndex]; - ResourceCounts counts = new(); ResourceStages activeStages = ResourceStages.None; if (isMoltenVk) @@ -132,6 +37,8 @@ namespace Ryujinx.Graphics.Vulkan DescriptorSetLayoutBinding[] layoutBindings = new DescriptorSetLayoutBinding[rdc.Descriptors.Count]; + bool hasArray = false; + for (int descIndex = 0; descIndex < rdc.Descriptors.Count; descIndex++) { ResourceDescriptor descriptor = rdc.Descriptors[descIndex]; @@ -152,7 +59,10 @@ namespace Ryujinx.Graphics.Vulkan StageFlags = stages.Convert(), }; - counts.Add(descriptor); + if (descriptor.Count > 1) + { + hasArray = true; + } } fixed (DescriptorSetLayoutBinding* pLayoutBindings = layoutBindings) @@ -164,7 +74,7 @@ namespace Ryujinx.Graphics.Vulkan flags = DescriptorSetLayoutCreateFlags.PushDescriptorBitKhr; } - if (counts.IsExceedingAnyMaxLimit(gd)) + if (gd.Vendor == Vendor.Intel && hasArray) { // Some vendors (like Intel) have low per-stage limits. // We must set the flag if we exceed those limits. diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs index e35ff7ad0d..86a347e019 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs @@ -402,13 +402,7 @@ namespace Ryujinx.Graphics.Vulkan portabilityFlags, vertexBufferAlignment, properties.Limits.SubTexelPrecisionBits, - minResourceAlignment, - properties.Limits.MaxPerStageDescriptorSampledImages, - properties.Limits.MaxPerStageDescriptorSamplers, - properties.Limits.MaxPerStageDescriptorStorageBuffers, - properties.Limits.MaxPerStageDescriptorStorageImages, - properties.Limits.MaxPerStageDescriptorUniformBuffers, - properties.Limits.MaxPerStageResources); + minResourceAlignment); IsSharedMemory = MemoryAllocator.IsDeviceMemoryShared(_physicalDevice);