diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index c052c116736..4ba22d3b203 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -3903,7 +3903,7 @@ zink_set_framebuffer_state(struct pipe_context *pctx, } if (depth_bias_scale_factor != ctx->depth_bias_scale_factor && ctx->rast_state && ctx->rast_state->base.offset_units_unscaled) - ctx->rast_state_changed = true; + ctx->depth_bias_changed = true; rebind_fb_state(ctx, NULL, true); ctx->fb_state.samples = MAX2(samples, 1); zink_update_framebuffer_state(ctx); diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 7284016d909..898c59d0f64 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -692,14 +692,9 @@ zink_draw(struct pipe_context *pctx, ctx->line_width_changed = false; } - if (BATCH_CHANGED || mode_changed || - ctx->gfx_pipeline_state.modules_changed || - rast_state_changed) { - bool depth_bias = - zink_prim_type(ctx, dinfo) == MESA_PRIM_TRIANGLES && - rast_state->offset_fill; - - if (depth_bias) { + bool using_depth_bias = zink_prim_type(ctx, dinfo) == MESA_PRIM_TRIANGLES && rast_state->offset_fill; + if (BATCH_CHANGED || using_depth_bias != ctx->was_using_depth_bias || ctx->depth_bias_changed) { + if (using_depth_bias) { if (rast_state->base.offset_units_unscaled) { VKCTX(CmdSetDepthBias)(bs->cmdbuf, rast_state->offset_units * ctx->depth_bias_scale_factor, rast_state->offset_clamp, rast_state->offset_scale); } else { @@ -709,7 +704,9 @@ zink_draw(struct pipe_context *pctx, VKCTX(CmdSetDepthBias)(bs->cmdbuf, 0.0f, 0.0f, 0.0f); } } + ctx->was_using_depth_bias = using_depth_bias; ctx->rast_state_changed = false; + ctx->depth_bias_changed = false; if (DYNAMIC_STATE != ZINK_NO_DYNAMIC_STATE) { if (ctx->sample_locations_changed) { diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c index 82b1fbff049..5705bb508c3 100644 --- a/src/gallium/drivers/zink/zink_state.c +++ b/src/gallium/drivers/zink/zink_state.c @@ -769,6 +769,15 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso) if (ctx->rast_state->base.half_pixel_center != half_pixel_center) ctx->vp_state_changed = true; +#define FLT_DIFF(a) (fabs(prev_state->a - ctx->rast_state->a) > FLT_EPSILON) + if (prev_state) + ctx->depth_bias_changed = prev_state->offset_fill != ctx->rast_state->offset_fill || + FLT_DIFF(offset_units) || + FLT_DIFF(offset_clamp) || + FLT_DIFF(offset_scale); + else + ctx->depth_bias_changed = true; + if (!screen->optimal_keys) zink_update_gs_key_rectangular_line(ctx); } diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index c9599552319..c5462f41513 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -1923,6 +1923,7 @@ struct zink_context { bool disable_fs; bool disable_color_writes; bool was_line_loop; + bool was_using_depth_bias; bool fs_query_active; bool occlusion_query_active; bool primitives_generated_active; @@ -2036,6 +2037,7 @@ struct zink_context { bool blend_color_changed : 1; bool sample_mask_changed : 1; bool rast_state_changed : 1; + bool depth_bias_changed : 1; bool line_width_changed : 1; bool dsa_state_changed : 1; bool stencil_ref_changed : 1;