diff --git a/crates/eframe/src/native/run.rs b/crates/eframe/src/native/run.rs index 1f83bdab5b9..5f747b32318 100644 --- a/crates/eframe/src/native/run.rs +++ b/crates/eframe/src/native/run.rs @@ -459,7 +459,8 @@ fn run_and_exit(event_loop: EventLoop, mut winit_app: impl WinitApp + mod glow_integration { use egui::{ - epaint::ahash::HashMap, NumExt as _, ViewportIdPair, ViewportOutput, ViewportUiCallback, + epaint::ahash::HashMap, NumExt as _, ViewportIdPair, ViewportMap, ViewportOutput, + ViewportUiCallback, }; use egui_winit::{ changes_between_builders, create_winit_window_builder, process_viewport_commands, @@ -532,11 +533,11 @@ mod glow_integration { current_gl_context: Option, not_current_gl_context: Option, - viewports: HashMap>>, + viewports: ViewportMap>>, viewport_maps: HashMap, - window_maps: HashMap, + window_maps: ViewportMap, - builders: HashMap, + builders: ViewportMap, } impl GlutinWindowContext { @@ -659,13 +660,13 @@ mod glow_integration { let not_current_gl_context = Some(gl_context); let mut viewport_maps = HashMap::default(); - let mut window_maps = HashMap::default(); + let mut window_maps = ViewportMap::default(); if let Some(window) = &window { viewport_maps.insert(window.id(), ViewportId::MAIN); window_maps.insert(ViewportId::MAIN, window.id()); } - let mut windows = HashMap::default(); + let mut windows = ViewportMap::default(); windows.insert( ViewportId::MAIN, Rc::new(RefCell::new(Viewport { @@ -677,7 +678,7 @@ mod glow_integration { })), ); - let mut builders = HashMap::default(); + let mut builders = ViewportMap::default(); builders.insert(ViewportId::MAIN, window_builder); // the fun part with opengl gl is that we never know whether there is an error. the context creation might have failed, but @@ -1887,7 +1888,7 @@ pub use glow_integration::run_glow; #[cfg(feature = "wgpu")] mod wgpu_integration { - use egui::{ViewportIdPair, ViewportOutput, ViewportUiCallback}; + use egui::{ViewportIdPair, ViewportMap, ViewportOutput, ViewportUiCallback}; use egui_winit::create_winit_window_builder; use parking_lot::Mutex; @@ -1906,10 +1907,10 @@ mod wgpu_integration { } #[derive(Clone, Default)] - pub struct Viewports(HashMap); + pub struct Viewports(ViewportMap); impl std::ops::Deref for Viewports { - type Target = HashMap; + type Target = ViewportMap; fn deref(&self) -> &Self::Target { &self.0 @@ -1930,7 +1931,7 @@ mod wgpu_integration { integration: Rc>, app: Box, viewports: Rc>, - builders: Rc>>, + builders: Rc>>, viewport_maps: Rc>>, } @@ -2177,7 +2178,7 @@ mod wgpu_integration { }, ); - let builders = Rc::new(RefCell::new(HashMap::default())); + let builders = Rc::new(RefCell::new(ViewportMap::default())); builders.borrow_mut().insert(ViewportId::MAIN, builder); let painter = Rc::new(RefCell::new(painter)); @@ -2242,7 +2243,7 @@ mod wgpu_integration { id_pair: ViewportIdPair, viewport_ui_cb: Box, viewports: &RefCell, - builders: &RefCell>, + builders: &RefCell>, beginning: Instant, painter: &RefCell, viewport_maps: &RefCell>, diff --git a/crates/egui-wgpu/src/winit.rs b/crates/egui-wgpu/src/winit.rs index 4b7c058db91..d3ad80ca81c 100644 --- a/crates/egui-wgpu/src/winit.rs +++ b/crates/egui-wgpu/src/winit.rs @@ -1,7 +1,6 @@ use std::{num::NonZeroU32, sync::Arc}; -use egui::ViewportId; -use epaint::ahash::HashMap; +use egui::{ViewportId, ViewportMap}; use crate::{renderer, RenderState, SurfaceErrorAction, WgpuConfiguration}; @@ -80,13 +79,13 @@ pub struct Painter { msaa_samples: u32, support_transparent_backbuffer: bool, depth_format: Option, - depth_texture_view: HashMap, - msaa_texture_view: HashMap, + depth_texture_view: ViewportMap, + msaa_texture_view: ViewportMap, screen_capture_state: Option, instance: wgpu::Instance, render_state: Option, - surfaces: HashMap, + surfaces: ViewportMap, } unsafe impl Send for Painter {} @@ -121,13 +120,13 @@ impl Painter { msaa_samples, support_transparent_backbuffer, depth_format, - depth_texture_view: HashMap::default(), + depth_texture_view: Default::default(), screen_capture_state: None, instance, render_state: None, - surfaces: HashMap::default(), - msaa_texture_view: HashMap::default(), + surfaces: Default::default(), + msaa_texture_view: Default::default(), } } diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 76128d89762..62d7248932c 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -59,13 +59,13 @@ struct Repaint { /// The current frame number. /// /// Incremented at the end of each frame. - viewports_frame_nr: HashMap, + viewports_frame_nr: ViewportMap, /// While positive, keep requesting repaints. Decrement at the start of each frame. - repaint_request: HashMap, + repaint_request: ViewportMap, request_repaint_callback: Option>, - requested_repaint_last_frame: HashMap, + requested_repaint_last_frame: ViewportMap, } impl Repaint { @@ -154,23 +154,23 @@ struct ContextImpl { os: OperatingSystem, - input: HashMap, + input: ViewportMap, /// State that is collected during a frame and then cleared - frame_state: HashMap, + frame_state: ViewportMap, /// How deeply nested are we? viewport_stack: Vec, // The output of a frame: - graphics: HashMap, - output: HashMap, + graphics: ViewportMap, + output: ViewportMap, paint_stats: PaintStats, repaint: Repaint, - viewports: HashMap, + viewports: ViewportMap, viewport_commands: Vec<(ViewportId, ViewportCommand)>, is_desktop: bool, @@ -178,11 +178,11 @@ struct ContextImpl { /// Written to during the frame. layer_rects_this_frame: ahash::HashMap>, - layer_rects_this_viewports: HashMap>>, + layer_rects_this_viewports: ViewportMap>>, /// Read layer_rects_prev_frame: ahash::HashMap>, - layer_rects_prev_viewports: HashMap>>, + layer_rects_prev_viewports: ViewportMap>>, #[cfg(feature = "accesskit")] is_accesskit_enabled: bool, diff --git a/crates/egui/src/memory.rs b/crates/egui/src/memory.rs index 8dcfe136595..b4993474f8c 100644 --- a/crates/egui/src/memory.rs +++ b/crates/egui/src/memory.rs @@ -1,10 +1,11 @@ #![warn(missing_docs)] // Let's keep this file well-documented.` to memory.rs +use epaint::{emath::Rangef, vec2, Vec2}; + use crate::{ area, window, EventFilter, Id, IdMap, InputState, LayerId, Pos2, Rect, Style, ViewportId, + ViewportMap, }; -use ahash::HashMap; -use epaint::{emath::Rangef, vec2, Vec2}; // ---------------------------------------------------------------------------- @@ -77,7 +78,7 @@ pub struct Memory { pub(crate) new_font_definitions: Option, #[cfg_attr(feature = "persistence", serde(skip))] - pub(crate) interactions: HashMap, + pub(crate) interactions: ViewportMap, #[cfg_attr(feature = "persistence", serde(skip))] pub(crate) interaction: Interaction, @@ -90,7 +91,7 @@ pub struct Memory { pub(crate) window_interaction: Option, #[cfg_attr(feature = "persistence", serde(skip))] - pub(crate) window_interactions: HashMap, + pub(crate) window_interactions: ViewportMap, #[cfg_attr(feature = "persistence", serde(skip))] pub(crate) drag_value: crate::widgets::drag_value::MonoState, @@ -99,7 +100,7 @@ pub struct Memory { pub(crate) areas: Areas, #[cfg_attr(feature = "persistence", serde(skip))] - pub(crate) viewports_areas: HashMap, + pub(crate) viewports_areas: ViewportMap, /// Which popup-window is open (if any)? /// Could be a combo box, color picker, menu etc. diff --git a/crates/egui/src/viewport.rs b/crates/egui/src/viewport.rs index 846aa5da9d0..905ed357850 100644 --- a/crates/egui/src/viewport.rs +++ b/crates/egui/src/viewport.rs @@ -49,6 +49,11 @@ impl From for Id { } } +impl nohash_hasher::IsEnabled for ViewportId {} + +/// A fast hash map from [`ViewportId`] to `T`. +pub type ViewportMap = nohash_hasher::IntMap; + // ---------------------------------------------------------------------------- /// This will deref to [`Self::this`].