freedreno: Share constlen between different stages properly
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5607>
This commit is contained in:
@@ -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_variant *variants[MESA_SHADER_STAGES];
|
||||||
|
struct ir3_shader_key shader_key = key->key;
|
||||||
|
|
||||||
for (gl_shader_stage stage = MESA_SHADER_VERTEX;
|
for (gl_shader_stage stage = MESA_SHADER_VERTEX;
|
||||||
stage < MESA_SHADER_STAGES; stage++) {
|
stage < MESA_SHADER_STAGES; stage++) {
|
||||||
if (shaders[stage]) {
|
if (shaders[stage]) {
|
||||||
variants[stage] =
|
variants[stage] =
|
||||||
ir3_shader_variant(shaders[stage], key->key, false, debug);
|
ir3_shader_variant(shaders[stage], shader_key, false, debug);
|
||||||
if (!variants[stage])
|
if (!variants[stage])
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} 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. */
|
/* For tessellation, the binning shader is derived from the DS. */
|
||||||
struct ir3_shader_variant *bs;
|
struct ir3_shader_variant *bs;
|
||||||
if (key->ds)
|
if (key->ds) {
|
||||||
bs = ir3_shader_variant(key->ds, key->key, true, debug);
|
shader_key.safe_constlen = !!(safe_constlens & (1 << MESA_SHADER_TESS_EVAL));
|
||||||
else
|
bs = ir3_shader_variant(key->ds, shader_key, true, debug);
|
||||||
bs = ir3_shader_variant(key->vs, key->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)
|
if (!bs)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@@ -203,10 +203,27 @@ ir3_shader_create(struct ir3_compiler *compiler,
|
|||||||
break;
|
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)
|
if (v->constlen > compiler->max_const_safe) {
|
||||||
ir3_shader_variant(shader, key, true, debug);
|
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;
|
shader->initial_variants_done = true;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user