glsl: Clamp shared mem size to GL_MAX_COMPUTE_SHARED_MEMORY_SIZE
This commit is contained in:
parent
8c166c68d4
commit
94af0a00f6
|
@ -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