@@ -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}
0 commit comments