Mesa (staging/21.2): radeonsi: don't create an infinite number of variants
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Aug 9 21:46:59 UTC 2021
Module: Mesa
Branch: staging/21.2
Commit: ee5df9e744845fe473a94853c210c547bde2985e
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ee5df9e744845fe473a94853c210c547bde2985e
Author: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Date: Fri Jul 30 11:48:28 2021 +0200
radeonsi: don't create an infinite number of variants
If a shader has code like this:
uniform float timestamp;
...
if (timestamp > 0.0)
do_something()
And timestamp is modified each frame, we'll end up generating a new
variant per frame.
This commit introduces a hard limit on the number of variants we generate
for a single shader.
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5121
Fixes: b7501184b90 ("radeonsi: implement inlinable uniforms")
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12138>
(cherry picked from commit 9fe8ae3fcde8d7608d5b03ace51a4a3cebf18fee)
---
.pick_status.json | 2 +-
src/gallium/drivers/radeonsi/si_shader.h | 3 +++
src/gallium/drivers/radeonsi/si_state_shaders.c | 25 +++++++++++++++++++++++--
3 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/.pick_status.json b/.pick_status.json
index df7276757e1..5a22d9ea71c 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -373,7 +373,7 @@
"description": "radeonsi: don't create an infinite number of variants",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "b7501184b90a20015885b3f2276a7a5ceaef31a7"
},
diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h
index b3847db6b05..9cdf8aded1e 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -698,6 +698,9 @@ struct si_shader_key {
unsigned inline_uniforms:1;
+ /* This must be kept last to limit the number of variants
+ * depending only on the uniform values.
+ */
uint32_t inlined_uniform_values[MAX_INLINABLE_UNIFORMS];
} opt;
};
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 5ef033ed6a5..79792f08674 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -2243,10 +2243,31 @@ current_not_ready:
simple_mtx_lock(&sel->mutex);
+ /* Compute the size of the key without the uniform values. */
+ size_t s = (void*)&key->opt.inlined_uniform_values - (void*)key;
+ int variant_count = 0;
+ const int max_inline_uniforms_variants = 5;
+
/* Find the shader variant. */
for (iter = sel->first_variant; iter; iter = iter->next_variant) {
- /* Don't check the "current" shader. We checked it above. */
- if (current != iter && memcmp(&iter->key, key, sizeof(*key)) == 0) {
+ if (memcmp(&iter->key, key, s) == 0) {
+ /* Check the inlined uniform values separatly, and count
+ * the number of variants based on them.
+ */
+ if (key->opt.inline_uniforms &&
+ memcmp(iter->key.opt.inlined_uniform_values,
+ key->opt.inlined_uniform_values,
+ MAX_INLINABLE_UNIFORMS * 4) != 0) {
+ if (variant_count++ > max_inline_uniforms_variants) {
+ /* Too many variants. Disable inlining for this shader. */
+ key->opt.inline_uniforms = 0;
+ memset(key->opt.inlined_uniform_values, 0, MAX_INLINABLE_UNIFORMS * 4);
+ simple_mtx_unlock(&sel->mutex);
+ goto again;
+ }
+ continue;
+ }
+
simple_mtx_unlock(&sel->mutex);
if (unlikely(!util_queue_fence_is_signalled(&iter->ready))) {
More information about the mesa-commit
mailing list