asahi: fix u_blitter related leaks

see also 689f38b2b4 ("panfrost: fix refcnt imbalance related to blitter")

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32434>
This commit is contained in:
Alyssa Rosenzweig 2024-11-29 09:50:27 -05:00 committed by Marge Bot
parent d49f0786c8
commit 09c8520293
3 changed files with 58 additions and 27 deletions

View file

@ -465,11 +465,8 @@ asahi_compute_blit(struct pipe_context *ctx, const struct pipe_blit_info *info,
void
agx_blitter_save(struct agx_context *ctx, struct blitter_context *blitter,
bool render_cond)
enum asahi_blitter_op op)
{
util_blitter_save_vertex_buffers(blitter, ctx->vertex_buffers,
util_last_bit(ctx->vb_mask));
util_blitter_save_vertex_elements(blitter, ctx->attributes);
util_blitter_save_vertex_shader(blitter,
ctx->stage[PIPE_SHADER_VERTEX].shader);
util_blitter_save_tessctrl_shader(blitter,
@ -478,29 +475,45 @@ agx_blitter_save(struct agx_context *ctx, struct blitter_context *blitter,
ctx->stage[PIPE_SHADER_TESS_EVAL].shader);
util_blitter_save_geometry_shader(blitter,
ctx->stage[PIPE_SHADER_GEOMETRY].shader);
util_blitter_save_rasterizer(blitter, ctx->rast);
util_blitter_save_viewport(blitter, &ctx->viewport[0]);
util_blitter_save_scissor(blitter, &ctx->scissor[0]);
util_blitter_save_fragment_shader(blitter,
ctx->stage[PIPE_SHADER_FRAGMENT].shader);
util_blitter_save_blend(blitter, ctx->blend);
util_blitter_save_depth_stencil_alpha(blitter, ctx->zs);
util_blitter_save_stencil_ref(blitter, &ctx->stencil_ref);
util_blitter_save_so_targets(blitter, ctx->streamout.num_targets,
ctx->streamout.targets);
util_blitter_save_sample_mask(blitter, ctx->sample_mask, 0);
util_blitter_save_vertex_buffers(blitter, ctx->vertex_buffers,
util_last_bit(ctx->vb_mask));
util_blitter_save_vertex_elements(blitter, ctx->attributes);
util_blitter_save_rasterizer(blitter, ctx->rast);
util_blitter_save_viewport(blitter, &ctx->viewport[0]);
util_blitter_save_framebuffer(blitter, &ctx->framebuffer);
util_blitter_save_fragment_sampler_states(
blitter, ctx->stage[PIPE_SHADER_FRAGMENT].sampler_count,
(void **)(ctx->stage[PIPE_SHADER_FRAGMENT].samplers));
util_blitter_save_fragment_sampler_views(
blitter, ctx->stage[PIPE_SHADER_FRAGMENT].texture_count,
(struct pipe_sampler_view **)ctx->stage[PIPE_SHADER_FRAGMENT].textures);
util_blitter_save_fragment_constant_buffer_slot(
blitter, ctx->stage[PIPE_SHADER_FRAGMENT].cb);
if (op & ASAHI_SAVE_FRAGMENT_STATE) {
util_blitter_save_blend(blitter, ctx->blend);
util_blitter_save_depth_stencil_alpha(blitter, ctx->zs);
util_blitter_save_stencil_ref(blitter, &ctx->stencil_ref);
util_blitter_save_sample_mask(blitter, ctx->sample_mask, 0);
if (!render_cond) {
util_blitter_save_scissor(blitter, &ctx->scissor[0]);
util_blitter_save_fragment_shader(
blitter, ctx->stage[PIPE_SHADER_FRAGMENT].shader);
if (op & ASAHI_SAVE_FRAGMENT_CONSTANT) {
util_blitter_save_fragment_constant_buffer_slot(
blitter, ctx->stage[PIPE_SHADER_FRAGMENT].cb);
}
}
if (op & ASAHI_SAVE_FRAMEBUFFER) {
util_blitter_save_framebuffer(blitter, &ctx->framebuffer);
}
if (op & ASAHI_SAVE_TEXTURES) {
util_blitter_save_fragment_sampler_states(
blitter, ctx->stage[PIPE_SHADER_FRAGMENT].sampler_count,
(void **)(ctx->stage[PIPE_SHADER_FRAGMENT].samplers));
util_blitter_save_fragment_sampler_views(
blitter, ctx->stage[PIPE_SHADER_FRAGMENT].texture_count,
(struct pipe_sampler_view **)ctx->stage[PIPE_SHADER_FRAGMENT].textures);
}
if (!(op & ASAHI_DISABLE_RENDER_COND)) {
util_blitter_save_render_condition(blitter,
(struct pipe_query *)ctx->cond_query,
ctx->cond_cond, ctx->cond_mode);
@ -539,7 +552,10 @@ agx_blit(struct pipe_context *pipe, const struct pipe_blit_info *info)
/* Handle self-blits */
agx_flush_writer(ctx, agx_resource(info->dst.resource), "Blit");
agx_blitter_save(ctx, ctx->blitter, info->render_condition_enable);
agx_blitter_save(
ctx, ctx->blitter,
ASAHI_BLIT |
(info->render_condition_enable ? 0 : ASAHI_DISABLE_RENDER_COND));
util_blitter_blit(ctx->blitter, info, NULL);
}

View file

@ -1113,7 +1113,7 @@ agx_clear(struct pipe_context *pctx, unsigned buffers,
/* Slow clears draw a fullscreen rectangle */
if (slowclear) {
agx_blitter_save(ctx, ctx->blitter, false /* render cond */);
agx_blitter_save(ctx, ctx->blitter, ASAHI_CLEAR);
util_blitter_clear(
ctx->blitter, ctx->framebuffer.width, ctx->framebuffer.height,
util_framebuffer_get_num_layers(&ctx->framebuffer), slowclear, color,

View file

@ -1140,9 +1140,24 @@ void agx_add_timestamp_end_query(struct agx_context *ctx, struct agx_query *q);
void agx_query_increment_cpu(struct agx_context *ctx, struct agx_query *query,
uint64_t increment);
/* Blit shaders */
enum asahi_blitter_op /* bitmask */
{
ASAHI_SAVE_TEXTURES = 1,
ASAHI_SAVE_FRAMEBUFFER = 2,
ASAHI_SAVE_FRAGMENT_STATE = 4,
ASAHI_SAVE_FRAGMENT_CONSTANT = 8,
ASAHI_DISABLE_RENDER_COND = 16,
};
enum {
ASAHI_CLEAR = ASAHI_SAVE_FRAGMENT_STATE | ASAHI_SAVE_FRAGMENT_CONSTANT,
ASAHI_BLIT =
ASAHI_SAVE_FRAMEBUFFER | ASAHI_SAVE_TEXTURES | ASAHI_SAVE_FRAGMENT_STATE,
};
void agx_blitter_save(struct agx_context *ctx, struct blitter_context *blitter,
bool render_cond);
enum asahi_blitter_op op);
void agx_blit(struct pipe_context *pipe, const struct pipe_blit_info *info);