[Mesa-dev] [PATCH] r600g, radeonsi: Consolidate logic for short-circuiting flushes
Marek Olšák
maraeo at gmail.com
Tue Feb 18 01:06:02 PST 2014
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Tue, Feb 18, 2014 at 3:11 AM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Daenzer <michel.daenzer at amd.com>
>
> Fixes radeonsi emitting command streams to the kernel even when there
> have been no draw calls before a flush, potentially powering up the GPU
> needlessly.
>
> Incidentally, this also cuts the runtime of piglit gpu.py in about half
> on my Kaveri system, probably because an X11 client going away no longer
> always results in a command stream being submitted to the kernel via
> glamor.
>
> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=65761
> Cc: "10.1" mesa-stable at lists.freedesktop.org
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
> src/gallium/drivers/r600/r600_hw_context.c | 2 +-
> src/gallium/drivers/r600/r600_pipe.c | 4 ++--
> src/gallium/drivers/r600/r600_pipe.h | 1 -
> src/gallium/drivers/radeon/r600_buffer_common.c | 2 +-
> src/gallium/drivers/radeon/r600_pipe_common.h | 1 +
> src/gallium/drivers/radeonsi/si_hw_context.c | 6 +++---
> 6 files changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/r600_hw_context.c b/src/gallium/drivers/r600/r600_hw_context.c
> index dc3c221..ef077b2 100644
> --- a/src/gallium/drivers/r600/r600_hw_context.c
> +++ b/src/gallium/drivers/r600/r600_hw_context.c
> @@ -355,7 +355,7 @@ void r600_begin_new_cs(struct r600_context *ctx)
> ctx->last_primitive_type = -1;
> ctx->last_start_instance = -1;
>
> - ctx->initial_gfx_cs_size = ctx->b.rings.gfx.cs->cdw;
> + ctx->b.initial_gfx_cs_size = ctx->b.rings.gfx.cs->cdw;
> }
>
> /* The max number of bytes to copy per packet. */
> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
> index 8ea192a..0f75a53 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -74,7 +74,7 @@ static void r600_flush(struct pipe_context *ctx, unsigned flags)
> unsigned render_cond_mode = 0;
> boolean render_cond_cond = FALSE;
>
> - if (rctx->b.rings.gfx.cs->cdw == rctx->initial_gfx_cs_size)
> + if (rctx->b.rings.gfx.cs->cdw == rctx->b.initial_gfx_cs_size)
> return;
>
> rctx->b.rings.gfx.flushing = true;
> @@ -95,7 +95,7 @@ static void r600_flush(struct pipe_context *ctx, unsigned flags)
> ctx->render_condition(ctx, render_cond, render_cond_cond, render_cond_mode);
> }
>
> - rctx->initial_gfx_cs_size = rctx->b.rings.gfx.cs->cdw;
> + rctx->b.initial_gfx_cs_size = rctx->b.rings.gfx.cs->cdw;
> }
>
> static void r600_flush_from_st(struct pipe_context *ctx,
> diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
> index 15052da..83b0e4f 100644
> --- a/src/gallium/drivers/r600/r600_pipe.h
> +++ b/src/gallium/drivers/r600/r600_pipe.h
> @@ -377,7 +377,6 @@ struct r600_context {
> struct r600_screen *screen;
> struct blitter_context *blitter;
> struct u_suballocator *allocator_fetch_shader;
> - unsigned initial_gfx_cs_size;
>
> /* Hardware info. */
> boolean has_vertex_cache;
> diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c b/src/gallium/drivers/radeon/r600_buffer_common.c
> index 068141c..e75b337 100644
> --- a/src/gallium/drivers/radeon/r600_buffer_common.c
> +++ b/src/gallium/drivers/radeon/r600_buffer_common.c
> @@ -60,7 +60,7 @@ void *r600_buffer_map_sync_with_rings(struct r600_common_context *ctx,
> rusage = RADEON_USAGE_WRITE;
> }
>
> - if (ctx->rings.gfx.cs->cdw &&
> + if (ctx->rings.gfx.cs->cdw != ctx->initial_gfx_cs_size &&
> ctx->ws->cs_is_buffer_referenced(ctx->rings.gfx.cs,
> resource->cs_buf, rusage)) {
> if (usage & PIPE_TRANSFER_DONTBLOCK) {
> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h
> index 2fbc6a3..d604f65 100644
> --- a/src/gallium/drivers/radeon/r600_pipe_common.h
> +++ b/src/gallium/drivers/radeon/r600_pipe_common.h
> @@ -241,6 +241,7 @@ struct r600_common_context {
> enum radeon_family family;
> enum chip_class chip_class;
> struct r600_rings rings;
> + unsigned initial_gfx_cs_size;
>
> struct u_upload_mgr *uploader;
> struct u_suballocator *allocator_so_filled_size;
> diff --git a/src/gallium/drivers/radeonsi/si_hw_context.c b/src/gallium/drivers/radeonsi/si_hw_context.c
> index 7e40255..639659c 100644
> --- a/src/gallium/drivers/radeonsi/si_hw_context.c
> +++ b/src/gallium/drivers/radeonsi/si_hw_context.c
> @@ -79,9 +79,7 @@ void si_need_cs_space(struct si_context *ctx, unsigned num_dw,
>
> void si_context_flush(struct si_context *ctx, unsigned flags)
> {
> - struct radeon_winsys_cs *cs = ctx->b.rings.gfx.cs;
> -
> - if (!cs->cdw)
> + if (ctx->b.rings.gfx.cs->cdw == ctx->b.initial_gfx_cs_size)
> return;
>
> /* suspend queries */
> @@ -177,6 +175,8 @@ void si_begin_new_cs(struct si_context *ctx)
> }
>
> si_all_descriptors_begin_new_cs(ctx);
> +
> + ctx->b.initial_gfx_cs_size = ctx->b.rings.gfx.cs->cdw;
> }
>
> #if SI_TRACE_CS
> --
> 1.9.0.rc3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list