diff options
author | Connor Abbott <[email protected]> | 2020-06-23 14:12:09 +0200 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-06-26 09:34:33 +0000 |
commit | 1dd24bf27b2b1da65cf66f58481ec2331179b4e0 (patch) | |
tree | 0bd4e7013471b0a0b19abc94bb4244c059c53d3e /src | |
parent | d9dd989d2a5d08e465f3c7fcb427aa24ec6247d2 (diff) |
freedreno: Share constlen between different stages properly
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5607>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/freedreno/ir3/ir3_cache.c | 27 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/ir3/ir3_gallium.c | 23 |
2 files changed, 42 insertions, 8 deletions
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cache.c b/src/gallium/drivers/freedreno/ir3/ir3_cache.c index 0a121c41358..5f6bb20fe8b 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_cache.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_cache.c @@ -105,12 +105,13 @@ ir3_cache_lookup(struct ir3_cache *cache, const struct ir3_cache_key *key, }; struct ir3_shader_variant *variants[MESA_SHADER_STAGES]; + struct ir3_shader_key shader_key = key->key; for (gl_shader_stage stage = MESA_SHADER_VERTEX; stage < MESA_SHADER_STAGES; stage++) { if (shaders[stage]) { variants[stage] = - ir3_shader_variant(shaders[stage], key->key, false, debug); + ir3_shader_variant(shaders[stage], shader_key, false, debug); if (!variants[stage]) return NULL; } else { @@ -118,12 +119,28 @@ ir3_cache_lookup(struct ir3_cache *cache, const struct ir3_cache_key *key, } } + uint32_t safe_constlens = ir3_trim_constlen(variants, key->vs->compiler); + shader_key.safe_constlen = true; + + for (gl_shader_stage stage = MESA_SHADER_VERTEX; + stage < MESA_SHADER_STAGES; stage++) { + if (safe_constlens & (1 << stage)) { + variants[stage] = + ir3_shader_variant(shaders[stage], shader_key, false, debug); + if (!variants[stage]) + return NULL; + } + } + /* For tessellation, the binning shader is derived from the DS. */ struct ir3_shader_variant *bs; - if (key->ds) - bs = ir3_shader_variant(key->ds, key->key, true, debug); - else - bs = ir3_shader_variant(key->vs, key->key, true, debug); + if (key->ds) { + shader_key.safe_constlen = !!(safe_constlens & (1 << MESA_SHADER_TESS_EVAL)); + bs = ir3_shader_variant(key->ds, shader_key, true, debug); + } else { + shader_key.safe_constlen = !!(safe_constlens & (1 << MESA_SHADER_VERTEX)); + bs = ir3_shader_variant(key->vs, shader_key, true, debug); + } if (!bs) return NULL; diff --git a/src/gallium/drivers/freedreno/ir3/ir3_gallium.c b/src/gallium/drivers/freedreno/ir3/ir3_gallium.c index cc986f3dc4e..2a6bc936a31 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_gallium.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_gallium.c @@ -203,10 +203,27 @@ ir3_shader_create(struct ir3_compiler *compiler, break; } - ir3_shader_variant(shader, key, false, debug); + key.safe_constlen = false; + struct ir3_shader_variant *v = ir3_shader_variant(shader, key, false, debug); + if (!v) + return NULL; + + if (v->constlen > compiler->max_const_safe) { + key.safe_constlen = true; + ir3_shader_variant(shader, key, false, debug); + } + + if (nir->info.stage == MESA_SHADER_VERTEX) { + key.safe_constlen = false; + v = ir3_shader_variant(shader, key, true, debug); + if (!v) + return NULL; - if (nir->info.stage == MESA_SHADER_VERTEX) - ir3_shader_variant(shader, key, true, debug); + if (v->constlen > compiler->max_const_safe) { + key.safe_constlen = true; + ir3_shader_variant(shader, key, true, debug); + } + } shader->initial_variants_done = true; |