glsl: Clamp shared mem size to GL_MAX_COMPUTE_SHARED_MEMORY_SIZE
This commit is contained in:
		| @@ -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))}; |     const std::string version{fmt::format("#version 450{}\n", GlslVersionSpecifier(ctx))}; | ||||||
|     ctx.header.insert(0, version); |     ctx.header.insert(0, version); | ||||||
|     if (program.shared_memory_size > 0) { |     if (program.shared_memory_size > 0) { | ||||||
|         ctx.header += |         const auto requested_size{program.shared_memory_size}; | ||||||
|             fmt::format("shared uint smem[{}];", Common::DivCeil(program.shared_memory_size, 4U)); |         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"; |     ctx.header += "void main(){\n"; | ||||||
|     if (program.local_memory_size > 0) { |     if (program.local_memory_size > 0) { | ||||||
|   | |||||||
| @@ -67,6 +67,8 @@ struct Profile { | |||||||
|     bool has_gl_precise_bug{}; |     bool has_gl_precise_bug{}; | ||||||
|     /// Ignores SPIR-V ordered vs unordered using GLSL semantics |     /// Ignores SPIR-V ordered vs unordered using GLSL semantics | ||||||
|     bool ignore_nan_fp_comparisons{}; |     bool ignore_nan_fp_comparisons{}; | ||||||
|  |  | ||||||
|  |     u32 gl_max_compute_smem_size{}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| } // namespace Shader | } // namespace Shader | ||||||
|   | |||||||
| @@ -211,6 +211,7 @@ ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindo | |||||||
|           .has_gl_component_indexing_bug = device.HasComponentIndexingBug(), |           .has_gl_component_indexing_bug = device.HasComponentIndexingBug(), | ||||||
|           .has_gl_precise_bug = device.HasPreciseBug(), |           .has_gl_precise_bug = device.HasPreciseBug(), | ||||||
|           .ignore_nan_fp_comparisons = true, |           .ignore_nan_fp_comparisons = true, | ||||||
|  |           .gl_max_compute_smem_size = device.GetMaxComputeSharedMemorySize(), | ||||||
|       }, |       }, | ||||||
|       host_info{ |       host_info{ | ||||||
|           .support_float16 = false, |           .support_float16 = false, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user