diff --git a/src/gallium/drivers/asahi/agx_blit.c b/src/gallium/drivers/asahi/agx_blit.c index 8b8842bba6d..3404dd15c08 100644 --- a/src/gallium/drivers/asahi/agx_blit.c +++ b/src/gallium/drivers/asahi/agx_blit.c @@ -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); } diff --git a/src/gallium/drivers/asahi/agx_pipe.c b/src/gallium/drivers/asahi/agx_pipe.c index 429221ababd..26cb1a16e00 100644 --- a/src/gallium/drivers/asahi/agx_pipe.c +++ b/src/gallium/drivers/asahi/agx_pipe.c @@ -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, diff --git a/src/gallium/drivers/asahi/agx_state.h b/src/gallium/drivers/asahi/agx_state.h index bd1e1b1518b..9a15b565a66 100644 --- a/src/gallium/drivers/asahi/agx_state.h +++ b/src/gallium/drivers/asahi/agx_state.h @@ -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);