From 695f66cecd431eb3b8e38f7d3436ff9e44028384 Mon Sep 17 00:00:00 2001 From: "Juan A. Suarez Romero" Date: Thu, 2 Jun 2022 17:06:20 +0200 Subject: [PATCH] v3d: save only required states in blitter Some blitter operations, like clear, doesn't require to save all the states. This is particular important because, besides saving time, the blitter operation restores the state required for the operation, and if we saved more states than those, these ones won't be restored and will be leak. So this also fixes some leaks when running CTS tests. CC: mesa-stable Signed-off-by: Juan A. Suarez Romero Reviewed-by: Iago Toral Quiroga Part-of: --- src/gallium/drivers/v3d/v3d_blit.c | 34 +++++++++++++++++---------- src/gallium/drivers/v3d/v3d_context.h | 2 +- src/gallium/drivers/v3d/v3dx_draw.c | 2 +- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/gallium/drivers/v3d/v3d_blit.c b/src/gallium/drivers/v3d/v3d_blit.c index 9b8ae425ac4..325db96053f 100644 --- a/src/gallium/drivers/v3d/v3d_blit.c +++ b/src/gallium/drivers/v3d/v3d_blit.c @@ -29,8 +29,15 @@ #include "broadcom/common/v3d_tiling.h" #include "broadcom/common/v3d_tfu.h" +/** + * The param @op_blit is used to tell if we are saving state for blitter_blit + * (if true) or blitter_clear (if false). If other blitter functions are used + * that require different state we may need something more elaborated than + * this. + */ + void -v3d_blitter_save(struct v3d_context *v3d) +v3d_blitter_save(struct v3d_context *v3d, bool op_blit) { util_blitter_save_fragment_constant_buffer_slot(v3d->blitter, v3d->constbuf[PIPE_SHADER_FRAGMENT].cb); @@ -42,21 +49,24 @@ v3d_blitter_save(struct v3d_context *v3d) v3d->streamout.targets); util_blitter_save_rasterizer(v3d->blitter, v3d->rasterizer); util_blitter_save_viewport(v3d->blitter, &v3d->viewport); - util_blitter_save_scissor(v3d->blitter, &v3d->scissor); util_blitter_save_fragment_shader(v3d->blitter, v3d->prog.bind_fs); util_blitter_save_blend(v3d->blitter, v3d->blend); util_blitter_save_depth_stencil_alpha(v3d->blitter, v3d->zsa); util_blitter_save_stencil_ref(v3d->blitter, &v3d->stencil_ref); util_blitter_save_sample_mask(v3d->blitter, v3d->sample_mask, 0); - util_blitter_save_framebuffer(v3d->blitter, &v3d->framebuffer); - util_blitter_save_fragment_sampler_states(v3d->blitter, - v3d->tex[PIPE_SHADER_FRAGMENT].num_samplers, - (void **)v3d->tex[PIPE_SHADER_FRAGMENT].samplers); - util_blitter_save_fragment_sampler_views(v3d->blitter, - v3d->tex[PIPE_SHADER_FRAGMENT].num_textures, - v3d->tex[PIPE_SHADER_FRAGMENT].textures); util_blitter_save_so_targets(v3d->blitter, v3d->streamout.num_targets, v3d->streamout.targets); + + if (op_blit) { + util_blitter_save_scissor(v3d->blitter, &v3d->scissor); + util_blitter_save_framebuffer(v3d->blitter, &v3d->framebuffer); + util_blitter_save_fragment_sampler_states(v3d->blitter, + v3d->tex[PIPE_SHADER_FRAGMENT].num_samplers, + (void **)v3d->tex[PIPE_SHADER_FRAGMENT].samplers); + util_blitter_save_fragment_sampler_views(v3d->blitter, + v3d->tex[PIPE_SHADER_FRAGMENT].num_textures, + v3d->tex[PIPE_SHADER_FRAGMENT].textures); + } } static void @@ -110,7 +120,7 @@ v3d_render_blit(struct pipe_context *ctx, struct pipe_blit_info *info) return; } - v3d_blitter_save(v3d); + v3d_blitter_save(v3d, true); util_blitter_blit(v3d->blitter, info); pipe_resource_reference(&tiled, NULL); @@ -178,7 +188,7 @@ v3d_stencil_blit(struct pipe_context *ctx, struct pipe_blit_info *info) struct pipe_sampler_view *src_view = ctx->create_sampler_view(ctx, &src->base, &src_tmpl); - v3d_blitter_save(v3d); + v3d_blitter_save(v3d, true); util_blitter_blit_generic(v3d->blitter, dst_surf, &info->dst.box, src_view, &info->src.box, src->base.width0, src->base.height0, @@ -761,7 +771,7 @@ v3d_sand8_blit(struct pipe_context *pctx, struct pipe_blit_info *info) assert(info->src.box.width == info->dst.box.width); assert(info->src.box.height == info->dst.box.height); - v3d_blitter_save(v3d); + v3d_blitter_save(v3d, true); struct pipe_surface dst_tmpl; util_blitter_default_dst_texture(&dst_tmpl, info->dst.resource, diff --git a/src/gallium/drivers/v3d/v3d_context.h b/src/gallium/drivers/v3d/v3d_context.h index 01784f3bdb0..cd87ade9bc8 100644 --- a/src/gallium/drivers/v3d/v3d_context.h +++ b/src/gallium/drivers/v3d/v3d_context.h @@ -767,7 +767,7 @@ bool v3d_format_supports_tlb_msaa_resolve(const struct v3d_device_info *devinfo, void v3d_init_query_functions(struct v3d_context *v3d); void v3d_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info); -void v3d_blitter_save(struct v3d_context *v3d); +void v3d_blitter_save(struct v3d_context *v3d, bool op_blit); bool v3d_generate_mipmap(struct pipe_context *pctx, struct pipe_resource *prsc, enum pipe_format format, diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index 9c956761d7b..63b2b06dae5 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -1549,7 +1549,7 @@ v3d_draw_clear(struct v3d_context *v3d, if (!color) color = &dummy_color; - v3d_blitter_save(v3d); + v3d_blitter_save(v3d, false); util_blitter_clear(v3d->blitter, v3d->framebuffer.width, v3d->framebuffer.height,