[Mesa-dev] [PATCH] radeonsi: fix shader precompilation for shader-db
Nicolai Hähnle
nhaehnle at gmail.com
Mon Jan 25 07:43:25 PST 2016
On 23.01.2016 11:04, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> The addition of spi_shader_col_format killed all color outputs
> in precompiled shaders.
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
> ---
> src/gallium/drivers/radeonsi/si_state_shaders.c | 43 +++++++++++++++++++------
> 1 file changed, 34 insertions(+), 9 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
> index 4eb962a..bca31dc 100644
> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c
> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
> @@ -683,23 +683,21 @@ static inline void si_shader_selector_key(struct pipe_context *ctx,
> }
>
> /* Select the hw shader variant depending on the current state. */
> -static int si_shader_select(struct pipe_context *ctx,
> - struct si_shader_ctx_state *state)
> +static int si_shader_select_with_key(struct pipe_context *ctx,
> + struct si_shader_ctx_state *state,
> + union si_shader_key *key)
> {
> struct si_context *sctx = (struct si_context *)ctx;
> struct si_shader_selector *sel = state->cso;
> struct si_shader *current = state->current;
> - union si_shader_key key;
> struct si_shader *iter, *shader = NULL;
> int r;
>
> - si_shader_selector_key(ctx, sel, &key);
> -
> /* Check if we don't need to change anything.
> * This path is also used for most shaders that don't need multiple
> * variants, it will cost just a computation of the key and this
> * test. */
> - if (likely(current && memcmp(¤t->key, &key, sizeof(key)) == 0))
> + if (likely(current && memcmp(¤t->key, key, sizeof(*key)) == 0))
> return 0;
>
> pipe_mutex_lock(sel->mutex);
> @@ -708,7 +706,7 @@ static int si_shader_select(struct pipe_context *ctx,
> for (iter = sel->first_variant; iter; iter = iter->next_variant) {
> /* Don't check the "current" shader. We checked it above. */
> if (current != iter &&
> - memcmp(&iter->key, &key, sizeof(key)) == 0) {
> + memcmp(&iter->key, key, sizeof(*key)) == 0) {
> state->current = iter;
> pipe_mutex_unlock(sel->mutex);
> return 0;
> @@ -722,7 +720,7 @@ static int si_shader_select(struct pipe_context *ctx,
> return -ENOMEM;
> }
> shader->selector = sel;
> - shader->key = key;
> + shader->key = *key;
>
> r = si_shader_create(sctx->screen, sctx->tm, shader, &sctx->b.debug);
> if (unlikely(r)) {
> @@ -746,6 +744,15 @@ static int si_shader_select(struct pipe_context *ctx,
> return 0;
> }
>
> +static int si_shader_select(struct pipe_context *ctx,
> + struct si_shader_ctx_state *state)
> +{
> + union si_shader_key key;
> +
> + si_shader_selector_key(ctx, state->cso, &key);
> + return si_shader_select_with_key(ctx, state, &key);
> +}
> +
> static void *si_create_shader_selector(struct pipe_context *ctx,
> const struct pipe_shader_state *state)
> {
> @@ -866,8 +873,26 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
> /* Pre-compilation. */
> if (sscreen->b.debug_flags & DBG_PRECOMPILE) {
> struct si_shader_ctx_state state = {sel};
> + union si_shader_key key;
> +
> + memset(&key, 0, sizeof(key));
> +
> + /* Set reasonable defaults, so that the shader key doesn't
> + * cause any code to be eliminated.
> + */
> + switch (sel->type) {
> + case PIPE_SHADER_TESS_CTRL:
> + key.tcs.prim_mode = PIPE_PRIM_TRIANGLES;
> + break;
> + case PIPE_SHADER_FRAGMENT:
> + for (i = 0; i < 8; i++)
> + if (sel->info.colors_written & (1 << i))
> + key.ps.spi_shader_col_format |=
> + V_028710_SPI_SHADER_FP16_ABGR << (i * 4);
> + break;
> + }
>
> - if (si_shader_select(ctx, &state)) {
> + if (si_shader_select_with_key(ctx, &state, &key)) {
> fprintf(stderr, "radeonsi: can't create a shader\n");
> tgsi_free_tokens(sel->tokens);
> FREE(sel);
>
More information about the mesa-dev
mailing list