r600g: avoid copying unnecessary pieces of a block.
authorDave Airlie <airlied@redhat.com>
Thu, 2 Jun 2011 04:29:37 +0000 (14:29 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 2 Jun 2011 04:29:37 +0000 (14:29 +1000)
This just avoids copying stuff if its going to modify the number of dwords
later anyways.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/winsys/r600/drm/r600_hw_context.c

index ffcc15b52178b640993dacb7b8e2ca195c2274bb..f8536fd7081939118008620abcf93d5aa3364661 100644 (file)
@@ -1180,11 +1180,16 @@ struct r600_bo *r600_context_reg_bo(struct r600_context *ctx, unsigned offset)
 void r600_context_block_emit_dirty(struct r600_context *ctx, struct r600_block *block)
 {
        int id;
+       int optional = block->nbo == 0 && !(block->flags & REG_FLAG_DIRTY_ALWAYS);
+       int cp_dwords = block->pm4_ndwords, start_dword;
+       int new_dwords;
 
-       if (block->nreg_dirty == 0 && block->nbo == 0 && !(block->flags & REG_FLAG_DIRTY_ALWAYS)) {
+       if (block->nreg_dirty == 0 && optional) {
                goto out;
        }
 
+       optional &= (block->nreg_dirty != block->nreg);
+
        ctx->flags |= R600_CONTEXT_CHECK_EVENT_FLUSH;
        for (int j = 0; j < block->nreg; j++) {
                if (block->pm4_bo_index[j]) {
@@ -1200,18 +1205,22 @@ void r600_context_block_emit_dirty(struct r600_context *ctx, struct r600_block *
                }
        }
        ctx->flags &= ~R600_CONTEXT_CHECK_EVENT_FLUSH;
-       memcpy(&ctx->pm4[ctx->pm4_cdwords], block->pm4, block->pm4_ndwords * 4);
-       ctx->pm4_cdwords += block->pm4_ndwords;
-
-       if (block->nreg_dirty != block->nreg && block->nbo == 0 && !(block->flags & REG_FLAG_DIRTY_ALWAYS)) {
-               int new_dwords = block->nreg_dirty;
-               uint32_t oldword, newword;
-               ctx->pm4_cdwords -= block->pm4_ndwords;
-               newword = oldword = ctx->pm4[ctx->pm4_cdwords];
+
+       if (optional) {
+               new_dwords = block->nreg_dirty;
+               start_dword = ctx->pm4_cdwords;
+               cp_dwords = new_dwords + 2;
+       }
+       memcpy(&ctx->pm4[ctx->pm4_cdwords], block->pm4, cp_dwords * 4);
+       ctx->pm4_cdwords += cp_dwords;
+
+       if (optional) {
+               uint32_t newword;
+
+               newword = ctx->pm4[start_dword];
                newword &= PKT_COUNT_C;
                newword |= PKT_COUNT_S(new_dwords);
-               ctx->pm4[ctx->pm4_cdwords] = newword;
-               ctx->pm4_cdwords += new_dwords + 2;
+               ctx->pm4[start_dword] = newword;
        }
 out:
        block->status ^= R600_BLOCK_STATUS_DIRTY;