summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorameerj <52414509+ameerj@users.noreply.github.com>2021-07-12 08:03:25 +0200
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:40 +0200
commit94af0a00f67c9f28fcaf170458e55b7a95de76bf (patch)
tree82028b10b54dc4483a7b1e76003c4efa44f7938a
parentgl_shader_cache: Properly implement asynchronous shaders (diff)
downloadyuzu-94af0a00f67c9f28fcaf170458e55b7a95de76bf.tar
yuzu-94af0a00f67c9f28fcaf170458e55b7a95de76bf.tar.gz
yuzu-94af0a00f67c9f28fcaf170458e55b7a95de76bf.tar.bz2
yuzu-94af0a00f67c9f28fcaf170458e55b7a95de76bf.tar.lz
yuzu-94af0a00f67c9f28fcaf170458e55b7a95de76bf.tar.xz
yuzu-94af0a00f67c9f28fcaf170458e55b7a95de76bf.tar.zst
yuzu-94af0a00f67c9f28fcaf170458e55b7a95de76bf.zip
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl.cpp11
-rw-r--r--src/shader_recompiler/profile.h2
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.cpp1
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
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) {
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 {
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
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
.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,