freedreno: Move blend out of dirty-rsc tracking

This was not doing any actual resource tracking, just updating
gmem_reason.  And furthermore, a6xx+ doesn't care about the bits
it was setting.  So move this to per-gen backend for the gens that
need it, and avoid setting FD_DIRTY_RESOURCE when FD_DIRTY_BLEND
is set.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21274>
This commit is contained in:
Rob Clark
2023-02-11 08:03:18 -08:00
committed by Marge Bot
parent 67d4bc7be4
commit 8942f4b734
7 changed files with 26 additions and 10 deletions
@@ -176,6 +176,8 @@ fd2_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *pinfo,
if (ctx->dirty & FD_DIRTY_VTXBUF)
emit_vertexbufs(ctx);
fd_blend_tracking(ctx);
if (fd_binning_enabled)
fd2_emit_state_binning(ctx, ctx->dirty);
@@ -135,6 +135,8 @@ fd3_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
if (!emit.prog)
return false;
fd_blend_tracking(ctx);
const struct ir3_shader_variant *vp = fd3_emit_get_vp(&emit);
const struct ir3_shader_variant *fp = fd3_emit_get_fp(&emit);
@@ -129,6 +129,8 @@ fd4_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
if (!emit.prog)
return false;
fd_blend_tracking(ctx);
const struct ir3_shader_variant *vp = fd4_emit_get_vp(&emit);
const struct ir3_shader_variant *fp = fd4_emit_get_fp(&emit);
@@ -105,6 +105,8 @@ fd5_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
if (!emit.prog)
return false;
fd_blend_tracking(ctx);
const struct ir3_shader_variant *vp = fd5_emit_get_vp(&emit);
const struct ir3_shader_variant *fp = fd5_emit_get_fp(&emit);
@@ -601,7 +601,7 @@ fd_stream_output_target(struct pipe_stream_output_target *target)
static inline bool
fd_context_dirty_resource(enum fd_dirty_3d_state dirty)
{
return dirty & (FD_DIRTY_FRAMEBUFFER | FD_DIRTY_ZSA | FD_DIRTY_BLEND |
return dirty & (FD_DIRTY_FRAMEBUFFER | FD_DIRTY_ZSA |
FD_DIRTY_SSBO | FD_DIRTY_IMAGE | FD_DIRTY_VTXBUF |
FD_DIRTY_TEX | FD_DIRTY_STREAMOUT | FD_DIRTY_QUERY);
}
@@ -132,15 +132,6 @@ batch_draw_tracking_for_dirty_bits(struct fd_batch *batch) assert_dt
}
}
if (ctx->dirty & FD_DIRTY_BLEND) {
if (ctx->blend->logicop_enable)
batch->gmem_reason |= FD_GMEM_LOGICOP_ENABLED;
for (unsigned i = 0; i < pfb->nr_cbufs; i++) {
if (ctx->blend->rt[i].blend_enable)
batch->gmem_reason |= FD_GMEM_BLEND_ENABLED;
}
}
u_foreach_bit (s, ctx->bound_shader_stages) {
/* Mark constbuf as being read: */
if (ctx->dirty_shader[s] & FD_DIRTY_SHADER_CONST) {
@@ -171,4 +171,21 @@ fd_draw_emit(struct fd_batch *batch, struct fd_ringbuffer *ring,
idx_buffer);
}
static inline void
fd_blend_tracking(struct fd_context *ctx)
assert_dt
{
if (ctx->dirty & FD_DIRTY_BLEND) {
struct fd_batch *batch = ctx->batch;
struct pipe_framebuffer_state *pfb = &batch->framebuffer;
if (ctx->blend->logicop_enable)
batch->gmem_reason |= FD_GMEM_LOGICOP_ENABLED;
for (unsigned i = 0; i < pfb->nr_cbufs; i++) {
if (ctx->blend->rt[i].blend_enable)
batch->gmem_reason |= FD_GMEM_BLEND_ENABLED;
}
}
}
#endif /* FREEDRENO_DRAW_H_ */