radeonsi: disable SPI color outputs the shader doesn't write
authorMarek Olšák <marek.olsak@amd.com>
Fri, 15 Jan 2016 20:58:53 +0000 (21:58 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 22 Jan 2016 14:02:40 +0000 (15:02 +0100)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_shader.h
src/gallium/drivers/radeonsi/si_state_shaders.c

index f49290afadfc7f78a6ca3749eedf4f2fd9342f55..50375e28ea4b96de0162bb32c50f757c39107962 100644 (file)
@@ -213,6 +213,10 @@ struct si_shader_selector {
 
        /* PS parameters. */
        unsigned        db_shader_control;
+       /* Set 0xf or 0x0 (4 bits) per each written output.
+        * ANDed with spi_shader_col_format.
+        */
+       unsigned        colors_written_4bit;
 
        /* masks of "get_unique_index" bits */
        uint64_t        outputs_written;
index 59aee54c3b16bd0f8ca4a2dadcb4e6430eb5791b..79f2335b9b52ec3643f82eff722531f782d48e43 100644 (file)
@@ -647,6 +647,12 @@ static inline void si_shader_selector_key(struct pipe_context *ctx,
                if (sctx->b.chip_class <= CIK && sctx->b.family != CHIP_HAWAII)
                        key->ps.color_is_int8 = sctx->framebuffer.color_is_int8;
 
+               /* Disable unwritten outputs (if WRITE_ALL_CBUFS isn't enabled). */
+               if (!key->ps.last_cbuf) {
+                       key->ps.spi_shader_col_format &= sel->colors_written_4bit;
+                       key->ps.color_is_int8 &= sel->info.colors_written;
+               }
+
                if (rs) {
                        bool is_poly = (sctx->current_rast_prim >= PIPE_PRIM_TRIANGLES &&
                                        sctx->current_rast_prim <= PIPE_PRIM_POLYGON) ||
@@ -831,6 +837,12 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
                }
                sel->esgs_itemsize = util_last_bit64(sel->outputs_written) * 16;
                break;
+
+       case PIPE_SHADER_FRAGMENT:
+               for (i = 0; i < 8; i++)
+                       if (sel->info.colors_written & (1 << i))
+                               sel->colors_written_4bit |= 0xf << (4 * i);
+               break;
        }
 
        /* DB_SHADER_CONTROL */