mirror of
https://github.com/emilk/egui.git
synced 2026-06-26 22:53:14 -04:00
wgpu: Allow configuring VSync and frame latency at runtime (#8114)
Let apps change present_mode and desired_maximum_frame_latency at
runtime instead of only at startup.
API changes (egui-wgpu):
- New SurfaceConfig { present_mode, desired_maximum_frame_latency }.
- WgpuConfiguration now nests these as pub surface: SurfaceConfig (was
two top-level fields).
- RenderState gains pub surface_config: SurfaceConfig — the
currently-requested value.
API additions (eframe):
- Frame::wgpu_surface_config() / Frame::set_wgpu_surface_config(...) for
get/set.
- SurfaceConfig re-exported as eframe::SurfaceConfig.
How it works:
The wgpu painter compares render_state.surface_config to its
currently-applied values each paint. If they differ it updates its
config and flips
needs_reconfigure on every surface, piggybacking on the existing
deferred-reconfigure pathway.
Demo:
The backend panel (egui_demo_app) gets dropdowns for present mode and
desired max frame latency, wired through the new Frame accessors.
<img width="282" height="172" alt="image"
src="https://github.com/user-attachments/assets/0b1274b2-7e4e-4413-969b-0a014c415f79"
/>
This commit is contained in:
@@ -469,7 +469,8 @@ impl Default for NativeOptions {
|
||||
centered: false,
|
||||
|
||||
#[cfg(feature = "wgpu_no_default_features")]
|
||||
wgpu_options: egui_wgpu::WgpuConfiguration::default(),
|
||||
wgpu_options: egui_wgpu::WgpuConfiguration::default()
|
||||
.with_surface_config(egui_wgpu::SurfaceConfig::LOW_LATENCY),
|
||||
|
||||
persist_window: true,
|
||||
|
||||
@@ -793,6 +794,28 @@ impl Frame {
|
||||
pub fn wgpu_render_state(&self) -> Option<&egui_wgpu::RenderState> {
|
||||
self.wgpu_render_state.as_ref()
|
||||
}
|
||||
|
||||
/// The currently-applied runtime surface config (present mode, frame latency)
|
||||
/// used by the `wgpu` renderer, if any.
|
||||
///
|
||||
/// Returns `None` when not using the `wgpu` backend.
|
||||
#[cfg(feature = "wgpu_no_default_features")]
|
||||
pub fn wgpu_surface_config(&self) -> Option<egui_wgpu::SurfaceConfig> {
|
||||
self.wgpu_render_state
|
||||
.as_ref()
|
||||
.map(|state| state.surface_config)
|
||||
}
|
||||
|
||||
/// Set the runtime surface config (present mode, frame latency) for the `wgpu`
|
||||
/// renderer. The surface is reconfigured on the next paint.
|
||||
///
|
||||
/// No-op when not using the `wgpu` backend.
|
||||
#[cfg(feature = "wgpu_no_default_features")]
|
||||
pub fn set_wgpu_surface_config(&mut self, config: egui_wgpu::SurfaceConfig) {
|
||||
if let Some(state) = &mut self.wgpu_render_state {
|
||||
state.surface_config = config;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Information about the web environment (if applicable).
|
||||
|
||||
@@ -159,7 +159,7 @@ pub use {egui, egui::emath, egui::epaint};
|
||||
pub use {egui_glow, glow};
|
||||
|
||||
#[cfg(feature = "wgpu_no_default_features")]
|
||||
pub use {egui_wgpu, egui_wgpu::wgpu};
|
||||
pub use {egui_wgpu, egui_wgpu::SurfaceConfig, egui_wgpu::WgpuConfiguration, egui_wgpu::wgpu};
|
||||
|
||||
mod epi;
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@ impl WebPainterWgpu {
|
||||
|
||||
let surface_configuration = wgpu::SurfaceConfiguration {
|
||||
format: render_state.target_format,
|
||||
present_mode: wgpu_options.present_mode,
|
||||
present_mode: wgpu_options.surface.present_mode,
|
||||
view_formats: vec![render_state.target_format],
|
||||
..default_configuration
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user