radeonsi: write all MRTs only if there is exactly one output
authorMarek Olšák <marek.olsak@amd.com>
Wed, 23 Dec 2015 15:24:02 +0000 (16:24 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 7 Jan 2016 17:26:06 +0000 (18:26 +0100)
This doesn't fix a known bug, but better safe than sorry.

Also, simplify the expression in si_shader.c.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_state_shaders.c

index b7c44b9d9aa05cbaedbd8ad7f8db193261c06a4c..f322c4e3f5a04bdeb694c2eba1fab4804f82288b 100644 (file)
@@ -2189,9 +2189,8 @@ static void si_llvm_emit_fs_epilogue(struct lp_build_tgsi_context * bld_base)
                        /* This instruction will be emitted at the end of the shader. */
                        memcpy(last_args, args, sizeof(args));
 
-                       /* Handle FS_COLOR0_WRITES_ALL_CBUFS. */
-                       if (shader->selector->info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS] &&
-                           semantic_index == 0 &&
+                       /* If last_cbuf > 0, FS_COLOR0_WRITES_ALL_CBUFS is true. */
+                       if (semantic_index == 0 &&
                            si_shader_ctx->shader->key.ps.last_cbuf > 0) {
                                for (int c = 1; c <= si_shader_ctx->shader->key.ps.last_cbuf; c++) {
                                        si_llvm_init_export_args_load(bld_base,
index 61db8ef714c3f88bc8936ae5ec8677219922c91d..4b007ec887823af45d9c101200eeadd1712f08aa 100644 (file)
@@ -552,8 +552,10 @@ static inline void si_shader_selector_key(struct pipe_context *ctx,
        case PIPE_SHADER_FRAGMENT: {
                struct si_state_rasterizer *rs = sctx->queued.named.rasterizer;
 
-               if (sel->info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS])
+               if (sel->info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS] &&
+                   sel->info.colors_written == 0x1)
                        key->ps.last_cbuf = MAX2(sctx->framebuffer.state.nr_cbufs, 1) - 1;
+
                key->ps.export_16bpc = sctx->framebuffer.export_16bpc;
 
                if (rs) {