diff --git a/crates/eframe/src/epi.rs b/crates/eframe/src/epi.rs index 9e1a1bd07..fae4cbc7e 100644 --- a/crates/eframe/src/epi.rs +++ b/crates/eframe/src/epi.rs @@ -259,22 +259,6 @@ pub trait App { fn raw_input_hook(&mut self, _ctx: &egui::Context, _raw_input: &mut egui::RawInput) {} } -/// Selects the level of hardware graphics acceleration. -#[cfg(not(target_arch = "wasm32"))] -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -pub enum HardwareAcceleration { - /// Require graphics acceleration. - Required, - - /// Prefer graphics acceleration, but fall back to software. - Preferred, - - /// Do NOT use graphics acceleration. - /// - /// On some platforms (macOS) this is ignored and treated the same as [`Self::Preferred`]. - Off, -} - /// Options controlling the behavior of a native window. /// /// Additional windows can be opened using (egui viewports)[`egui::viewport`]. @@ -298,13 +282,6 @@ pub struct NativeOptions { /// To avoid this, set the icon to [`egui::IconData::default`]. pub viewport: egui::ViewportBuilder, - /// Turn on vertical syncing, limiting the FPS to the display refresh rate. - /// - /// The default is `true`. - /// - /// Only affects the `glow` backend. - pub vsync: bool, - /// Set the level of the multisampling anti-aliasing (MSAA). /// /// Must be a power-of-two. Higher = more smooth 3D. @@ -326,13 +303,6 @@ pub struct NativeOptions { /// `egui` doesn't need the stencil buffer, so the default value is 0. pub stencil_buffer: u8, - /// Specify whether or not hardware acceleration is preferred, required, or not. - /// - /// Default: [`HardwareAcceleration::Preferred`]. - /// - /// Only affects the `glow` backend. - pub hardware_acceleration: HardwareAcceleration, - /// What rendering backend to use. #[cfg(any(feature = "glow", feature = "wgpu_no_default_features"))] pub renderer: Renderer, @@ -369,13 +339,6 @@ pub struct NativeOptions { #[cfg(any(feature = "glow", feature = "wgpu_no_default_features"))] pub window_builder: Option, - #[cfg(feature = "glow")] - /// Needed for cross compiling for VirtualBox VMSVGA driver with OpenGL ES 2.0 and OpenGL 2.1 which doesn't support SRGB texture. - /// See . - /// - /// For OpenGL ES 2.0: set this to [`egui_glow::ShaderVersion::Es100`] to solve blank texture problem (by using the "fallback shader"). - pub shader_version: Option, - /// On desktop: make the window position to be centered at initialization. /// /// Platform specific: @@ -383,6 +346,10 @@ pub struct NativeOptions { /// Wayland desktop currently not supported. pub centered: bool, + /// Configures glow instance. + #[cfg(feature = "glow")] + pub glow_options: egui_glow::GlowConfiguration, + /// Configures wgpu instance/device/adapter/surface creation and renderloop. #[cfg(feature = "wgpu_no_default_features")] pub wgpu_options: egui_wgpu::WgpuConfiguration, @@ -427,6 +394,9 @@ impl Clone for NativeOptions { #[cfg(any(feature = "glow", feature = "wgpu_no_default_features"))] window_builder: None, // Skip any builder callbacks if cloning + #[cfg(feature = "glow")] + glow_options: self.glow_options.clone(), + #[cfg(feature = "wgpu_no_default_features")] wgpu_options: self.wgpu_options.clone(), @@ -446,11 +416,9 @@ impl Default for NativeOptions { Self { viewport: Default::default(), - vsync: true, multisampling: 0, depth_buffer: 0, stencil_buffer: 0, - hardware_acceleration: HardwareAcceleration::Preferred, #[cfg(any(feature = "glow", feature = "wgpu_no_default_features"))] renderer: Renderer::default(), @@ -463,11 +431,11 @@ impl Default for NativeOptions { #[cfg(any(feature = "glow", feature = "wgpu_no_default_features"))] window_builder: None, - #[cfg(feature = "glow")] - shader_version: None, - centered: false, + #[cfg(feature = "glow")] + glow_options: egui_glow::GlowConfiguration::default(), + #[cfg(feature = "wgpu_no_default_features")] wgpu_options: egui_wgpu::WgpuConfiguration::default() .with_surface_config(egui_wgpu::SurfaceConfig::LOW_LATENCY), @@ -505,6 +473,10 @@ pub struct WebOptions { #[cfg(feature = "glow")] pub webgl_context_option: WebGlContextOption, + /// Configures glow instance. + #[cfg(feature = "glow")] + pub glow_options: egui_glow::GlowConfiguration, + /// Configures wgpu instance/device/adapter/surface creation and renderloop. #[cfg(feature = "wgpu_no_default_features")] pub wgpu_options: egui_wgpu::WgpuConfiguration, @@ -549,6 +521,9 @@ impl Default for WebOptions { #[cfg(feature = "glow")] webgl_context_option: WebGlContextOption::BestFirst, + #[cfg(feature = "glow")] + glow_options: egui_glow::GlowConfiguration::default(), + #[cfg(feature = "wgpu_no_default_features")] wgpu_options: egui_wgpu::WgpuConfiguration::default(), diff --git a/crates/eframe/src/native/glow_integration.rs b/crates/eframe/src/native/glow_integration.rs index 37e3faa69..1d94dd8d5 100644 --- a/crates/eframe/src/native/glow_integration.rs +++ b/crates/eframe/src/native/glow_integration.rs @@ -184,7 +184,7 @@ impl<'app> GlowWinitApp<'app> { let painter = egui_glow::Painter::new( gl, "", - native_options.shader_version, + native_options.glow_options.shader_version, native_options.dithering, )?; @@ -952,12 +952,12 @@ impl GlutinWindowContext { use glutin::prelude::*; // convert native options to glutin options - let hardware_acceleration = match native_options.hardware_acceleration { - crate::HardwareAcceleration::Required => Some(true), - crate::HardwareAcceleration::Preferred => None, - crate::HardwareAcceleration::Off => Some(false), + let hardware_acceleration = match native_options.glow_options.hardware_acceleration { + egui_glow::HardwareAcceleration::Required => Some(true), + egui_glow::HardwareAcceleration::Preferred => None, + egui_glow::HardwareAcceleration::Off => Some(false), }; - let swap_interval = if native_options.vsync { + let swap_interval = if native_options.glow_options.vsync { glutin::surface::SwapInterval::Wait(NonZeroU32::MIN) } else { glutin::surface::SwapInterval::DontWait diff --git a/crates/eframe/src/web/web_painter_glow.rs b/crates/eframe/src/web/web_painter_glow.rs index 470fa40d3..c9b846d50 100644 --- a/crates/eframe/src/web/web_painter_glow.rs +++ b/crates/eframe/src/web/web_painter_glow.rs @@ -31,8 +31,13 @@ impl WebPainterGlow { #[allow(clippy::allow_attributes, clippy::arc_with_non_send_sync)] // For wasm let gl = std::sync::Arc::new(gl); - let painter = egui_glow::Painter::new(gl, shader_prefix, None, options.dithering) - .map_err(|err| format!("Error starting glow painter: {err}"))?; + let painter = egui_glow::Painter::new( + gl, + shader_prefix, + options.glow_options.shader_version, + options.dithering, + ) + .map_err(|err| format!("Error starting glow painter: {err}"))?; Ok(Self { canvas, diff --git a/crates/egui_glow/src/lib.rs b/crates/egui_glow/src/lib.rs index b0ee4c2a2..e12baa993 100644 --- a/crates/egui_glow/src/lib.rs +++ b/crates/egui_glow/src/lib.rs @@ -95,3 +95,60 @@ pub fn check_for_gl_error_impl(gl: &glow::Context, file: &str, line: u32, contex } } } + +/// Selects the level of hardware graphics acceleration. +#[cfg(not(target_arch = "wasm32"))] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum HardwareAcceleration { + /// Require graphics acceleration. + Required, + + /// Prefer graphics acceleration, but fall back to software. + Preferred, + + /// Do NOT use graphics acceleration. + /// + /// On some platforms (macOS) this is ignored and treated the same as [`Self::Preferred`]. + Off, +} + +/// Configuration for using glow with eframe or the egui-glow winit feature. +#[derive(Clone)] +pub struct GlowConfiguration { + /// Turn on vertical syncing, limiting the FPS to the display refresh rate. + /// + /// The default is `true`. + #[cfg(not(target_arch = "wasm32"))] + pub vsync: bool, + + /// Specify whether or not hardware acceleration is preferred, required, or not. + /// + /// Default: [`HardwareAcceleration::Preferred`]. + #[cfg(not(target_arch = "wasm32"))] + pub hardware_acceleration: HardwareAcceleration, + + /// Needed for cross compiling for VirtualBox VMSVGA driver with OpenGL ES 2.0 and OpenGL 2.1 which doesn't support SRGB texture. + /// See . + /// + /// For OpenGL ES 2.0: set this to [`ShaderVersion::Es100`] to solve blank texture problem (by using the "fallback shader"). + pub shader_version: Option, +} + +#[cfg_attr(target_arch = "wasm32", expect(clippy::derivable_impls))] +impl Default for GlowConfiguration { + fn default() -> Self { + Self { + #[cfg(not(target_arch = "wasm32"))] + vsync: true, + #[cfg(not(target_arch = "wasm32"))] + hardware_acceleration: HardwareAcceleration::Preferred, + shader_version: None, + } + } +} + +#[test] +fn glow_config_impl_send_sync() { + fn assert_send_sync() {} + assert_send_sync::(); +}