mirror of
https://github.com/emilk/egui.git
synced 2026-06-26 22:53:14 -04:00
Group glow config in a struct (#8108)
This is a breaking public API change, but is otherwise trivial due to it not changing any actual runtime behaviour. This renames eframe's NativeOptions `vsync` option to `glow_vsync` to make clear without even looking at docs fully that this is specific to the `glow` backend. While I think a better option would actually be to change the wgpu creation options to match the vsync option if not specified (either to `AutoVsync` or `AutoNoVsync` depending on setting) this would require this be made an `Option<PresentMode>`, which would be confusing - and the `WgpuConfiguration` should probably take priority over other options here, as there's more than 2 present modes that are relevant. So I think this is a suitable way to go. <!-- Please read the "Making a PR" section of [`CONTRIBUTING.md`](https://github.com/emilk/egui/blob/main/CONTRIBUTING.md) before opening a Pull Request! * Keep your PR:s small and focused. * The PR title is what ends up in the changelog, so make it descriptive! * If applicable, add a screenshot or gif. * If it is a non-trivial addition, consider adding a demo for it to `egui_demo_lib`, or a new example. * Do NOT open PR:s from your `master` branch, as that makes it hard for maintainers to test and add commits to your PR. * Remember to run `cargo fmt` and `cargo clippy`. * Open the PR as a draft until you have self-reviewed it and run `./scripts/check.sh`. * When you have addressed a PR comment, mark it as resolved. Please be patient! I will review your PR, but my time is limited! --> * This does not close an issue - this was a trivial amount of code to change, so I might as well just make it a PR on the spot. * [x] I have followed the instructions in the PR template --------- Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
This commit is contained in:
@@ -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<WindowBuilderHook>,
|
||||
|
||||
#[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 <https://github.com/emilk/egui/pull/1993>.
|
||||
///
|
||||
/// 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<egui_glow::ShaderVersion>,
|
||||
|
||||
/// 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(),
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user