diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/shader_recompiler/backend/glsl/emit_glsl.cpp | 11 | ||||
| -rw-r--r-- | src/shader_recompiler/profile.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.cpp | 1 |
3 files changed, 12 insertions, 2 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl.cpp b/src/shader_recompiler/backend/glsl/emit_glsl.cpp index ffdc6dbba..c5e819a0a 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl.cpp | |||
| @@ -218,8 +218,15 @@ std::string EmitGLSL(const Profile& profile, const RuntimeInfo& runtime_info, IR | |||
| 218 | const std::string version{fmt::format("#version 450{}\n", GlslVersionSpecifier(ctx))}; | 218 | const std::string version{fmt::format("#version 450{}\n", GlslVersionSpecifier(ctx))}; |
| 219 | ctx.header.insert(0, version); | 219 | ctx.header.insert(0, version); |
| 220 | if (program.shared_memory_size > 0) { | 220 | if (program.shared_memory_size > 0) { |
| 221 | ctx.header += | 221 | const auto requested_size{program.shared_memory_size}; |
| 222 | fmt::format("shared uint smem[{}];", Common::DivCeil(program.shared_memory_size, 4U)); | 222 | const auto max_size{profile.gl_max_compute_smem_size}; |
| 223 | const bool needs_clamp{requested_size > max_size}; | ||
| 224 | if (needs_clamp) { | ||
| 225 | LOG_WARNING(Shader_GLSL, "Requested shared memory size ({}) exceeds device limit ({})", | ||
| 226 | requested_size, max_size); | ||
| 227 | } | ||
| 228 | const auto smem_size{needs_clamp ? max_size : requested_size}; | ||
| 229 | ctx.header += fmt::format("shared uint smem[{}];", Common::DivCeil(smem_size, 4U)); | ||
| 223 | } | 230 | } |
| 224 | ctx.header += "void main(){\n"; | 231 | ctx.header += "void main(){\n"; |
| 225 | if (program.local_memory_size > 0) { | 232 | if (program.local_memory_size > 0) { |
diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h index 501dcaf71..f0c3b3b17 100644 --- a/src/shader_recompiler/profile.h +++ b/src/shader_recompiler/profile.h | |||
| @@ -67,6 +67,8 @@ struct Profile { | |||
| 67 | bool has_gl_precise_bug{}; | 67 | bool has_gl_precise_bug{}; |
| 68 | /// Ignores SPIR-V ordered vs unordered using GLSL semantics | 68 | /// Ignores SPIR-V ordered vs unordered using GLSL semantics |
| 69 | bool ignore_nan_fp_comparisons{}; | 69 | bool ignore_nan_fp_comparisons{}; |
| 70 | |||
| 71 | u32 gl_max_compute_smem_size{}; | ||
| 70 | }; | 72 | }; |
| 71 | 73 | ||
| 72 | } // namespace Shader | 74 | } // namespace Shader |
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index 24f035c37..7ecafc862 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp | |||
| @@ -211,6 +211,7 @@ ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindo | |||
| 211 | .has_gl_component_indexing_bug = device.HasComponentIndexingBug(), | 211 | .has_gl_component_indexing_bug = device.HasComponentIndexingBug(), |
| 212 | .has_gl_precise_bug = device.HasPreciseBug(), | 212 | .has_gl_precise_bug = device.HasPreciseBug(), |
| 213 | .ignore_nan_fp_comparisons = true, | 213 | .ignore_nan_fp_comparisons = true, |
| 214 | .gl_max_compute_smem_size = device.GetMaxComputeSharedMemorySize(), | ||
| 214 | }, | 215 | }, |
| 215 | host_info{ | 216 | host_info{ |
| 216 | .support_float16 = false, | 217 | .support_float16 = false, |