From f9df2c6bcdc1a6129289fb2878d4471c04e55fc7 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Fri, 21 Feb 2020 00:54:39 -0300 Subject: [PATCH] vk_state_tracker: Implement dirty flags for depth bounds --- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 3 +++ src/video_core/renderer_vulkan/vk_state_tracker.cpp | 6 ++++++ src/video_core/renderer_vulkan/vk_state_tracker.h | 5 +++++ 3 files changed, 14 insertions(+) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 958f90f99c..7029b3d5eb 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1037,6 +1037,9 @@ void RasterizerVulkan::UpdateBlendConstants(Tegra::Engines::Maxwell3D& gpu) { } void RasterizerVulkan::UpdateDepthBounds(Tegra::Engines::Maxwell3D& gpu) { + if (!state_tracker.TouchDepthBounds()) { + return; + } const auto& regs = gpu.regs; scheduler.Record([min = regs.depth_bounds[0], max = regs.depth_bounds[1]]( auto cmdbuf, auto& dld) { cmdbuf.setDepthBounds(min, max, dld); }); diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp index c7e54c68b2..b55180dd8a 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp +++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp @@ -32,6 +32,7 @@ Flags MakeInvalidationFlags() { flags[Scissors] = true; flags[DepthBias] = true; flags[BlendConstants] = true; + flags[DepthBounds] = true; return flags; } @@ -89,6 +90,10 @@ void SetupDirtyBlendConstants(Tables& tables) { FillBlock(tables[0], OFF(blend_color), NUM(blend_color), BlendConstants); } +void SetupDirtyDepthBounds(Tables& tables) { + FillBlock(tables[0], OFF(depth_bounds), NUM(depth_bounds), DepthBounds); +} + } // Anonymous namespace StateTracker::StateTracker(Core::System& system) @@ -102,6 +107,7 @@ void StateTracker::Initialize() { SetupDirtyScissors(tables); SetupDirtyDepthBias(tables); SetupDirtyBlendConstants(tables); + SetupDirtyDepthBounds(tables); auto& store = dirty.on_write_stores; store[RenderTargets] = true; diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.h b/src/video_core/renderer_vulkan/vk_state_tracker.h index a0493813a9..25b5c647b7 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h @@ -23,6 +23,7 @@ enum : u8 { Scissors, DepthBias, BlendConstants, + DepthBounds, }; } // namespace Dirty @@ -51,6 +52,10 @@ public: return Exchange(Dirty::BlendConstants, false); } + bool TouchDepthBounds() { + return Exchange(Dirty::DepthBounds, false); + } + private: using Flags = std::remove_reference_t;