mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-25 09:10:40 +02:00
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:
parent
d49f0786c8
commit
09c8520293
3 changed files with 58 additions and 27 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue