mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-11-30 13:44:06 +08:00
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:b7501184b9
("radeonsi: implement inlinable uniforms") Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12138> (cherry picked from commit9fe8ae3fcd
)
This commit is contained in:
parent
98caa28e82
commit
e6c725a44b
@ -400,7 +400,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"
|
||||
},
|
||||
|
@ -694,6 +694,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;
|
||||
};
|
||||
|
@ -2232,10 +2232,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))) {
|
||||
|
Loading…
Reference in New Issue
Block a user