From a83579b50a167ab9483e5058fd1c748018ef6d7c Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Tue, 13 Apr 2021 16:56:22 -0300
Subject: shader: Implement early Z tests

---
 src/shader_recompiler/backend/spirv/emit_spirv.cpp   | 3 +++
 src/shader_recompiler/profile.h                      | 1 +
 src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 1 +
 3 files changed, 5 insertions(+)

(limited to 'src')

diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
index 61a2018d7a..7ad00c4343 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
@@ -178,6 +178,9 @@ void DefineEntryPoint(const IR::Program& program, EmitContext& ctx, Id main) {
         if (program.info.stores_frag_depth) {
             ctx.AddExecutionMode(main, spv::ExecutionMode::DepthReplacing);
         }
+        if (ctx.profile.force_early_z) {
+            ctx.AddExecutionMode(main, spv::ExecutionMode::EarlyFragmentTests);
+        }
         break;
     default:
         throw NotImplementedException("Stage {}", program.stage);
diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h
index 06f1f59bd8..919bec4e2c 100644
--- a/src/shader_recompiler/profile.h
+++ b/src/shader_recompiler/profile.h
@@ -53,6 +53,7 @@ struct Profile {
 
     std::array<AttributeType, 32> generic_input_types{};
     bool convert_depth_mode{};
+    bool force_early_z{};
 
     InputTopology input_topology{};
 
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
index f49add208c..8a59a26112 100644
--- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
@@ -934,6 +934,7 @@ Shader::Profile PipelineCache::MakeProfile(const GraphicsPipelineCacheKey& key,
         profile.input_topology = Shader::InputTopology::TrianglesAdjacency;
         break;
     }
+    profile.force_early_z = key.state.early_z != 0;
     return profile;
 }
 
-- 
cgit v1.2.3-70-g09d2