Fixup vsync

This commit is contained in:
Fred Sundvik 2025-10-15 17:54:27 +03:00
parent 920d349591
commit 9ddcbbe67a
8 changed files with 69 additions and 26 deletions

View file

@ -63,6 +63,7 @@ impl NeovideApplication {
format_and_log_error_message(err),
event_loop,
self.settings.clone(),
self.proxy.clone(),
);
self.current_window = Some(UpdateLoop::new(
Box::new(window),

View file

@ -106,12 +106,12 @@ pub struct D3DSkiaRenderer {
_target: IDCompositionTarget,
_visual: IDCompositionVisual,
window: Window,
settings: Arc<Settings>,
vsync: VSync,
}
impl D3DSkiaRenderer {
pub fn new(window: Window, settings: Arc<Settings>) -> Self {
pub fn new(window: Window, settings: Arc<Settings>, proxy: EventLoopProxy<UserEvent>) -> Self {
tracy_zone!("D3DSkiaRenderer::new");
#[cfg(feature = "d3d_debug")]
let dxgi_factory: IDXGIFactory2 = unsafe {
@ -256,6 +256,8 @@ impl D3DSkiaRenderer {
DirectContext::new_d3d(&backend_context, None).expect("Failed to create Skia context")
};
let vsync = VSync::WindowsSwapChain(VSyncWinSwapChain::new(proxy, swap_chain_waitable));
let mut ret = Self {
_adapter: adapter,
#[cfg(feature = "gpu_profiling")]
@ -277,8 +279,8 @@ impl D3DSkiaRenderer {
_target: target,
_visual: visual,
window,
settings,
vsync,
};
ret.setup_surfaces();
@ -451,8 +453,22 @@ impl SkiaRenderer for D3DSkiaRenderer {
self.setup_surfaces();
}
fn create_vsync(&self, proxy: EventLoopProxy<UserEvent>) -> VSync {
VSync::WindowsSwapChain(VSyncWinSwapChain::new(proxy, self.swap_chain_waitable))
fn refresh_interval(&self) -> f32 {
self.vsync.get_refresh_rate(self.window(), &self.settings)
}
fn request_redraw(&mut self) -> bool {
let window = self.window.as_ref().unwrap();
self.vsync.request_redraw(window)
}
fn update_vsync(&mut self) {
let window = self.window.as_ref().unwrap();
self.vsync.update(window);
}
fn wait_for_vsync(&mut self) {
self.vsync.wait_for_vsync();
}
#[cfg(feature = "gpu_profiling")]

View file

@ -83,6 +83,7 @@ pub struct MetalSkiaRenderer {
context: DirectContext,
metal_drawable_surface: Option<MetalDrawableSurface>,
settings: Arc<Settings>,
vsync: VSync,
}
impl MetalSkiaRenderer {
@ -135,6 +136,8 @@ impl MetalSkiaRenderer {
let context = gpu::direct_contexts::make_metal(&backend, None).unwrap();
let vsync = VSync::MacosMetal();
MetalSkiaRenderer {
window,
_device: device,
@ -144,6 +147,7 @@ impl MetalSkiaRenderer {
context,
metal_drawable_surface: None,
settings,
vsync,
}
}
@ -219,7 +223,21 @@ impl SkiaRenderer for MetalSkiaRenderer {
self.window.request_redraw();
}
fn create_vsync(&self, _proxy: EventLoopProxy<UserEvent>) -> VSync {
VSync::MacosMetal()
fn refresh_interval(&self) -> f32 {
self.vsync.get_refresh_rate(self.window(), &self.settings)
}
fn request_redraw(&mut self) -> bool {
let window = self.window.as_ref().unwrap();
self.vsync.request_redraw(window)
}
fn update_vsync(&mut self) {
let window = self.window.as_ref().unwrap();
self.vsync.update(window);
}
fn wait_for_vsync(&mut self) {
self.vsync.wait_for_vsync();
}
}

View file

@ -27,7 +27,7 @@ use skia_safe::Canvas;
use winit::{
event::WindowEvent,
event_loop::ActiveEventLoop,
event_loop::{ActiveEventLoop, EventLoopProxy},
window::{Window, WindowAttributes},
};
@ -39,7 +39,7 @@ use crate::{
renderer::rendered_layer::{group_windows, FloatingLayer},
settings::*,
units::{to_skia_rect, GridRect, GridSize, PixelPos},
window::ShouldRender,
window::{ShouldRender, UserEvent},
WindowSettings,
};
@ -576,6 +576,7 @@ pub fn create_skia_renderer(
srgb: bool,
vsync: bool,
settings: Arc<Settings>,
#[allow(unused)] proxy: EventLoopProxy<UserEvent>,
) -> Box<dyn SkiaRenderer> {
let renderer: Box<dyn SkiaRenderer> = match &window.config {
WindowConfigType::OpenGL(..) => Box::new(opengl::OpenGLSkiaRenderer::new(
@ -585,9 +586,10 @@ pub fn create_skia_renderer(
settings.clone(),
)),
#[cfg(target_os = "windows")]
WindowConfigType::Direct3D => {
Box::new(d3d::D3DSkiaRenderer::new(window.window, settings.clone()))
}
WindowConfigType::Direct3D => Box::new(
d3d::D3DSkiaRenderer::new(window.window, settings.clone()),
proxy,
),
#[cfg(target_os = "macos")]
WindowConfigType::Metal => Box::new(metal::MetalSkiaRenderer::new(
window.window,

View file

@ -228,12 +228,7 @@ impl SkiaRenderer for OpenGLSkiaRenderer {
fn request_redraw(&mut self) -> bool {
let window = self.window.as_ref().unwrap();
if self.vsync.uses_winit_throttling() {
self.vsync.request_redraw(window);
true
} else {
false
}
self.vsync.request_redraw(window)
}
fn update_vsync(&mut self) {

View file

@ -87,7 +87,7 @@ impl VSync {
}
}
pub fn request_redraw(&mut self, window: &Window) {
pub fn request_redraw(&mut self, window: &Window) -> bool {
match self {
VSync::WinitThrottling(..) => window.request_redraw(),
#[cfg(target_os = "windows")]
@ -97,6 +97,7 @@ impl VSync {
#[cfg(target_os = "macos")]
VSync::MacosDisplayLink(vsync) => vsync.request_redraw(),
_ => {}
}
};
self.uses_winit_throttling()
}
}

View file

@ -71,7 +71,12 @@ pub struct ErrorWindow {
}
impl ErrorWindow {
pub fn new(message: String, event_loop: &ActiveEventLoop, settings: Arc<Settings>) -> Self {
pub fn new(
message: String,
event_loop: &ActiveEventLoop,
settings: Arc<Settings>,
proxy: EventLoopProxy<UserEvent>,
) -> Self {
let message = message.trim_end().to_string();
let font_manager = FontMgr::new();
@ -81,7 +86,7 @@ impl ErrorWindow {
let srgb = SRGB_DEFAULT == "1";
let vsync = true;
let window = create_window(event_loop, &settings);
let skia_renderer = create_skia_renderer(window, srgb, vsync, settings);
let skia_renderer = create_skia_renderer(window, srgb, vsync, settings, proxy);
skia_renderer.window().set_visible(true);
let scale_factor = skia_renderer.window().scale_factor();
let size = skia_renderer.window().inner_size();

View file

@ -121,7 +121,7 @@ impl NeovimWindow {
},
};
runtime.launch(proxy, grid_size, settings.clone());
runtime.launch(proxy.clone(), grid_size, settings.clone());
let saved_inner_size = Default::default();
let renderer = Renderer::new(1.0, initial_config, settings.clone());
@ -485,7 +485,7 @@ impl NeovimWindow {
fn try_create_window_impl(
&mut self,
event_loop: &ActiveEventLoop,
_proxy: &EventLoopProxy<UserEvent>,
proxy: &EventLoopProxy<UserEvent>,
) {
if self.ui_state != UIState::WaitingForWindowCreate {
return;
@ -587,8 +587,13 @@ impl NeovimWindow {
let cmd_line_settings = self.settings.get::<CmdLineSettings>();
let srgb = cmd_line_settings.srgb;
let vsync_enabled = cmd_line_settings.vsync;
let skia_renderer =
create_skia_renderer(window_config, srgb, vsync_enabled, self.settings.clone());
let skia_renderer = create_skia_renderer(
window_config,
srgb,
vsync_enabled,
self.settings.clone(),
proxy.clone(),
);
let window = skia_renderer.window();
self.saved_inner_size = window.inner_size();