r600g: only emit NOP relocations for queries if VM is disabled
authorMarek Olšák <marek.olsak@amd.com>
Tue, 21 Jan 2014 22:31:51 +0000 (23:31 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 28 Jan 2014 00:38:59 +0000 (01:38 +0100)
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
src/gallium/drivers/radeon/r600_cs.h
src/gallium/drivers/radeon/r600_query.c
src/gallium/drivers/radeon/r600_streamout.c

index fa749dad6c98e3147a9bcb33c4e29802071c31b1..c3af3decfcc8dc391ebdfac7b33078d46b7dcc40 100644 (file)
@@ -66,6 +66,20 @@ static INLINE unsigned r600_context_bo_reloc(struct r600_common_context *rctx,
        return rctx->ws->cs_add_reloc(ring->cs, rbo->cs_buf, usage, rbo->domains) * 4;
 }
 
+static INLINE void r600_emit_reloc(struct r600_common_context *rctx,
+                                  struct r600_ring *ring, struct r600_resource *rbo,
+                                  enum radeon_bo_usage usage)
+{
+       struct radeon_winsys_cs *cs = ring->cs;
+       bool has_vm = ((struct r600_common_screen*)rctx->b.screen)->info.r600_virtual_address;
+       unsigned reloc = r600_context_bo_reloc(rctx, ring, rbo, usage);
+
+       if (!has_vm) {
+               radeon_emit(cs, PKT3(PKT3_NOP, 0, 0));
+               radeon_emit(cs, reloc);
+       }
+}
+
 static INLINE void r600_write_config_reg_seq(struct radeon_winsys_cs *cs, unsigned reg, unsigned num)
 {
        assert(reg < R600_CONTEXT_REG_OFFSET);
index ea9ad11e37f2d1c1adc8d631d8dce0c0b3633f14..14e8427ea30bad5a5f7f72a1b22cda53331fe5e9 100644 (file)
@@ -206,8 +206,7 @@ static void r600_emit_query_begin(struct r600_common_context *ctx, struct r600_q
        default:
                assert(0);
        }
-       cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0);
-       cs->buf[cs->cdw++] = r600_context_bo_reloc(ctx, &ctx->rings.gfx, query->buffer.buf, RADEON_USAGE_WRITE);
+       r600_emit_reloc(ctx, &ctx->rings.gfx, query->buffer.buf, RADEON_USAGE_WRITE);
 
        if (!r600_is_timer_query(query->type)) {
                ctx->num_cs_dw_nontimer_queries_suspend += query->num_cs_dw;
@@ -272,8 +271,7 @@ static void r600_emit_query_end(struct r600_common_context *ctx, struct r600_que
        default:
                assert(0);
        }
-       cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0);
-       cs->buf[cs->cdw++] = r600_context_bo_reloc(ctx, &ctx->rings.gfx, query->buffer.buf, RADEON_USAGE_WRITE);
+       r600_emit_reloc(ctx, &ctx->rings.gfx, query->buffer.buf, RADEON_USAGE_WRITE);
 
        query->buffer.results_end += query->result_size;
 
@@ -322,8 +320,7 @@ static void r600_emit_query_predication(struct r600_common_context *ctx, struct
                                cs->buf[cs->cdw++] = PKT3(PKT3_SET_PREDICATION, 1, 0);
                                cs->buf[cs->cdw++] = (va + results_base) & 0xFFFFFFFFUL;
                                cs->buf[cs->cdw++] = op | (((va + results_base) >> 32UL) & 0xFF);
-                               cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0);
-                               cs->buf[cs->cdw++] = r600_context_bo_reloc(ctx, &ctx->rings.gfx, qbuf->buf, RADEON_USAGE_READ);
+                               r600_emit_reloc(ctx, &ctx->rings.gfx, qbuf->buf, RADEON_USAGE_READ);
                                results_base += query->result_size;
 
                                /* set CONTINUE bit for all packets except the first */
@@ -818,10 +815,9 @@ void r600_query_init_backend_mask(struct r600_common_context *ctx)
                cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 2, 0);
                cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_ZPASS_DONE) | EVENT_INDEX(1);
                cs->buf[cs->cdw++] = va;
-               cs->buf[cs->cdw++] = (va >> 32UL) & 0xFF;
+               cs->buf[cs->cdw++] = va >> 32;
 
-               cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0);
-               cs->buf[cs->cdw++] = r600_context_bo_reloc(ctx, &ctx->rings.gfx, buffer, RADEON_USAGE_WRITE);
+               r600_emit_reloc(ctx, &ctx->rings.gfx, buffer, RADEON_USAGE_WRITE);
 
                /* analyze results */
                results = r600_buffer_map_sync_with_rings(ctx, buffer, PIPE_TRANSFER_READ);
index 0f65de4a805bc9b48c865772d70afff2b963ffca..adc11e005d7dcd8abf0bd7ae05c072774df73af6 100644 (file)
@@ -199,20 +199,6 @@ static void evergreen_set_streamout_enable(struct r600_common_context *rctx, uns
        }
 }
 
-static void r600_emit_reloc(struct r600_common_context *rctx,
-                           struct r600_ring *ring, struct r600_resource *rbo,
-                           enum radeon_bo_usage usage)
-{
-       struct radeon_winsys_cs *cs = ring->cs;
-       bool has_vm = ((struct r600_common_screen*)rctx->b.screen)->info.r600_virtual_address;
-       unsigned reloc = r600_context_bo_reloc(rctx, ring, rbo, usage);
-
-       if (!has_vm) {
-               radeon_emit(cs, PKT3(PKT3_NOP, 0, 0));
-               radeon_emit(cs, reloc);
-       }
-}
-
 static void r600_emit_streamout_begin(struct r600_common_context *rctx, struct r600_atom *atom)
 {
        struct radeon_winsys_cs *cs = rctx->rings.gfx.cs;