diff options
Diffstat (limited to 'src/shader_recompiler')
| -rw-r--r-- | src/shader_recompiler/backend/glsl/emit_glsl.cpp | 11 | ||||
| -rw-r--r-- | src/shader_recompiler/profile.h | 2 |
2 files changed, 11 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 |