fix: make dt_min a forced-accept floor in RK45 to prevent GPU hang
This commit is contained in:
parent
ff7bf82f02
commit
aadd0c62e1
@ -323,14 +323,23 @@ fn fragment(in: VertexOutput) -> @location(0) vec4<f32> {
|
|||||||
let step = rk45_step(pos, d, dt);
|
let step = rk45_step(pos, d, dt);
|
||||||
let err = step.err;
|
let err = step.err;
|
||||||
|
|
||||||
if (err > tol * 10.0) {
|
if (err > tol * 10.0 && dt > dt_min) {
|
||||||
// Reject: shrink dt, retry (does not consume budget).
|
// Reject: shrink dt, retry (does not consume budget).
|
||||||
dt = clamp(dt * 0.2, dt_min, dt_max);
|
// The `dt > dt_min` guard makes dt_min a forced-accept floor: once
|
||||||
|
// dt is already at its minimum, accept the step regardless of error
|
||||||
|
// rather than spinning forever on `continue`. This prevents a GPU
|
||||||
|
// hang when a ray hits a region whose error is intrinsically above
|
||||||
|
// tolerance even at the smallest step (extreme spin, near-horizon).
|
||||||
|
dt = dt_min;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Accept: consume one budget unit, refine dt.
|
// Accept: consume one budget unit, refine dt.
|
||||||
budget = budget - 1u;
|
budget = budget - 1u;
|
||||||
|
if (err > tol * 10.0) {
|
||||||
|
// Forced accept at dt_min (err still high): don't grow dt back up.
|
||||||
|
} else {
|
||||||
dt = clamp(dt * pow(tol / max(err, 1e-12), 0.2), dt_min, dt_max);
|
dt = clamp(dt * pow(tol / max(err, 1e-12), 0.2), dt_min, dt_max);
|
||||||
|
}
|
||||||
|
|
||||||
let new_pos = step.pos;
|
let new_pos = step.pos;
|
||||||
let new_dir = step.dir;
|
let new_dir = step.dir;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user