freedreno/ir3: split out regmask
[mesa.git] / src / freedreno / ir3 / ir3_shader.c
index bcea1e82534c41086c032066cd48e7ab7cb9d1e4..146cc352f1c57176f8cc64b735cb47408fcb6fe0 100644 (file)
@@ -176,13 +176,15 @@ compile_variant(struct ir3_shader_variant *v)
 {
        int ret = ir3_compile_shader_nir(v->shader->compiler, v);
        if (ret) {
-               debug_error("compile failed!");
+               _debug_printf("compile failed! (%s:%s)", v->shader->nir->info.name,
+                               v->shader->nir->info.label);
                return false;
        }
 
        assemble_variant(v);
        if (!v->bin) {
-               debug_error("assemble failed!");
+               _debug_printf("assemble failed! (%s:%s)", v->shader->nir->info.name,
+                               v->shader->nir->info.label);
                return false;
        }
 
@@ -245,12 +247,28 @@ create_variant(struct ir3_shader *shader, const struct ir3_shader_key *key)
                        goto fail;
        }
 
+       if (ir3_disk_cache_retrieve(shader->compiler, v))
+               return v;
+
+       if (!shader->nir_finalized) {
+               ir3_nir_post_finalize(shader->compiler, shader->nir);
+
+               if (ir3_shader_debug & IR3_DBG_DISASM) {
+                       printf("dump nir%d: type=%d", shader->id, shader->type);
+                       nir_print_shader(shader->nir, stdout);
+               }
+
+               shader->nir_finalized = true;
+       }
+
        if (!compile_variant(v))
                goto fail;
 
        if (needs_binning_variant(v) && !compile_variant(v->binning))
                goto fail;
 
+       ir3_disk_cache_store(shader->compiler, v);
+
        return v;
 
 fail:
@@ -324,6 +342,8 @@ ir3_setup_used_key(struct ir3_shader *shader)
 
        key->safe_constlen = true;
 
+       key->ucp_enables = 0xff;
+
        if (info->stage == MESA_SHADER_FRAGMENT) {
                key->fsaturate_s = ~0;
                key->fsaturate_t = ~0;
@@ -336,6 +356,10 @@ ir3_setup_used_key(struct ir3_shader *shader)
                        key->color_two_side = true;
                }
 
+               if (info->inputs_read & VARYING_BIT_LAYER) {
+                       key->layer_zero = true;
+               }
+
                if ((info->outputs_written & ~(FRAG_RESULT_DEPTH |
                                                                FRAG_RESULT_STENCIL |
                                                                FRAG_RESULT_SAMPLE_MASK)) != 0) {
@@ -378,7 +402,7 @@ trim_constlens(unsigned *constlens,
       cur_total += constlens[i];
    }
 
-   unsigned max_stage;
+   unsigned max_stage = 0;
    unsigned max_const = 0;
    uint32_t trimmed = 0;
 
@@ -445,15 +469,9 @@ ir3_shader_from_nir(struct ir3_compiler *compiler, nir_shader *nir,
        if (stream_output)
                memcpy(&shader->stream_output, stream_output, sizeof(shader->stream_output));
        shader->num_reserved_user_consts = reserved_user_consts;
-
-       ir3_nir_post_finalize(compiler, nir);
-
        shader->nir = nir;
 
-       if (ir3_shader_debug & IR3_DBG_DISASM) {
-               printf("dump nir%d: type=%d", shader->id, shader->type);
-               nir_print_shader(shader->nir, stdout);
-       }
+       ir3_disk_cache_init_shader_key(compiler, shader);
 
        ir3_setup_used_key(shader);