From ceffda663c894208e6a466f528bb0b45b7d3c991 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Tue, 11 Aug 2026 21:30:31 -0400 Subject: [PATCH] [TEST] Fix TFB subdependency --- src/video_core/renderer_vulkan/vk_query_cache.cpp | 6 ++++++ .../renderer_vulkan/vk_render_pass_cache.cpp | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index a12dc00771..24ea8e5ce9 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -725,6 +725,9 @@ public: if (!device.IsExtTransformFeedbackSupported()) { return; } + if (!scheduler.IsRenderPassActive()) { + return; + } FlushBeginTFB(); has_started = true; } @@ -741,6 +744,9 @@ public: if (has_flushed_end_pending) { if (scheduler.IsRenderPassActive()) { FlushEndTFB(); + } else { + has_flushed_end_pending = false; + has_started = false; } } runtime.View3DRegs([this](Maxwell3D& maxwell3d) { diff --git a/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp b/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp index 66a7e874a0..17bd42c642 100644 --- a/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp @@ -145,6 +145,16 @@ VkRenderPass RenderPassCache::Get(const RenderPassKey& key) { .preserveAttachmentCount = 0, .pPreserveAttachments = nullptr, }; + const VkSubpassDependency counter_resume_dependency{ + .srcSubpass = 0, + .dstSubpass = 0, + .srcStageMask = VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, + .dstStageMask = VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, + .srcAccessMask = VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT, + .dstAccessMask = VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT, + .dependencyFlags = 0, + }; + const bool can_resume_transform_feedback = device->IsExtTransformFeedbackSupported(); pair->second = device->GetLogical().CreateRenderPass({ .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, .pNext = nullptr, @@ -153,8 +163,8 @@ VkRenderPass RenderPassCache::Get(const RenderPassKey& key) { .pAttachments = descriptions.empty() ? nullptr : descriptions.data(), .subpassCount = 1, .pSubpasses = &subpass, - .dependencyCount = 0, - .pDependencies = nullptr, + .dependencyCount = can_resume_transform_feedback ? 1u : 0u, + .pDependencies = can_resume_transform_feedback ? &counter_resume_dependency : nullptr, }); return *pair->second; }