freedreno: Refactor ir3_cache shader compilation

Use an array, which makes it more like turnip and makes implementing the
const limits easier.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5607>
This commit is contained in:
Connor Abbott 2020-06-23 13:19:07 +02:00 committed by Marge Bot
parent 8ad65609da
commit d9dd989d2a
1 changed files with 29 additions and 22 deletions

View File

@ -93,17 +93,29 @@ ir3_cache_lookup(struct ir3_cache *cache, const struct ir3_cache_key *key,
return entry->data;
}
struct ir3_shader_variant *vs = ir3_shader_variant(key->vs, key->key, false, debug);
if (!vs)
return NULL;
struct ir3_shader_variant *hs = NULL, *ds = NULL;
if (key->hs) {
if (key->hs)
debug_assert(key->ds);
hs = ir3_shader_variant(key->hs, key->key, false, debug);
ds = ir3_shader_variant(key->ds, key->key, false, debug);
if (!hs || ! ds)
return NULL;
struct ir3_shader *shaders[MESA_SHADER_STAGES] = {
[MESA_SHADER_VERTEX] = key->vs,
[MESA_SHADER_TESS_CTRL] = key->hs,
[MESA_SHADER_TESS_EVAL] = key->ds,
[MESA_SHADER_GEOMETRY] = key->gs,
[MESA_SHADER_FRAGMENT] = key->fs,
};
struct ir3_shader_variant *variants[MESA_SHADER_STAGES];
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);
if (!variants[stage])
return NULL;
} else {
variants[stage] = NULL;
}
}
/* For tessellation, the binning shader is derived from the DS. */
@ -115,19 +127,14 @@ ir3_cache_lookup(struct ir3_cache *cache, const struct ir3_cache_key *key,
if (!bs)
return NULL;
struct ir3_shader_variant *gs = NULL;
if (key->gs) {
gs = ir3_shader_variant(key->gs, key->key, false, debug);
if (!gs)
return NULL;
}
struct ir3_shader_variant *fs = ir3_shader_variant(key->fs, key->key, false, debug);
if (!fs)
return NULL;
struct ir3_program_state *state =
cache->funcs->create_state(cache->data, bs, vs, hs, ds, gs, fs, &key->key);
cache->funcs->create_state(cache->data, bs,
variants[MESA_SHADER_VERTEX],
variants[MESA_SHADER_TESS_CTRL],
variants[MESA_SHADER_TESS_EVAL],
variants[MESA_SHADER_GEOMETRY],
variants[MESA_SHADER_FRAGMENT],
&key->key);
state->key = *key;
/* NOTE: uses copy of key in state obj, because pointer passed by caller