freedreno: Share constlen between different stages properly
authorConnor Abbott <cwabbott0@gmail.com>
Tue, 23 Jun 2020 12:12:09 +0000 (14:12 +0200)
committerMarge Bot <eric+marge@anholt.net>
Fri, 26 Jun 2020 09:34:33 +0000 (09:34 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5607>

src/gallium/drivers/freedreno/ir3/ir3_cache.c
src/gallium/drivers/freedreno/ir3/ir3_gallium.c

index 0a121c41358e1effd028eaa4d634b547415548d6..5f6bb20fe8b788d376fc251e2311431ff0002336 100644 (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;
 
index cc986f3dc4e673be0fa2f3334a12a2bde45495a0..2a6bc936a31b9cd031bb272c530659e44d52bc49 100644 (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 (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;