From ccbaa75e5eb55480d4bebf7fb98c33d1cb69c489 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Fri, 25 Sep 2026 19:03:42 -0400 Subject: [PATCH] Adjust cuts on depth draws --- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 3 +++ src/video_core/renderer_vulkan/vk_scheduler.cpp | 2 ++ src/video_core/renderer_vulkan/vk_scheduler.h | 9 +++++++++ src/video_core/renderer_vulkan/vk_texture_cache.cpp | 4 +++- 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 2562ff1ad3..c77d032f94 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -264,6 +264,8 @@ void RasterizerVulkan::PrepareDraw(bool is_indexed, bool skip_empty, Func&& draw pipeline->SetEngine(maxwell3d, gpu_memory); if (!pipeline->Configure(is_indexed)) return; + scheduler.MarkDepthWrites(maxwell3d->regs.depth_test_enable != 0 && + maxwell3d->regs.depth_write_enabled != 0); UpdateDynamicStates(pipeline->HasDynamicVertexInput()); @@ -583,6 +585,7 @@ void RasterizerVulkan::Clear(u32 layer_count) { if (aspect_flags == 0) { return; } + scheduler.MarkDepthWrites(!can_defer_clear && (aspect_flags & VK_IMAGE_ASPECT_DEPTH_BIT) != 0); if (use_stencil && framebuffer->HasAspectStencilBit() && regs.stencil_front_mask != 0xFF && regs.stencil_front_mask != 0) { diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 4cde9c8651..457221b2b1 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -99,6 +99,7 @@ void Scheduler::BeginRenderPassImpl(const Framebuffer* framebuffer, VkRenderPass state.framebuffer = framebuffer_handle; state.render_area = render_area; ++renderpass_serial; + renderpass_depth_writes = false; if (GPU::Logging::IsActive() && Settings::values.gpu_log_vulkan_calls.GetValue()) { const std::string render_pass_info = @@ -161,6 +162,7 @@ void Scheduler::RealizeDeferredClear() { dc.color_clear_mask, dc.depth_stencil, color_discard_mask, depth_stencil_discard); EndRenderPass(); BeginRenderPassImpl(dc.framebuffer, renderpass, clear_values.data(), count); + renderpass_depth_writes = dc.depth_stencil; } bool Scheduler::DeferColorClear(const Framebuffer* framebuffer, u32 rt_slot, diff --git a/src/video_core/renderer_vulkan/vk_scheduler.h b/src/video_core/renderer_vulkan/vk_scheduler.h index 587ed27f5b..c78faeecb5 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.h +++ b/src/video_core/renderer_vulkan/vk_scheduler.h @@ -97,6 +97,14 @@ public: renderpass_writes = true; } + void MarkDepthWrites(bool writes) noexcept { + renderpass_depth_writes |= writes; + } + + bool HasDepthWrites() const noexcept { + return renderpass_depth_writes; + } + /// Update the pipeline to the current execution context. bool UpdateGraphicsPipeline(GraphicsPipeline* pipeline); @@ -334,6 +342,7 @@ private: u64 renderpass_serial = 0; u64 wfi_serial = 0; bool renderpass_writes = false; + bool renderpass_depth_writes = false; u32 num_renderpass_images = 0; std::array renderpass_images{}; std::array renderpass_image_ranges{}; diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 71eb640975..9882e1d34c 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -1210,7 +1210,9 @@ void TextureCacheRuntime::EraseResolveShadow(VkImage msaa_image) { } void TextureCacheRuntime::BarrierFeedbackLoop() { - scheduler.RequestOutsideRenderPassOperationContext(); + if (scheduler.HasDepthWrites()) { + scheduler.RequestOutsideRenderPassOperationContext(); + } } void TextureCacheRuntime::ReinterpretImage(Image& dst, Image& src,