r600g: make framebuffer atom rely on dual src blend state.
authorDave Airlie <airlied@redhat.com>
Tue, 26 Jan 2016 03:35:08 +0000 (13:35 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 15 Mar 2017 04:32:44 +0000 (14:32 +1000)
In order to make ARB_shader_image_load_store, we have to share
the CB space with RATs, so we should only steal the dual src
space if we have dual src enabled.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/r600/r600_state.c
src/gallium/drivers/r600/r600_state_common.c

index c5dd9f71dd9bbb44d2984267951e98ed75b9eb77..5ffe6e8996f99d209ae0490af31de0dfb646b6eb 100644 (file)
@@ -1584,7 +1584,7 @@ static void evergreen_emit_framebuffer_state(struct r600_context *rctx, struct r
                radeon_emit(cs, reloc);
        }
        /* set CB_COLOR1_INFO for possible dual-src blending */
-       if (i == 1 && state->cbufs[0]) {
+       if (rctx->framebuffer.dual_src_blend && i == 1 && state->cbufs[0]) {
                radeon_set_context_reg(cs, R_028C70_CB_COLOR0_INFO + 1 * 0x3C,
                                       cb->cb_color_info | tex->cb_color_info);
                i++;
index cf8eba38fe223a66acbb55986e1a8cb7a297aed0..1d65cb317d8d66138c3297f812c4252086159f54 100644 (file)
@@ -187,6 +187,7 @@ struct r600_framebuffer {
        bool export_16bpc;
        bool cb0_is_integer;
        bool is_msaa_resolve;
+       bool dual_src_blend;
 };
 
 struct r600_sample_mask {
index 006bb629d60ac3b04964abc85d5107cb63099e2b..6139bd2f05ec328bf946986006e4050ceb2ae525 100644 (file)
@@ -1337,7 +1337,7 @@ static void r600_emit_framebuffer_state(struct r600_context *rctx, struct r600_a
                radeon_emit(cs, cb[i] ? cb[i]->cb_color_info : 0);
        }
        /* set CB_COLOR1_INFO for possible dual-src blending */
-       if (i == 1 && cb[0]) {
+       if (rctx->framebuffer.dual_src_blend && i == 1 && cb[0]) {
                radeon_emit(cs, cb[0]->cb_color_info);
                i++;
        }
index 5bce71c871d2b93cfa4af59e948f1865e0e4aba5..6f8279fb5e6b0905691bb49a5a4eb71854044a43 100644 (file)
@@ -187,6 +187,10 @@ static void r600_bind_blend_state_internal(struct r600_context *rctx,
        if (update_cb) {
                r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
        }
+       if (rctx->framebuffer.dual_src_blend != blend->dual_src_blend) {
+               rctx->framebuffer.dual_src_blend = blend->dual_src_blend;
+               r600_mark_atom_dirty(rctx, &rctx->framebuffer.atom);
+       }
 }
 
 static void r600_bind_blend_state(struct pipe_context *ctx, void *state)