r600g: fix RSQ of negative value on Cayman
[mesa.git] / src / gallium / drivers / r600 / r600_hw_context.c
index a4c88504758ad9778c8ec6d380e3f92294f9dc12..5b93d05573da95c876334b38c85572292deb226b 100644 (file)
@@ -684,6 +684,12 @@ void r600_flush_emit(struct r600_context *rctx)
                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);
+               cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_FLUSH_AND_INV_CB_META) | EVENT_INDEX(0);
+       }
+
        if (rctx->flags & R600_CONTEXT_FLUSH_AND_INV) {
                cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0);
                cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_CACHE_FLUSH_AND_INV_EVENT) | EVENT_INDEX(0);
@@ -965,9 +971,7 @@ static void r600_flush_vgt_streamout(struct r600_context *ctx)
 {
        struct radeon_winsys_cs *cs = ctx->cs;
 
-       cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONFIG_REG, 1, 0);
-       cs->buf[cs->cdw++] = (R_008490_CP_STRMOUT_CNTL - R600_CONFIG_REG_OFFSET) >> 2;
-       cs->buf[cs->cdw++] = 0;
+       r600_write_config_reg(cs, R_008490_CP_STRMOUT_CNTL, 0);
 
        cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0);
        cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_SO_VGTSTREAMOUT_FLUSH) | EVENT_INDEX(0);
@@ -986,17 +990,10 @@ static void r600_set_streamout_enable(struct r600_context *ctx, unsigned buffer_
        struct radeon_winsys_cs *cs = ctx->cs;
 
        if (buffer_enable_bit) {
-               cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONTEXT_REG, 1, 0);
-               cs->buf[cs->cdw++] = (R_028AB0_VGT_STRMOUT_EN - R600_CONTEXT_REG_OFFSET) >> 2;
-               cs->buf[cs->cdw++] = S_028AB0_STREAMOUT(1);
-
-               cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONTEXT_REG, 1, 0);
-               cs->buf[cs->cdw++] = (R_028B20_VGT_STRMOUT_BUFFER_EN - R600_CONTEXT_REG_OFFSET) >> 2;
-               cs->buf[cs->cdw++] = buffer_enable_bit;
+               r600_write_context_reg(cs, R_028AB0_VGT_STRMOUT_EN, S_028AB0_STREAMOUT(1));
+               r600_write_context_reg(cs, R_028B20_VGT_STRMOUT_BUFFER_EN, buffer_enable_bit);
        } else {
-               cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONTEXT_REG, 1, 0);
-               cs->buf[cs->cdw++] = (R_028AB0_VGT_STRMOUT_EN - R600_CONTEXT_REG_OFFSET) >> 2;
-               cs->buf[cs->cdw++] = S_028AB0_STREAMOUT(0);
+               r600_write_context_reg(cs, R_028AB0_VGT_STRMOUT_EN, S_028AB0_STREAMOUT(0));
        }
 }
 
@@ -1045,13 +1042,11 @@ void r600_context_streamout_begin(struct r600_context *ctx)
 
                        update_flags |= SURFACE_BASE_UPDATE_STRMOUT(i);
 
-                       cs->buf[cs->cdw++] = PKT3(PKT3_SET_CONTEXT_REG, 3, 0);
-                       cs->buf[cs->cdw++] = (R_028AD0_VGT_STRMOUT_BUFFER_SIZE_0 +
-                                                       16*i - R600_CONTEXT_REG_OFFSET) >> 2;
-                       cs->buf[cs->cdw++] = (t[i]->b.buffer_offset +
-                                                       t[i]->b.buffer_size) >> 2; /* BUFFER_SIZE (in DW) */
-                       cs->buf[cs->cdw++] = stride_in_dw[i];              /* VTX_STRIDE (in DW) */
-                       cs->buf[cs->cdw++] = va >> 8;                      /* BUFFER_BASE */
+                       r600_write_context_reg_seq(cs, R_028AD0_VGT_STRMOUT_BUFFER_SIZE_0 + 16*i, 3);
+                       r600_write_value(cs, (t[i]->b.buffer_offset +
+                                             t[i]->b.buffer_size) >> 2); /* BUFFER_SIZE (in DW) */
+                       r600_write_value(cs, stride_in_dw[i]);            /* VTX_STRIDE (in DW) */
+                       r600_write_value(cs, va >> 8);                    /* BUFFER_BASE */
 
                        cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0);
                        cs->buf[cs->cdw++] =