Parcourir la source

glsl: Clamp shared mem size to GL_MAX_COMPUTE_SHARED_MEMORY_SIZE

ameerj il y a 5 ans
Parent
commit
94af0a00f6

+ 9 - 2
src/shader_recompiler/backend/glsl/emit_glsl.cpp

@@ -218,8 +218,15 @@ std::string EmitGLSL(const Profile& profile, const RuntimeInfo& runtime_info, IR
     const std::string version{fmt::format("#version 450{}\n", GlslVersionSpecifier(ctx))};
     ctx.header.insert(0, version);
     if (program.shared_memory_size > 0) {
-        ctx.header +=
-            fmt::format("shared uint smem[{}];", Common::DivCeil(program.shared_memory_size, 4U));
+        const auto requested_size{program.shared_memory_size};
+        const auto max_size{profile.gl_max_compute_smem_size};
+        const bool needs_clamp{requested_size > max_size};
+        if (needs_clamp) {
+            LOG_WARNING(Shader_GLSL, "Requested shared memory size ({}) exceeds device limit ({})",
+                        requested_size, max_size);
+        }
+        const auto smem_size{needs_clamp ? max_size : requested_size};
+        ctx.header += fmt::format("shared uint smem[{}];", Common::DivCeil(smem_size, 4U));
     }
     ctx.header += "void main(){\n";
     if (program.local_memory_size > 0) {

+ 2 - 0
src/shader_recompiler/profile.h

@@ -67,6 +67,8 @@ struct Profile {
     bool has_gl_precise_bug{};
     /// Ignores SPIR-V ordered vs unordered using GLSL semantics
     bool ignore_nan_fp_comparisons{};
+
+    u32 gl_max_compute_smem_size{};
 };
 
 } // namespace Shader

+ 1 - 0
src/video_core/renderer_opengl/gl_shader_cache.cpp

@@ -211,6 +211,7 @@ ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindo
           .has_gl_component_indexing_bug = device.HasComponentIndexingBug(),
           .has_gl_precise_bug = device.HasPreciseBug(),
           .ignore_nan_fp_comparisons = true,
+          .gl_max_compute_smem_size = device.GetMaxComputeSharedMemorySize(),
       },
       host_info{
           .support_float16 = false,