mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 12:28:07 +02:00
r600g: update dirty_level_mask after the 1-st draw after FB change
Ported from radeonsi. Testing with Kane&Lynch2 shows ≈1k skipped updates per frame on average. No piglit changes with tests/gpu.py, gbm mode. Signed-off-by: Constantine Kharlamov <Hi-Angel@yandex.ru> Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
parent
51deba0eb3
commit
2a8a569276
4 changed files with 28 additions and 20 deletions
|
|
@ -1550,6 +1550,7 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
|
|||
r600_mark_atom_dirty(rctx, &rctx->framebuffer.atom);
|
||||
|
||||
r600_set_sample_locations_constant_buffer(rctx);
|
||||
rctx->framebuffer.do_update_surf_dirtiness = true;
|
||||
}
|
||||
|
||||
static void evergreen_set_min_samples(struct pipe_context *ctx, unsigned min_samples)
|
||||
|
|
|
|||
|
|
@ -189,6 +189,7 @@ struct r600_framebuffer {
|
|||
bool cb0_is_integer;
|
||||
bool is_msaa_resolve;
|
||||
bool dual_src_blend;
|
||||
bool do_update_surf_dirtiness;
|
||||
};
|
||||
|
||||
struct r600_sample_mask {
|
||||
|
|
|
|||
|
|
@ -1209,6 +1209,7 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx,
|
|||
r600_mark_atom_dirty(rctx, &rctx->framebuffer.atom);
|
||||
|
||||
r600_set_sample_locations_constant_buffer(rctx);
|
||||
rctx->framebuffer.do_update_surf_dirtiness = true;
|
||||
}
|
||||
|
||||
static uint32_t sample_locs_2x[] = {
|
||||
|
|
|
|||
|
|
@ -99,6 +99,7 @@ static void r600_texture_barrier(struct pipe_context *ctx, unsigned flags)
|
|||
R600_CONTEXT_FLUSH_AND_INV_CB |
|
||||
R600_CONTEXT_FLUSH_AND_INV |
|
||||
R600_CONTEXT_WAIT_3D_IDLE;
|
||||
rctx->framebuffer.do_update_surf_dirtiness = true;
|
||||
}
|
||||
|
||||
static unsigned r600_conv_pipe_prim(unsigned prim)
|
||||
|
|
@ -1732,6 +1733,7 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info
|
|||
if (unlikely(dirty_tex_counter != rctx->b.last_dirty_tex_counter)) {
|
||||
rctx->b.last_dirty_tex_counter = dirty_tex_counter;
|
||||
r600_mark_atom_dirty(rctx, &rctx->framebuffer.atom);
|
||||
rctx->framebuffer.do_update_surf_dirtiness = true;
|
||||
}
|
||||
|
||||
if (!r600_update_derived_state(rctx)) {
|
||||
|
|
@ -2034,29 +2036,32 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info
|
|||
radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_SQ_NON_EVENT));
|
||||
}
|
||||
|
||||
/* Set the depth buffer as dirty. */
|
||||
if (rctx->framebuffer.state.zsbuf) {
|
||||
struct pipe_surface *surf = rctx->framebuffer.state.zsbuf;
|
||||
struct r600_texture *rtex = (struct r600_texture *)surf->texture;
|
||||
|
||||
rtex->dirty_level_mask |= 1 << surf->u.tex.level;
|
||||
|
||||
if (rtex->surface.flags & RADEON_SURF_SBUFFER)
|
||||
rtex->stencil_dirty_level_mask |= 1 << surf->u.tex.level;
|
||||
}
|
||||
if (rctx->framebuffer.compressed_cb_mask) {
|
||||
struct pipe_surface *surf;
|
||||
struct r600_texture *rtex;
|
||||
unsigned mask = rctx->framebuffer.compressed_cb_mask;
|
||||
|
||||
do {
|
||||
unsigned i = u_bit_scan(&mask);
|
||||
surf = rctx->framebuffer.state.cbufs[i];
|
||||
rtex = (struct r600_texture*)surf->texture;
|
||||
if (rctx->framebuffer.do_update_surf_dirtiness) {
|
||||
/* Set the depth buffer as dirty. */
|
||||
if (rctx->framebuffer.state.zsbuf) {
|
||||
struct pipe_surface *surf = rctx->framebuffer.state.zsbuf;
|
||||
struct r600_texture *rtex = (struct r600_texture *)surf->texture;
|
||||
|
||||
rtex->dirty_level_mask |= 1 << surf->u.tex.level;
|
||||
|
||||
} while (mask);
|
||||
if (rtex->surface.flags & RADEON_SURF_SBUFFER)
|
||||
rtex->stencil_dirty_level_mask |= 1 << surf->u.tex.level;
|
||||
}
|
||||
if (rctx->framebuffer.compressed_cb_mask) {
|
||||
struct pipe_surface *surf;
|
||||
struct r600_texture *rtex;
|
||||
unsigned mask = rctx->framebuffer.compressed_cb_mask;
|
||||
|
||||
do {
|
||||
unsigned i = u_bit_scan(&mask);
|
||||
surf = rctx->framebuffer.state.cbufs[i];
|
||||
rtex = (struct r600_texture*)surf->texture;
|
||||
|
||||
rtex->dirty_level_mask |= 1 << surf->u.tex.level;
|
||||
|
||||
} while (mask);
|
||||
}
|
||||
rctx->framebuffer.do_update_surf_dirtiness = false;
|
||||
}
|
||||
|
||||
pipe_resource_reference(&ib.buffer, NULL);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue