diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_draw.c b/src/gallium/drivers/freedreno/a2xx/fd2_draw.c index 2b8510cdc66..1d774974fc2 100644 --- a/src/gallium/drivers/freedreno/a2xx/fd2_draw.c +++ b/src/gallium/drivers/freedreno/a2xx/fd2_draw.c @@ -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); diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c index 915c7928f9c..12e564208e3 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c @@ -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); diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c index 040ad2f995c..6d49340d449 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c @@ -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); diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c index fadb093ee2f..98b7344511f 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c @@ -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); diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h index e9e13fa850f..b00010cf6f4 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.h +++ b/src/gallium/drivers/freedreno/freedreno_context.h @@ -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); } diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index 4af873b8047..5d38c2b6a98 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -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) { diff --git a/src/gallium/drivers/freedreno/freedreno_draw.h b/src/gallium/drivers/freedreno/freedreno_draw.h index 28ffce0e123..acdac273350 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.h +++ b/src/gallium/drivers/freedreno/freedreno_draw.h @@ -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_ */