[Mesa-dev] [PATCH 4/4] r600g: only emit gfx cmd when there is actual work in it
j.glisse at gmail.com
j.glisse at gmail.com
Fri Jan 25 09:50:50 PST 2013
From: Jerome Glisse <jglisse at redhat.com>
Signed-off-by: Jerome Glisse <jglisse at redhat.com>
---
src/gallium/drivers/r600/evergreen_compute.c | 2 ++
src/gallium/drivers/r600/r600_hw_context.c | 1 +
src/gallium/drivers/r600/r600_pipe.c | 6 ++++++
src/gallium/drivers/r600/r600_pipe.h | 1 +
src/gallium/drivers/r600/r600_query.c | 2 ++
src/gallium/drivers/r600/r600_state_common.c | 1 +
6 files changed, 13 insertions(+)
diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c
index f4a7905..977595e 100644
--- a/src/gallium/drivers/r600/evergreen_compute.c
+++ b/src/gallium/drivers/r600/evergreen_compute.c
@@ -308,6 +308,8 @@ static void evergreen_emit_direct_dispatch(
r600_write_value(cs, grid_layout[2]);
/* VGT_DISPATCH_INITIATOR = COMPUTE_SHADER_EN */
r600_write_value(cs, 1);
+
+ rctx->rings.gfx.cdraw++;
}
static void compute_emit_cs(struct r600_context *ctx, const uint *block_layout,
diff --git a/src/gallium/drivers/r600/r600_hw_context.c b/src/gallium/drivers/r600/r600_hw_context.c
index d7518a5..511a276 100644
--- a/src/gallium/drivers/r600/r600_hw_context.c
+++ b/src/gallium/drivers/r600/r600_hw_context.c
@@ -1122,6 +1122,7 @@ void r600_cp_dma_copy_buffer(struct r600_context *rctx,
size -= byte_count;
src_offset += byte_count;
dst_offset += byte_count;
+ rctx->rings.gfx.cdraw++;
}
}
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
index 6767412..af08cff 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -120,6 +120,10 @@ static void r600_flush(struct pipe_context *ctx, unsigned flags)
struct pipe_query *render_cond = NULL;
unsigned render_cond_mode = 0;
+ if (!rctx->rings.gfx.cdraw) {
+ return;
+ }
+
rctx->rings.gfx.flushing = true;
/* Disable render condition. */
if (rctx->current_render_cond) {
@@ -130,6 +134,7 @@ static void r600_flush(struct pipe_context *ctx, unsigned flags)
r600_context_flush(rctx, flags);
rctx->rings.gfx.flushing = false;
+ rctx->rings.gfx.cdraw = 0;
r600_begin_new_cs(rctx);
/* Re-enable render condition. */
@@ -387,6 +392,7 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
goto fail;
}
+ rctx->rings.gfx.cdraw = 0;
rctx->rings.gfx.cs = rctx->ws->cs_create(rctx->ws, RING_GFX);
rctx->rings.gfx.flush = r600_flush_gfx_ring;
rctx->ws->cs_set_flush_callback(rctx->rings.gfx.cs, r600_flush_from_winsys, rctx);
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index 31dcd05..5c72756 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -418,6 +418,7 @@ struct r600_fetch_shader {
struct r600_ring {
struct radeon_winsys_cs *cs;
bool flushing;
+ unsigned cdraw;
void (*flush)(void *ctx, unsigned flags);
};
diff --git a/src/gallium/drivers/r600/r600_query.c b/src/gallium/drivers/r600/r600_query.c
index 0335189..7916f2d 100644
--- a/src/gallium/drivers/r600/r600_query.c
+++ b/src/gallium/drivers/r600/r600_query.c
@@ -149,6 +149,7 @@ static void r600_emit_query_begin(struct r600_context *ctx, struct r600_query *q
cs->buf[cs->cdw++] = (3 << 29) | ((va >> 32UL) & 0xFF);
cs->buf[cs->cdw++] = 0;
cs->buf[cs->cdw++] = 0;
+ ctx->rings.gfx.cdraw++;
break;
default:
assert(0);
@@ -201,6 +202,7 @@ static void r600_emit_query_end(struct r600_context *ctx, struct r600_query *que
cs->buf[cs->cdw++] = (3 << 29) | ((va >> 32UL) & 0xFF);
cs->buf[cs->cdw++] = 0;
cs->buf[cs->cdw++] = 0;
+ ctx->rings.gfx.cdraw++;
break;
default:
assert(0);
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index b547d64..d4616ce 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -1439,6 +1439,7 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info
r600_trace_emit(rctx);
}
#endif
+ rctx->rings.gfx.cdraw++;
/* Set the depth buffer as dirty. */
if (rctx->framebuffer.state.zsbuf) {
--
1.7.11.7
More information about the mesa-dev
mailing list