From: Marek Olšák Date: Wed, 4 Dec 2013 11:40:28 +0000 (+0100) Subject: radeonsi: use the colorbuffer count from the shader key X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cd86f773a7ca13fa1d74e6287cc8ad0e0bd4c153;p=mesa.git radeonsi: use the colorbuffer count from the shader key As a result, the initialization of write_all must be done before the compilation. Reviewed-by: Michel Dänzer --- diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c index 88825bbef3f..c739a1987e2 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c @@ -1188,13 +1188,13 @@ handle_semantic: /* Specify whether the EXEC mask represents the valid mask */ last_args[1] = uint->one; - if (shader->fs_write_all && shader->nr_cbufs > 1) { + if (shader->fs_write_all && si_shader_ctx->shader->key.ps.nr_cbufs > 1) { int i; /* Specify that this is not yet the last export */ last_args[2] = lp_build_const_int32(base->gallivm, 0); - for (i = 1; i < shader->nr_cbufs; i++) { + for (i = 1; i < si_shader_ctx->shader->key.ps.nr_cbufs; i++) { /* Specify the target we are exporting */ last_args[3] = lp_build_const_int32(base->gallivm, V_008DFC_SQ_EXP_MRT + i); @@ -2030,8 +2030,6 @@ int si_pipe_shader_create( preload_samplers(&si_shader_ctx); preload_streamout_buffers(&si_shader_ctx); - shader->shader.nr_cbufs = rctx->framebuffer.nr_cbufs; - /* Dump TGSI code before doing TGSI->LLVM conversion in case the * conversion fails. */ if (dump) { diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.h b/src/gallium/drivers/radeonsi/radeonsi_shader.h index 174035d870e..5e5a27f8580 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.h +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.h @@ -115,7 +115,6 @@ struct si_shader { bool vs_out_point_size; bool vs_out_edgeflag; bool vs_out_layer; - unsigned nr_cbufs; unsigned nr_pos_exports; unsigned clip_dist_write; }; diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 52c9d53ebb0..165475c6fd5 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -33,6 +33,7 @@ #include "util/u_upload_mgr.h" #include "util/u_format_s3tc.h" #include "tgsi/tgsi_parse.h" +#include "tgsi/tgsi_scan.h" #include "radeonsi_pipe.h" #include "radeonsi_shader.h" #include "si_state.h" @@ -2278,17 +2279,6 @@ int si_shader_select(struct pipe_context *ctx, FREE(shader); return r; } - - /* We don't know the value of fs_write_all property until we built - * at least one variant, so we may need to recompute the key (include - * rctx->framebuffer.nr_cbufs) after building first variant. */ - if (sel->type == PIPE_SHADER_FRAGMENT && - sel->num_shaders == 0 && - shader->shader.fs_write_all) { - sel->fs_write_all = 1; - si_shader_selector_key(ctx, sel, &shader->key); - } - sel->num_shaders++; } @@ -2307,10 +2297,14 @@ static void *si_create_shader_state(struct pipe_context *ctx, { struct si_pipe_shader_selector *sel = CALLOC_STRUCT(si_pipe_shader_selector); int r; + struct tgsi_shader_info info; + + tgsi_scan_shader(state->tokens, &info); sel->type = pipe_shader_type; sel->tokens = tgsi_dup_tokens(state->tokens); sel->so = state->stream_output; + sel->fs_write_all = info.color0_writes_all_cbufs; r = si_shader_select(ctx, sel, NULL); if (r) {