On 25.04.2017 14:59, Constantine Kharlamov wrote:
> It finishes the work started by 0c2eed0edec, quoting:
> 
>> The main idea is to avoid setting CB_COLORi_INFO = 0 for i>0 repeatedly
>> when those colorbuffers aren't used. This is mainly for glamor.
> 
> After 0c2eed0edec the r600g was passing null as the dirty_cbufs pointer,
> and the current patch makes the actual use of the argument. In
> particular, the check for null dirty_cbufs pointer in
> evergreen_do_fast_color_clear() is removed.
> 
> I didn't change r600_state.c because evergreen_do_fast_color_clear() is
> only used for eg and higher, thus checks in there are useless.
> 
> In addition to radeonsi-like modifications I also do reset in
> r600_bind_blend_state_internal(), otherwise there're blend
> arb_blend_func_extended regressions. Besides, I keep dirty_cbufs in
> cb_misc_state, because it rather seem belonging there.
> 
> Some statistics: skips ≈70 updates of CB registers per frame in
> Kane&Lynch2.

I should've been using GTAⅣ for comparison. There it skips 700-1k updates per 
frame on average.

> 
> Signed-off-by: Constantine Kharlamov <hi-an...@yandex.ru>
> ---
>  src/gallium/drivers/r600/evergreen_state.c   | 15 +++++++++++++--
>  src/gallium/drivers/r600/r600_blit.c         |  3 ++-
>  src/gallium/drivers/r600/r600_hw_context.c   |  1 +
>  src/gallium/drivers/r600/r600_pipe.h         |  1 +
>  src/gallium/drivers/r600/r600_state_common.c |  1 +
>  src/gallium/drivers/radeon/r600_texture.c    |  3 +--
>  6 files changed, 19 insertions(+), 5 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/evergreen_state.c 
> b/src/gallium/drivers/r600/evergreen_state.c
> index 9a6bb4e4c9..916270ec4b 100644
> --- a/src/gallium/drivers/r600/evergreen_state.c
> +++ b/src/gallium/drivers/r600/evergreen_state.c
> @@ -1426,6 +1426,11 @@ static void evergreen_set_framebuffer_state(struct 
> pipe_context *ctx,
>                        R600_CONTEXT_FLUSH_AND_INV_DB_META |
>                        R600_CONTEXT_INV_TEX_CACHE;
>  
> +     /* Take the maximum of the old and new count. If the new count is lower,
> +      * dirtying is needed to disable the unbound colorbuffers.
> +      */
> +     rctx->cb_misc_state.dirty_cbufs |=
> +             (1 << MAX2(rctx->framebuffer.state.nr_cbufs, state->nr_cbufs)) 
> - 1;
>       rctx->framebuffer.dirty_zsbuf |= rctx->framebuffer.state.zsbuf != 
> state->zsbuf;
>       util_copy_framebuffer_state(&rctx->framebuffer.state, state);
>  
> @@ -1684,6 +1689,9 @@ static void evergreen_emit_framebuffer_state(struct 
> r600_context *rctx, struct r
>       for (i = 0; i < nr_cbufs; i++) {
>               unsigned reloc, cmask_reloc;
>  
> +             if (!(rctx->cb_misc_state.dirty_cbufs & (1 << i)))
> +                     continue;
> +
>               cb = (struct r600_surface*)state->cbufs[i];
>               if (!cb) {
>                       radeon_set_context_reg(cs, R_028C70_CB_COLOR0_INFO + i 
> * 0x3C,
> @@ -1736,13 +1744,15 @@ static void evergreen_emit_framebuffer_state(struct 
> r600_context *rctx, struct r
>               radeon_emit(cs, reloc);
>       }
>       /* set CB_COLOR1_INFO for possible dual-src blending */
> -     if (rctx->framebuffer.dual_src_blend && i == 1 && state->cbufs[0]) {
> +     if (rctx->framebuffer.dual_src_blend && i == 1 && state->cbufs[0] &&
> +         rctx->cb_misc_state.dirty_cbufs & (1 << 0)) {
>               radeon_set_context_reg(cs, R_028C70_CB_COLOR0_INFO + 1 * 0x3C,
>                                      cb->cb_color_info | tex->cb_color_info);
>               i++;
>       }
>       for (; i < 8 ; i++)
> -             radeon_set_context_reg(cs, R_028C70_CB_COLOR0_INFO + i * 0x3C, 
> 0);
> +             if (rctx->cb_misc_state.dirty_cbufs & (1 << i))
> +                     radeon_set_context_reg(cs, R_028C70_CB_COLOR0_INFO + i 
> * 0x3C, 0);
>       for (; i < 12; i++)
>               radeon_set_context_reg(cs, R_028E50_CB_COLOR8_INFO + (i - 8) * 
> 0x1C, 0);
>  
> @@ -1810,6 +1820,7 @@ static void evergreen_emit_framebuffer_state(struct 
> r600_context *rctx, struct r
>                                       rctx->ps_iter_samples, 0, 
> sc_mode_cntl_1);
>       }
>       rctx->framebuffer.dirty_zsbuf = false;
> +     rctx->cb_misc_state.dirty_cbufs = 0;
>  }
>  
>  static void evergreen_emit_polygon_offset(struct r600_context *rctx, struct 
> r600_atom *a)
> diff --git a/src/gallium/drivers/r600/r600_blit.c 
> b/src/gallium/drivers/r600/r600_blit.c
> index 62035a7bee..a4434b77c2 100644
> --- a/src/gallium/drivers/r600/r600_blit.c
> +++ b/src/gallium/drivers/r600/r600_blit.c
> @@ -407,7 +407,8 @@ static void r600_clear(struct pipe_context *ctx, unsigned 
> buffers,
>  
>       if (buffers & PIPE_CLEAR_COLOR && rctx->b.chip_class >= EVERGREEN) {
>               evergreen_do_fast_color_clear(&rctx->b, fb, 
> &rctx->framebuffer.atom,
> -                                           &buffers, NULL, color);
> +                                           &buffers,
> +                                           &rctx->cb_misc_state.dirty_cbufs, 
> color);
>               if (!buffers)
>                       return; /* all buffers have been fast cleared */
>       }
> diff --git a/src/gallium/drivers/r600/r600_hw_context.c 
> b/src/gallium/drivers/r600/r600_hw_context.c
> index c85e346307..4054896393 100644
> --- a/src/gallium/drivers/r600/r600_hw_context.c
> +++ b/src/gallium/drivers/r600/r600_hw_context.c
> @@ -375,6 +375,7 @@ void r600_begin_new_cs(struct r600_context *ctx)
>       assert(!ctx->b.gfx.cs->prev_dw);
>       ctx->b.initial_gfx_cs_size = ctx->b.gfx.cs->current.cdw;
>       ctx->framebuffer.dirty_zsbuf = true;
> +     ctx->cb_misc_state.dirty_cbufs = (1 << 8) - 1;
>  }
>  
>  void r600_emit_pfp_sync_me(struct r600_context *rctx)
> diff --git a/src/gallium/drivers/r600/r600_pipe.h 
> b/src/gallium/drivers/r600/r600_pipe.h
> index aeba1f2635..8f1c1a8095 100644
> --- a/src/gallium/drivers/r600/r600_pipe.h
> +++ b/src/gallium/drivers/r600/r600_pipe.h
> @@ -133,6 +133,7 @@ struct r600_cb_misc_state {
>       unsigned blend_colormask; /* 8*4 bits for 8 RGBA colorbuffers */
>       unsigned nr_cbufs;
>       unsigned nr_ps_color_outputs;
> +     unsigned dirty_cbufs;
>       bool multiwrite;
>       bool dual_src_blend;
>  };
> diff --git a/src/gallium/drivers/r600/r600_state_common.c 
> b/src/gallium/drivers/r600/r600_state_common.c
> index ffb0f5a811..7716c83f84 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -187,6 +187,7 @@ static void r600_bind_blend_state_internal(struct 
> r600_context *rctx,
>       }
>       if (update_cb) {
>               r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
> +             rctx->cb_misc_state.dirty_cbufs |= (1 << 
> rctx->framebuffer.state.nr_cbufs) - 1;
>       }
>       if (rctx->framebuffer.dual_src_blend != blend->dual_src_blend) {
>               rctx->framebuffer.dual_src_blend = blend->dual_src_blend;
> diff --git a/src/gallium/drivers/radeon/r600_texture.c 
> b/src/gallium/drivers/radeon/r600_texture.c
> index 8110ec1484..ca8c75639a 100644
> --- a/src/gallium/drivers/radeon/r600_texture.c
> +++ b/src/gallium/drivers/radeon/r600_texture.c
> @@ -2753,8 +2753,7 @@ void evergreen_do_fast_color_clear(struct 
> r600_common_context *rctx,
>  
>               evergreen_set_clear_color(tex, fb->cbufs[i]->format, color);
>  
> -             if (dirty_cbufs)
> -                     *dirty_cbufs |= 1 << i;
> +             *dirty_cbufs |= 1 << i;
>               rctx->set_atom_dirty(rctx, fb_state, true);
>               *buffers &= ~clear_bit;
>       }
> 
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to