diff options
author | Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> | 2020-08-07 03:05:37 +0200 |
---|---|---|
committer | Marek Olšák <marek.olsak@amd.com> | 2020-09-19 03:15:28 -0400 |
commit | 017ca86b2230b168f8a4fdffc2b56fd7d77df049 (patch) | |
tree | 91b9579fce765cf3363447818d81ae94e1d77d40 /src/gallium/drivers/radeonsi/si_state.c | |
parent | c6c1fa9a2638800155b31701190af7baccb0c18f (diff) |
radeonsi: Move display dcc dirty tracking to framebuffer emission.
To improve performance.
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6783>
Diffstat (limited to 'src/gallium/drivers/radeonsi/si_state.c')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index e098e9c5e63..89f936e9fd7 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -2567,6 +2567,27 @@ static void si_dec_framebuffer_counters(const struct pipe_framebuffer_state *sta } } +static void si_update_display_dcc_dirty(struct si_context *sctx) +{ + const struct pipe_framebuffer_state *state = &sctx->framebuffer.state; + struct si_surface *surf; + struct si_texture *tex; + int i; + + for (i = 0; i < state->nr_cbufs; i++) { + if (!state->cbufs[i]) + continue; + + surf = (struct si_surface *)state->cbufs[i]; + tex = (struct si_texture *)surf->base.texture; + + if (!tex->surface.display_dcc_offset) + continue; + + tex->displayable_dcc_dirty = true; + } +} + static void si_set_framebuffer_state(struct pipe_context *ctx, const struct pipe_framebuffer_state *state) { @@ -2694,7 +2715,6 @@ static void si_set_framebuffer_state(struct pipe_context *ctx, sctx->framebuffer.compressed_cb_mask = 0; sctx->framebuffer.uncompressed_cb_mask = 0; - sctx->framebuffer.displayable_dcc_cb_mask = 0; sctx->framebuffer.nr_samples = util_framebuffer_get_num_samples(state); sctx->framebuffer.nr_color_samples = sctx->framebuffer.nr_samples; sctx->framebuffer.log_samples = util_logbase2(sctx->framebuffer.nr_samples); @@ -2732,9 +2752,6 @@ static void si_set_framebuffer_state(struct pipe_context *ctx, else sctx->framebuffer.uncompressed_cb_mask |= 1 << i; - if (tex->surface.display_dcc_offset) - sctx->framebuffer.displayable_dcc_cb_mask |= 1 << i; - /* Don't update nr_color_samples for non-AA buffers. * (e.g. destination of MSAA resolve) */ @@ -3226,6 +3243,8 @@ static void si_emit_framebuffer_state(struct si_context *sctx) radeon_emit(cs, EVENT_TYPE(V_028A90_BREAK_BATCH) | EVENT_INDEX(0)); } + si_update_display_dcc_dirty(sctx); + sctx->framebuffer.dirty_cbufs = 0; sctx->framebuffer.dirty_zsbuf = false; } |