GS/Vulkan: Always issue first barrier on RDNA3

It turns out *not* doing this causes GPU resets on RDNA3, specifically
Windows drivers. Despite the layout changing enforcing the execution
dependency between previous draws and the first input attachment read,
it still wants the region/fragment-local barrier...
This commit is contained in:
Stenzek 2024-05-11 01:48:07 +10:00 committed by Connor McLaughlin
parent 4cc4a6561c
commit ba7096c9fa
2 changed files with 9 additions and 1 deletions

View File

@ -5750,8 +5750,13 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config)
// We don't need the very first barrier if this is the first draw after switching to feedback loop,
// because the layout change in itself enforces the execution dependency. HDR needs a barrier between
// setup and the first draw to read it. TODO: Make HDR use subpasses instead.
// However, it turns out *not* doing this causes GPU resets on RDNA3, specifically Windows drivers.
// Despite the layout changing enforcing the execution dependency between previous draws and the first
// input attachment read, it still wants the region/fragment-local barrier...
const bool skip_first_barrier =
(draw_rt && draw_rt->GetLayout() != GSTextureVK::Layout::FeedbackLoop && !pipe.ps.hdr);
(draw_rt && draw_rt->GetLayout() != GSTextureVK::Layout::FeedbackLoop && !pipe.ps.hdr && !IsDeviceAMD());
OMSetRenderTargets(draw_rt, draw_ds, config.scissor, static_cast<FeedbackLoopFlag>(pipe.feedback_loop_flags));
if (pipe.IsRTFeedbackLoop())

View File

@ -68,6 +68,9 @@ public:
/// Returns true if running on an NVIDIA GPU.
__fi bool IsDeviceNVIDIA() const { return (m_device_properties.vendorID == 0x10DE); }
/// Returns true if running on an AMD GPU.
__fi bool IsDeviceAMD() const { return (m_device_properties.vendorID == 0x1002); }
// Creates a simple render pass.
VkRenderPass GetRenderPass(VkFormat color_format, VkFormat depth_format,
VkAttachmentLoadOp color_load_op = VK_ATTACHMENT_LOAD_OP_LOAD,