r600g: fixup PS_PARTIAL_FLUSH flag handling for cayman
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 22 Feb 2013 23:42:33 +0000 (18:42 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 22 Feb 2013 23:43:27 +0000 (18:43 -0500)
So we don't emit it twice if we ever use the flag on
cayman.

Note: this is a candidate for the 9.1 branch.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
src/gallium/drivers/r600/r600_hw_context.c

index 09dc98b..7309fc7 100644 (file)
@@ -624,11 +624,6 @@ void r600_flush_emit(struct r600_context *rctx)
                return;
        }
 
-       if (rctx->flags & R600_CONTEXT_PS_PARTIAL_FLUSH) {
-               cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0);
-               cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_PS_PARTIAL_FLUSH) | EVENT_INDEX(4);
-       }
-
        if (rctx->flags & R600_CONTEXT_WAIT_3D_IDLE) {
                wait_until |= S_008040_WAIT_3D_IDLE(1);
        }
@@ -640,11 +635,15 @@ void r600_flush_emit(struct r600_context *rctx)
                /* Use of WAIT_UNTIL is deprecated on Cayman+ */
                if (rctx->family >= CHIP_CAYMAN) {
                        /* emit a PS partial flush on Cayman/TN */
-                       cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0);
-                       cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_PS_PARTIAL_FLUSH) | EVENT_INDEX(4);
+                       rctx->flags |= R600_CONTEXT_PS_PARTIAL_FLUSH;
                }
        }
 
+       if (rctx->flags & R600_CONTEXT_PS_PARTIAL_FLUSH) {
+               cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0);
+               cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_PS_PARTIAL_FLUSH) | EVENT_INDEX(4);
+       }
+
        if (rctx->chip_class >= R700 &&
            (rctx->flags & R600_CONTEXT_FLUSH_AND_INV_CB_META)) {
                cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0);