Skip to content

Commit 121de80

Browse files
committed
Merge branch 'main' of https://github.com/lambda-sh/lambda into vmrcella/increase-rendering-test-coverage
2 parents 62660a4 + 0392012 commit 121de80

File tree

3 files changed

+97
-13
lines changed

3 files changed

+97
-13
lines changed

crates/lambda-rs-platform/src/wgpu/surface.rs

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,11 +318,23 @@ fn select_present_mode(
318318
return requested;
319319
}
320320

321+
// Note on ordering:
322+
// - When callers request non-vsync (Immediate/AutoNoVsync), prefer true
323+
// non-vsync modes (Immediate, AutoNoVsync) over low-latency vsync modes
324+
// (Mailbox). Mailbox still synchronizes presentation to refresh and can
325+
// appear "vsync-like" to users who disable vsync expecting uncapped loops.
321326
let candidates: &[wgpu::PresentMode] = match requested {
322-
wgpu::PresentMode::Immediate | wgpu::PresentMode::AutoNoVsync => &[
327+
wgpu::PresentMode::Immediate => &[
323328
wgpu::PresentMode::Immediate,
329+
wgpu::PresentMode::AutoNoVsync,
324330
wgpu::PresentMode::Mailbox,
331+
wgpu::PresentMode::Fifo,
332+
wgpu::PresentMode::AutoVsync,
333+
],
334+
wgpu::PresentMode::AutoNoVsync => &[
325335
wgpu::PresentMode::AutoNoVsync,
336+
wgpu::PresentMode::Immediate,
337+
wgpu::PresentMode::Mailbox,
326338
wgpu::PresentMode::Fifo,
327339
wgpu::PresentMode::AutoVsync,
328340
],
@@ -336,7 +348,15 @@ fn select_present_mode(
336348
wgpu::PresentMode::Fifo,
337349
wgpu::PresentMode::AutoVsync,
338350
],
339-
wgpu::PresentMode::Fifo | wgpu::PresentMode::AutoVsync => &[
351+
wgpu::PresentMode::AutoVsync => &[
352+
wgpu::PresentMode::AutoVsync,
353+
wgpu::PresentMode::Fifo,
354+
wgpu::PresentMode::FifoRelaxed,
355+
wgpu::PresentMode::Mailbox,
356+
wgpu::PresentMode::Immediate,
357+
wgpu::PresentMode::AutoNoVsync,
358+
],
359+
wgpu::PresentMode::Fifo => &[
340360
wgpu::PresentMode::Fifo,
341361
wgpu::PresentMode::AutoVsync,
342362
wgpu::PresentMode::FifoRelaxed,
@@ -414,4 +434,39 @@ mod tests {
414434
let selected = select_present_mode(wgpu::PresentMode::Immediate, available);
415435
assert_eq!(selected, wgpu::PresentMode::AutoNoVsync);
416436
}
437+
438+
#[test]
439+
fn select_present_mode_prefers_auto_no_vsync_over_mailbox_for_immediate_request(
440+
) {
441+
let available = &[
442+
wgpu::PresentMode::Mailbox,
443+
wgpu::PresentMode::AutoNoVsync,
444+
wgpu::PresentMode::Fifo,
445+
];
446+
let selected = select_present_mode(wgpu::PresentMode::Immediate, available);
447+
assert_eq!(selected, wgpu::PresentMode::AutoNoVsync);
448+
}
449+
450+
#[test]
451+
fn select_present_mode_prefers_auto_no_vsync_when_requested() {
452+
let available = &[
453+
wgpu::PresentMode::Immediate,
454+
wgpu::PresentMode::AutoNoVsync,
455+
wgpu::PresentMode::Fifo,
456+
];
457+
let selected =
458+
select_present_mode(wgpu::PresentMode::AutoNoVsync, available);
459+
assert_eq!(selected, wgpu::PresentMode::AutoNoVsync);
460+
}
461+
462+
#[test]
463+
fn select_present_mode_prefers_auto_vsync_when_requested() {
464+
let available = &[
465+
wgpu::PresentMode::Fifo,
466+
wgpu::PresentMode::AutoVsync,
467+
wgpu::PresentMode::Immediate,
468+
];
469+
let selected = select_present_mode(wgpu::PresentMode::AutoVsync, available);
470+
assert_eq!(selected, wgpu::PresentMode::AutoVsync);
471+
}
417472
}

crates/lambda-rs/src/render/mod.rs

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -190,17 +190,8 @@ impl RenderContextBuilder {
190190
})?;
191191

192192
let size = window.dimensions();
193-
let requested_present_mode = present_mode.unwrap_or_else(|| {
194-
if window.vsync_requested() {
195-
return PresentMode::Vsync;
196-
}
197-
return PresentMode::Immediate;
198-
});
199-
let platform_present_mode = match requested_present_mode {
200-
PresentMode::Vsync => targets::surface::PresentMode::Fifo,
201-
PresentMode::Immediate => targets::surface::PresentMode::Immediate,
202-
PresentMode::Mailbox => targets::surface::PresentMode::Mailbox,
203-
};
193+
let platform_present_mode =
194+
resolve_surface_present_mode(present_mode, window.vsync_requested());
204195
surface
205196
.configure_with_defaults(
206197
&gpu,
@@ -261,6 +252,23 @@ impl RenderContextBuilder {
261252
}
262253
}
263254

255+
fn resolve_surface_present_mode(
256+
builder_mode: Option<PresentMode>,
257+
window_vsync: bool,
258+
) -> targets::surface::PresentMode {
259+
let requested = builder_mode.unwrap_or(if window_vsync {
260+
PresentMode::Vsync
261+
} else {
262+
PresentMode::Immediate
263+
});
264+
265+
return match requested {
266+
PresentMode::Vsync => targets::surface::PresentMode::Fifo,
267+
PresentMode::Immediate => targets::surface::PresentMode::Immediate,
268+
PresentMode::Mailbox => targets::surface::PresentMode::Mailbox,
269+
};
270+
}
271+
264272
/// High‑level rendering context for a single window.
265273
///
266274
/// Purpose
@@ -2033,4 +2041,22 @@ mod tests {
20332041
render_context.resize(32, 32);
20342042
assert_eq!(render_context.surface_size(), (32, 32));
20352043
}
2044+
2045+
#[test]
2046+
fn present_mode_defaults_to_window_vsync_true() {
2047+
let mode = resolve_surface_present_mode(None, true);
2048+
assert_eq!(mode, targets::surface::PresentMode::Fifo);
2049+
}
2050+
2051+
#[test]
2052+
fn present_mode_defaults_to_window_vsync_false() {
2053+
let mode = resolve_surface_present_mode(None, false);
2054+
assert_eq!(mode, targets::surface::PresentMode::Immediate);
2055+
}
2056+
2057+
#[test]
2058+
fn present_mode_builder_override_wins_over_window_setting() {
2059+
let mode = resolve_surface_present_mode(Some(PresentMode::Vsync), false);
2060+
assert_eq!(mode, targets::surface::PresentMode::Fifo);
2061+
}
20362062
}

crates/lambda-rs/src/render/window.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ impl WindowBuilder {
5656
///
5757
/// This value is consumed when building a `RenderContext` if no explicit
5858
/// present mode is provided to `RenderContextBuilder`.
59+
///
60+
/// Disabling vsync is best‑effort; the final present mode depends on the
61+
/// platform and adapter surface capabilities.
5962
pub fn with_vsync(mut self, vsync: bool) -> Self {
6063
self.vsync = vsync;
6164
return self;

0 commit comments

Comments
 (0)