Archived
1
0
Fork 0
forked from Mirror/Ryujinx

Vulkan: Disable push descriptors on older NVIDIA GPUs (#6340)

Disables push descriptors on older NVIDIA GPUs (10xx and below), since it is clearly broken beyond comprehension. The existing workaround wasn't good enough and a more thorough one will probably cost more performance than the feature gains. The workaround has been removed.

Fixes #6331.
This commit is contained in:
riperiperi 2024-02-22 02:52:13 +00:00 committed by GitHub
parent 4f63782bac
commit 79f6c18a9b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 1 additions and 36 deletions

View file

@ -299,13 +299,6 @@ namespace Ryujinx.Graphics.Vulkan
// When the pipeline layout changes, push descriptor bindings are invalidated. // When the pipeline layout changes, push descriptor bindings are invalidated.
AdvancePdSequence(); AdvancePdSequence();
if (_gd.IsNvidiaPreTuring && !program.UsePushDescriptors && _program?.UsePushDescriptors == true && isBound)
{
// On older nvidia GPUs, we need to clear out the active push descriptor bindings when switching
// to normal descriptors. Keeping them bound can prevent buffers from binding properly in future.
ClearAndBindUniformBufferPd(cbs);
}
} }
_program = program; _program = program;
@ -806,35 +799,6 @@ namespace Ryujinx.Graphics.Vulkan
} }
} }
private void ClearAndBindUniformBufferPd(CommandBufferScoped cbs)
{
var bindingSegments = _program.BindingSegments[PipelineBase.UniformSetIndex];
long updatedBindings = 0;
DescriptorSetTemplateWriter writer = _templateUpdater.Begin(32 * Unsafe.SizeOf<DescriptorBufferInfo>());
foreach (ResourceBindingSegment segment in bindingSegments)
{
int binding = segment.Binding;
int count = segment.Count;
for (int i = 0; i < count; i++)
{
int index = binding + i;
updatedBindings |= 1L << index;
var bufferInfo = new DescriptorBufferInfo();
writer.Push(MemoryMarshal.CreateReadOnlySpan(ref bufferInfo, 1));
}
}
if (updatedBindings > 0)
{
DescriptorSetTemplate template = _program.GetPushDescriptorTemplate(updatedBindings);
_templateUpdater.CommitPushDescriptor(_gd, cbs, template, _program.PipelineLayout);
}
}
private void Initialize(CommandBufferScoped cbs, int setIndex, DescriptorSetCollection dsc) private void Initialize(CommandBufferScoped cbs, int setIndex, DescriptorSetCollection dsc)
{ {
// We don't support clearing texture descriptors currently. // We don't support clearing texture descriptors currently.

View file

@ -111,6 +111,7 @@ namespace Ryujinx.Graphics.Vulkan
bool usePushDescriptors = !isMinimal && bool usePushDescriptors = !isMinimal &&
VulkanConfiguration.UsePushDescriptors && VulkanConfiguration.UsePushDescriptors &&
_gd.Capabilities.SupportsPushDescriptors && _gd.Capabilities.SupportsPushDescriptors &&
!_gd.IsNvidiaPreTuring &&
!IsCompute && !IsCompute &&
CanUsePushDescriptors(gd, resourceLayout, IsCompute); CanUsePushDescriptors(gd, resourceLayout, IsCompute);