Vulkan: Minimize errors with feedback loop detection for AMD Radeon RX GPUs + Qualcomm SoCs

This commit is contained in:
KeatonTheBot 2025-04-27 00:14:15 -05:00
parent 2f48a5007a
commit 038f8352e0
3 changed files with 22 additions and 23 deletions

View file

@ -1525,20 +1525,24 @@ namespace Ryujinx.Graphics.Vulkan
private bool ChangeFeedbackLoop(FeedbackLoopAspects aspects) private bool ChangeFeedbackLoop(FeedbackLoopAspects aspects)
{ {
if (_feedbackLoop != aspects) // AMD Radeon RX GPUs + Qualcomm SoCs only
if ((Gd.Vendor == Vendor.Amd && Gd.GpuRenderer.Contains("RX")) || Gd.Vendor == Vendor.Qualcomm)
{ {
if (Gd.Capabilities.SupportsDynamicAttachmentFeedbackLoop) if (_feedbackLoop != aspects)
{ {
DynamicState.SetFeedbackLoop(aspects); if (Gd.Capabilities.SupportsDynamicAttachmentFeedbackLoop)
} {
else DynamicState.SetFeedbackLoop(aspects);
{ }
_newState.FeedbackLoopAspects = aspects; else
} {
_newState.FeedbackLoopAspects = aspects;
}
_feedbackLoop = aspects; _feedbackLoop = aspects;
return true; return true;
}
} }
return false; return false;

View file

@ -148,7 +148,7 @@ namespace Ryujinx.Graphics.Vulkan
if (_dirty.HasFlag(DirtyFlags.FeedbackLoop) && gd.Capabilities.SupportsDynamicAttachmentFeedbackLoop) if (_dirty.HasFlag(DirtyFlags.FeedbackLoop) && gd.Capabilities.SupportsDynamicAttachmentFeedbackLoop)
{ {
RecordFeedbackLoop(gd.DynamicFeedbackLoopApi, commandBuffer, gd); RecordFeedbackLoop(gd.DynamicFeedbackLoopApi, commandBuffer);
} }
_dirty = DirtyFlags.None; _dirty = DirtyFlags.None;
@ -190,20 +190,16 @@ namespace Ryujinx.Graphics.Vulkan
} }
} }
private readonly void RecordFeedbackLoop(ExtAttachmentFeedbackLoopDynamicState api, CommandBuffer commandBuffer, VulkanRenderer gd) private readonly void RecordFeedbackLoop(ExtAttachmentFeedbackLoopDynamicState api, CommandBuffer commandBuffer)
{ {
// AMD Radeon RX GPUs + Qualcomm SoCs only ImageAspectFlags aspects = (_feedbackLoopAspects & FeedbackLoopAspects.Color) != 0 ? ImageAspectFlags.ColorBit : 0;
if ((gd.Vendor == Vendor.Amd && gd.GpuRenderer.Contains("RX")) || gd.Vendor == Vendor.Qualcomm)
if ((_feedbackLoopAspects & FeedbackLoopAspects.Depth) != 0)
{ {
ImageAspectFlags aspects = (_feedbackLoopAspects & FeedbackLoopAspects.Color) != 0 ? ImageAspectFlags.ColorBit : 0; aspects |= ImageAspectFlags.DepthBit | ImageAspectFlags.StencilBit;
if ((_feedbackLoopAspects & FeedbackLoopAspects.Depth) != 0)
{
aspects |= ImageAspectFlags.DepthBit | ImageAspectFlags.StencilBit;
}
api.CmdSetAttachmentFeedbackLoopEnable(commandBuffer, aspects);
} }
api.CmdSetAttachmentFeedbackLoopEnable(commandBuffer, aspects);
} }
} }
} }

View file

@ -7,7 +7,6 @@ namespace Ryujinx.Graphics.Vulkan
{ {
struct PipelineState : IDisposable struct PipelineState : IDisposable
{ {
private const int RequiredSubgroupSize = 32;
private const int MaxDynamicStatesCount = 9; private const int MaxDynamicStatesCount = 9;
public PipelineUid Internal; public PipelineUid Internal;