freedreno: Share constlen between different stages properly

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5607>
This commit is contained in:
Connor Abbott
2020-06-23 14:12:09 +02:00
committed by Marge Bot
parent d9dd989d2a
commit 1dd24bf27b
2 changed files with 42 additions and 8 deletions

View File

@@ -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;

View File

@@ -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 (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, 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 (v->constlen > compiler->max_const_safe) {
key.safe_constlen = true;
ir3_shader_variant(shader, key, true, debug);
}
}
shader->initial_variants_done = true;