radeonsi: use the colorbuffer count from the shader key
authorMarek Olšák <marek.olsak@amd.com>
Wed, 4 Dec 2013 11:40:28 +0000 (12:40 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 12 Dec 2013 17:48:04 +0000 (18:48 +0100)
As a result, the initialization of write_all must be done before
the compilation.

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/drivers/radeonsi/radeonsi_shader.c
src/gallium/drivers/radeonsi/radeonsi_shader.h
src/gallium/drivers/radeonsi/si_state.c

index 88825bbef3f1e7a091261fe5d6695b32f2bd48aa..c739a1987e2478a6fcd8a49e098a7858d9963556 100644 (file)
@@ -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) {
index 174035d870ef8002e4630562b81f823c58df7d77..5e5a27f8580c21ad6774d49fffadcb84f7707a3f 100644 (file)
@@ -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;
 };
index 52c9d53ebb004b5932f3e652a9a435ea2fabe80f..165475c6fd5a6b9de15be9b0bb56b535d5902c16 100644 (file)
@@ -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) {