From 1c5a15e8e415d61f3d8f3d98996ef549deeac5d1 Mon Sep 17 00:00:00 2001 From: Gabriel A Date: Sat, 6 Jul 2024 15:19:13 -0300 Subject: [PATCH] Simply buffer texture existence check --- .../ShaderCollection.cs | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/Ryujinx.Graphics.Vulkan/ShaderCollection.cs b/src/Ryujinx.Graphics.Vulkan/ShaderCollection.cs index c5220185c8..eec2a31805 100644 --- a/src/Ryujinx.Graphics.Vulkan/ShaderCollection.cs +++ b/src/Ryujinx.Graphics.Vulkan/ShaderCollection.cs @@ -129,25 +129,11 @@ namespace Ryujinx.Graphics.Vulkan Stages = stages; ClearSegments = BuildClearSegments(sets); - BindingSegments = BuildBindingSegments(resourceLayout.SetUsages); + BindingSegments = BuildBindingSegments(resourceLayout.SetUsages, out bool usesBufferTextures); Templates = BuildTemplates(usePushDescriptors); - if (gd.Vendor == Vendor.Qualcomm) - { - // Updating buffer bindings using template updates crashes the Adreno driver on Windows. - - foreach (ResourceBindingSegment[] stageSegments in BindingSegments) - { - foreach (ResourceBindingSegment bindingSegment in stageSegments) - { - if (bindingSegment.Type == ResourceType.BufferTexture) - { - UpdateTexturesWithoutTemplate = true; - break; - } - } - } - } + // Updating buffer texture bindings using template updates crashes the Adreno driver on Windows. + UpdateTexturesWithoutTemplate = gd.Vendor == Vendor.Qualcomm && usesBufferTextures; _compileTask = Task.CompletedTask; _firstBackgroundUse = false; @@ -299,8 +285,10 @@ namespace Ryujinx.Graphics.Vulkan return segments; } - private static ResourceBindingSegment[][] BuildBindingSegments(ReadOnlyCollection setUsages) + private static ResourceBindingSegment[][] BuildBindingSegments(ReadOnlyCollection setUsages, out bool usesBufferTextures) { + usesBufferTextures = false; + ResourceBindingSegment[][] segments = new ResourceBindingSegment[setUsages.Count][]; for (int setIndex = 0; setIndex < setUsages.Count; setIndex++) @@ -314,6 +302,11 @@ namespace Ryujinx.Graphics.Vulkan { ResourceUsage usage = setUsages[setIndex].Usages[index]; + if (usage.Type == ResourceType.BufferTexture) + { + usesBufferTextures = true; + } + if (currentUsage.Binding + currentCount != usage.Binding || currentUsage.Type != usage.Type || currentUsage.Stages != usage.Stages ||