summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-02-21 01:09:02 -0300
committerGravatar ReinUsesLisp2020-02-28 17:56:43 -0300
commit6ac3eb4d87af7793d805dc9f7fc43f45e59e212e (patch)
treece8f97c30593e199a9150b464fc82ac0200d2989 /src
parentvk_state_tracker: Implement dirty flags for depth bounds (diff)
downloadyuzu-6ac3eb4d87af7793d805dc9f7fc43f45e59e212e.tar.gz
yuzu-6ac3eb4d87af7793d805dc9f7fc43f45e59e212e.tar.xz
yuzu-6ac3eb4d87af7793d805dc9f7fc43f45e59e212e.zip
vk_state_tracker: Implement dirty flags for stencil properties
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp3
-rw-r--r--src/video_core/renderer_vulkan/vk_state_tracker.cpp13
-rw-r--r--src/video_core/renderer_vulkan/vk_state_tracker.h5
3 files changed, 21 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index 7029b3d5e..eb9c49d5e 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -1046,6 +1046,9 @@ void RasterizerVulkan::UpdateDepthBounds(Tegra::Engines::Maxwell3D& gpu) {
1046} 1046}
1047 1047
1048void RasterizerVulkan::UpdateStencilFaces(Tegra::Engines::Maxwell3D& gpu) { 1048void RasterizerVulkan::UpdateStencilFaces(Tegra::Engines::Maxwell3D& gpu) {
1049 if (!state_tracker.TouchStencilProperties()) {
1050 return;
1051 }
1049 const auto& regs = gpu.regs; 1052 const auto& regs = gpu.regs;
1050 if (regs.stencil_two_side_enable) { 1053 if (regs.stencil_two_side_enable) {
1051 // Separate values per face 1054 // Separate values per face
diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp
index b55180dd8..3fd0476b6 100644
--- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp
+++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp
@@ -33,6 +33,7 @@ Flags MakeInvalidationFlags() {
33 flags[DepthBias] = true; 33 flags[DepthBias] = true;
34 flags[BlendConstants] = true; 34 flags[BlendConstants] = true;
35 flags[DepthBounds] = true; 35 flags[DepthBounds] = true;
36 flags[StencilProperties] = true;
36 return flags; 37 return flags;
37} 38}
38 39
@@ -94,6 +95,17 @@ void SetupDirtyDepthBounds(Tables& tables) {
94 FillBlock(tables[0], OFF(depth_bounds), NUM(depth_bounds), DepthBounds); 95 FillBlock(tables[0], OFF(depth_bounds), NUM(depth_bounds), DepthBounds);
95} 96}
96 97
98void SetupDirtyStencilProperties(Tables& tables) {
99 auto& table = tables[0];
100 table[OFF(stencil_two_side_enable)] = StencilProperties;
101 table[OFF(stencil_front_func_ref)] = StencilProperties;
102 table[OFF(stencil_front_mask)] = StencilProperties;
103 table[OFF(stencil_front_func_mask)] = StencilProperties;
104 table[OFF(stencil_back_func_ref)] = StencilProperties;
105 table[OFF(stencil_back_mask)] = StencilProperties;
106 table[OFF(stencil_back_func_mask)] = StencilProperties;
107}
108
97} // Anonymous namespace 109} // Anonymous namespace
98 110
99StateTracker::StateTracker(Core::System& system) 111StateTracker::StateTracker(Core::System& system)
@@ -108,6 +120,7 @@ void StateTracker::Initialize() {
108 SetupDirtyDepthBias(tables); 120 SetupDirtyDepthBias(tables);
109 SetupDirtyBlendConstants(tables); 121 SetupDirtyBlendConstants(tables);
110 SetupDirtyDepthBounds(tables); 122 SetupDirtyDepthBounds(tables);
123 SetupDirtyStencilProperties(tables);
111 124
112 auto& store = dirty.on_write_stores; 125 auto& store = dirty.on_write_stores;
113 store[RenderTargets] = true; 126 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 25b5c647b..1d8434dd0 100644
--- a/src/video_core/renderer_vulkan/vk_state_tracker.h
+++ b/src/video_core/renderer_vulkan/vk_state_tracker.h
@@ -24,6 +24,7 @@ enum : u8 {
24 DepthBias, 24 DepthBias,
25 BlendConstants, 25 BlendConstants,
26 DepthBounds, 26 DepthBounds,
27 StencilProperties,
27}; 28};
28 29
29} // namespace Dirty 30} // namespace Dirty
@@ -56,6 +57,10 @@ public:
56 return Exchange(Dirty::DepthBounds, false); 57 return Exchange(Dirty::DepthBounds, false);
57 } 58 }
58 59
60 bool TouchStencilProperties() {
61 return Exchange(Dirty::StencilProperties, false);
62 }
63
59private: 64private:
60 using Flags = std::remove_reference_t<decltype(Tegra::Engines::Maxwell3D::dirty.flags)>; 65 using Flags = std::remove_reference_t<decltype(Tegra::Engines::Maxwell3D::dirty.flags)>;
61 66