summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-05-30 03:40:19 -0300
committerGravatar ameerj2021-07-22 21:51:34 -0400
commit916ca7432474e891864524dcbc6c879d5cdbfb72 (patch)
tree07ff6cc3f9737b20b4e65786f94cabe1dd3b254f /src
parentbuffer_cache: Mark uniform buffers as dirty if any enable bit changes (diff)
downloadyuzu-916ca7432474e891864524dcbc6c879d5cdbfb72.tar.gz
yuzu-916ca7432474e891864524dcbc6c879d5cdbfb72.tar.xz
yuzu-916ca7432474e891864524dcbc6c879d5cdbfb72.zip
opengl: Declare fragment outputs even if they are not used
Fixes Ori and the Blind Forest's menu on GLASM. For some reason (probably high level optimizations) it is not sanitized on SPIR-V for OpenGL. Vulkan is unaffected by this change.
Diffstat (limited to 'src')
-rw-r--r--src/shader_recompiler/backend/glasm/emit_context.cpp10
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm.cpp3
-rw-r--r--src/shader_recompiler/backend/spirv/emit_context.cpp2
-rw-r--r--src/shader_recompiler/profile.h4
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp7
6 files changed, 18 insertions, 10 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_context.cpp b/src/shader_recompiler/backend/glasm/emit_context.cpp
index e18526816..08918a5c2 100644
--- a/src/shader_recompiler/backend/glasm/emit_context.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_context.cpp
@@ -117,13 +117,9 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile
117 index, index); 117 index, index);
118 } 118 }
119 } 119 }
120 for (size_t index = 0; index < info.stores_frag_color.size(); ++index) { 120 if (stage == Stage::Fragment) {
121 if (!info.stores_frag_color[index]) { 121 Add("OUTPUT frag_color0=result.color;");
122 continue; 122 for (size_t index = 1; index < info.stores_frag_color.size(); ++index) {
123 }
124 if (index == 0) {
125 Add("OUTPUT frag_color0=result.color;");
126 } else {
127 Add("OUTPUT frag_color{}=result.color[{}];", index, index); 123 Add("OUTPUT frag_color{}=result.color[{}];", index, index);
128 } 124 }
129 } 125 }
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm.cpp b/src/shader_recompiler/backend/glasm/emit_glasm.cpp
index e23208d2c..70ca6f621 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm.cpp
@@ -298,8 +298,7 @@ void SetupOptions(const IR::Program& program, const Profile& profile,
298 if (stage == Stage::Fragment && runtime_info.force_early_z != 0) { 298 if (stage == Stage::Fragment && runtime_info.force_early_z != 0) {
299 header += "OPTION NV_early_fragment_tests;"; 299 header += "OPTION NV_early_fragment_tests;";
300 } 300 }
301 const auto non_zero_frag_colors{info.stores_frag_color | std::views::drop(1)}; 301 if (stage == Stage::Fragment) {
302 if (std::ranges::find(non_zero_frag_colors, true) != non_zero_frag_colors.end()) {
303 header += "OPTION ARB_draw_buffers;"; 302 header += "OPTION ARB_draw_buffers;";
304 } 303 }
305} 304}
diff --git a/src/shader_recompiler/backend/spirv/emit_context.cpp b/src/shader_recompiler/backend/spirv/emit_context.cpp
index 3e8899f53..7c618125e 100644
--- a/src/shader_recompiler/backend/spirv/emit_context.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_context.cpp
@@ -1320,7 +1320,7 @@ void EmitContext::DefineOutputs(const IR::Program& program) {
1320 break; 1320 break;
1321 case Stage::Fragment: 1321 case Stage::Fragment:
1322 for (u32 index = 0; index < 8; ++index) { 1322 for (u32 index = 0; index < 8; ++index) {
1323 if (!info.stores_frag_color[index]) { 1323 if (!info.stores_frag_color[index] && !profile.need_declared_frag_colors) {
1324 continue; 1324 continue;
1325 } 1325 }
1326 frag_color[index] = DefineOutput(*this, F32[4], std::nullopt); 1326 frag_color[index] = DefineOutput(*this, F32[4], std::nullopt);
diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h
index f8913bf14..f059e3b26 100644
--- a/src/shader_recompiler/profile.h
+++ b/src/shader_recompiler/profile.h
@@ -84,7 +84,11 @@ struct Profile {
84 bool support_int64_atomics{}; 84 bool support_int64_atomics{};
85 85
86 bool warp_size_potentially_larger_than_guest{}; 86 bool warp_size_potentially_larger_than_guest{};
87
87 bool lower_left_origin_mode{}; 88 bool lower_left_origin_mode{};
89 /// Fragment outputs have to be declared even if they are not written to avoid undefined values.
90 /// See Ori and the Blind Forest's main menu for reference.
91 bool need_declared_frag_colors{};
88 92
89 /// OpFClamp is broken and OpFMax + OpFMin should be used instead 93 /// OpFClamp is broken and OpFMax + OpFMin should be used instead
90 bool has_broken_spirv_clamp{}; 94 bool has_broken_spirv_clamp{};
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp
index 7d2ec4efa..6ea7c0ee8 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp
@@ -276,7 +276,9 @@ ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindo
276 .support_int64_atomics = false, 276 .support_int64_atomics = false,
277 277
278 .warp_size_potentially_larger_than_guest = true, 278 .warp_size_potentially_larger_than_guest = true,
279
279 .lower_left_origin_mode = true, 280 .lower_left_origin_mode = true,
281 .need_declared_frag_colors = true,
280 282
281 .has_broken_spirv_clamp = true, 283 .has_broken_spirv_clamp = true,
282 .has_broken_unsigned_image_offsets = true, 284 .has_broken_unsigned_image_offsets = true,
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
index b6998e37c..cec51cc77 100644
--- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
@@ -274,9 +274,16 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, Tegra::Engines::Maxw
274 .support_typeless_image_loads = device.IsFormatlessImageLoadSupported(), 274 .support_typeless_image_loads = device.IsFormatlessImageLoadSupported(),
275 .support_demote_to_helper_invocation = true, 275 .support_demote_to_helper_invocation = true,
276 .support_int64_atomics = device.IsExtShaderAtomicInt64Supported(), 276 .support_int64_atomics = device.IsExtShaderAtomicInt64Supported(),
277
277 .warp_size_potentially_larger_than_guest = device.IsWarpSizePotentiallyBiggerThanGuest(), 278 .warp_size_potentially_larger_than_guest = device.IsWarpSizePotentiallyBiggerThanGuest(),
279
280 .lower_left_origin_mode = false,
281 .need_declared_frag_colors = false,
282
278 .has_broken_spirv_clamp = driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR, 283 .has_broken_spirv_clamp = driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR,
279 .has_broken_unsigned_image_offsets = false, 284 .has_broken_unsigned_image_offsets = false,
285 .has_broken_signed_operations = false,
286 .ignore_nan_fp_comparisons = false,
280 }; 287 };
281} 288}
282 289