summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/radeonsi/si_state.c
diff options
context:
space:
mode:
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>2020-08-07 03:05:37 +0200
committerMarek Olšák <marek.olsak@amd.com>2020-09-19 03:15:28 -0400
commit017ca86b2230b168f8a4fdffc2b56fd7d77df049 (patch)
tree91b9579fce765cf3363447818d81ae94e1d77d40 /src/gallium/drivers/radeonsi/si_state.c
parentc6c1fa9a2638800155b31701190af7baccb0c18f (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.c27
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;
}