r300: disable clip-discard watermark for triangles

Commit 0d4aa5f55f introduced the watermark to optimize the guardband
state changes and always computed new_distance as MAX2(distance,
watermark).

That is correct for point/line paths where distance > 0, but it keeps a
non-zero discard distance alive when the next draw sets distance = 0
(triangles). This leaks wide point/line clip-discard state into later
triangle draws and can clip away large parts of geometry (as observed in
Sauerbraten). Only apply the watermark when distance > 0 and reset it to
zero otherwise so triangle draws disable clip-discard as intended.

Fixes: 0d4aa5f55f ("r300: pop-free clipping")
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/14959
(cherry picked from commit ce33f82f83)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40359>
This commit is contained in:
Pavel Ondračka 2026-03-02 20:29:14 +01:00 committed by Eric Engestrom
parent ecb7bf7b68
commit eea697b179
2 changed files with 3 additions and 2 deletions

View file

@ -1274,7 +1274,7 @@
"description": "r300: disable clip-discard watermark for triangles",
"nominated": true,
"nomination_type": 2,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "0d4aa5f55ff80df5b357f10bd56864c97ef1f4ba",
"notes": null

View file

@ -147,7 +147,8 @@ void r300_set_clip_discard_distance(struct r300_context *r300, float distance)
r300->min_clip_discard_distance_watermark = MIN2(distance, 6.0f);
}
float new_distance = MAX2(distance, r300->min_clip_discard_distance_watermark);
float new_distance = distance > 0.0f ?
MAX2(distance, r300->min_clip_discard_distance_watermark) : 0.0f;
if (r300->current_clip_discard_distance != new_distance) {
r300->current_clip_discard_distance = new_distance;