diff options
Diffstat (limited to 'src/freedreno/ir3/ir3_shader.c')
-rw-r--r-- | src/freedreno/ir3/ir3_shader.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/freedreno/ir3/ir3_shader.c b/src/freedreno/ir3/ir3_shader.c index 676c90e0780..e8e95fce3ae 100644 --- a/src/freedreno/ir3/ir3_shader.c +++ b/src/freedreno/ir3/ir3_shader.c @@ -289,6 +289,62 @@ ir3_shader_destroy(struct ir3_shader *shader) free(shader); } +/** + * Creates a bitmask of the used bits of the shader key by this particular + * shader. Used by the gallium driver to skip state-dependent recompiles when + * possible. + */ +static void +ir3_setup_used_key(struct ir3_shader *shader) +{ + nir_shader *nir = shader->nir; + struct shader_info *info = &nir->info; + struct ir3_shader_key *key = &shader->key_mask; + + /* This key flag is just used to make for a cheaper ir3_shader_key_equal + * check in the common case. + */ + key->has_per_samp = true; + + if (info->stage == MESA_SHADER_FRAGMENT) { + key->fsaturate_s = ~0; + key->fsaturate_t = ~0; + key->fsaturate_r = ~0; + key->fastc_srgb = ~0; + key->fsamples = ~0; + + if (info->inputs_read & VARYING_BITS_COLOR) { + key->rasterflat = true; + key->color_two_side = true; + } + + if ((info->outputs_written & ~(FRAG_RESULT_DEPTH | + FRAG_RESULT_STENCIL | + FRAG_RESULT_SAMPLE_MASK)) != 0) { + key->fclamp_color = true; + } + + /* Only used for deciding on behavior of + * nir_intrinsic_load_barycentric_sample + */ + key->msaa = info->fs.uses_sample_qualifier; + } else { + key->tessellation = ~0; + key->has_gs = true; + + if (info->outputs_written & VARYING_BITS_COLOR) + key->vclamp_color = true; + + if (info->stage == MESA_SHADER_VERTEX) { + key->vsaturate_s = ~0; + key->vsaturate_t = ~0; + key->vsaturate_r = ~0; + key->vastc_srgb = ~0; + key->vsamples = ~0; + } + } +} + struct ir3_shader * ir3_shader_from_nir(struct ir3_compiler *compiler, nir_shader *nir, struct ir3_stream_output_info *stream_output) @@ -336,6 +392,8 @@ ir3_shader_from_nir(struct ir3_compiler *compiler, nir_shader *nir, nir_print_shader(shader->nir, stdout); } + ir3_setup_used_key(shader); + return shader; } |