summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-05-21 18:27:37 -0300
committerGravatar ameerj2021-07-22 21:51:33 -0400
commit84feabac881443d27f84f8fec5eba6dc3b13b620 (patch)
tree7b3dd78d2753a0d73e358182d989d65836026303 /src
parentglasm: Set transform feedback state (diff)
downloadyuzu-84feabac881443d27f84f8fec5eba6dc3b13b620.tar.gz
yuzu-84feabac881443d27f84f8fec5eba6dc3b13b620.tar.xz
yuzu-84feabac881443d27f84f8fec5eba6dc3b13b620.zip
glasm: Implement forced early Z
Diffstat (limited to 'src')
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm.cpp8
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.cpp4
2 files changed, 8 insertions, 4 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm.cpp b/src/shader_recompiler/backend/glasm/emit_glasm.cpp
index edff04a44..0c2bbf284 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm.cpp
@@ -261,7 +261,8 @@ void EmitCode(EmitContext& ctx, const IR::Program& program) {
261 } 261 }
262} 262}
263 263
264void SetupOptions(const IR::Program& program, const Profile& profile, std::string& header) { 264void SetupOptions(const IR::Program& program, const Profile& profile,
265 const RuntimeInfo& runtime_info, std::string& header) {
265 const Info& info{program.info}; 266 const Info& info{program.info};
266 const Stage stage{program.stage}; 267 const Stage stage{program.stage};
267 268
@@ -296,6 +297,9 @@ void SetupOptions(const IR::Program& program, const Profile& profile, std::strin
296 header += "OPTION NV_viewport_array2;"; 297 header += "OPTION NV_viewport_array2;";
297 } 298 }
298 } 299 }
300 if (stage == Stage::Fragment && runtime_info.force_early_z != 0) {
301 header += "OPTION NV_early_fragment_tests;";
302 }
299 const auto non_zero_frag_colors{info.stores_frag_color | std::views::drop(1)}; 303 const auto non_zero_frag_colors{info.stores_frag_color | std::views::drop(1)};
300 if (std::ranges::find(non_zero_frag_colors, true) != non_zero_frag_colors.end()) { 304 if (std::ranges::find(non_zero_frag_colors, true) != non_zero_frag_colors.end()) {
301 header += "OPTION ARB_draw_buffers;"; 305 header += "OPTION ARB_draw_buffers;";
@@ -380,7 +384,7 @@ std::string EmitGLASM(const Profile& profile, const RuntimeInfo& runtime_info, I
380 Precolor(ctx, program); 384 Precolor(ctx, program);
381 EmitCode(ctx, program); 385 EmitCode(ctx, program);
382 std::string header{StageHeader(program.stage)}; 386 std::string header{StageHeader(program.stage)};
383 SetupOptions(program, profile, header); 387 SetupOptions(program, profile, runtime_info, header);
384 switch (program.stage) { 388 switch (program.stage) {
385 case Stage::TessellationControl: 389 case Stage::TessellationControl:
386 header += fmt::format("VERTICES_OUT {};", program.invocations); 390 header += fmt::format("VERTICES_OUT {};", program.invocations);
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp
index 0a0f1324f..e678b4bb2 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp
@@ -219,8 +219,8 @@ Shader::RuntimeInfo MakeRuntimeInfo(const GraphicsProgramKey& key,
219 return Shader::TessSpacing::Equal; 219 return Shader::TessSpacing::Equal;
220 }(); 220 }();
221 break; 221 break;
222 case Shader::Stage::Geometry: 222 case Shader::Stage::Fragment:
223 223 info.force_early_z = key.early_z != 0;
224 break; 224 break;
225 default: 225 default:
226 break; 226 break;