1
0
mirror of https://github.com/emilk/egui.git synced 2026-08-31 05:40:03 -04:00
* Fix wgpu builders memory leak
  * Fix wgpu only using the first viewport builder
  * Fix glow setting the wrong parent id
This commit is contained in:
Konkitoman
2023-11-07 11:56:42 +02:00
parent d6a5c8b6bf
commit 76fd5624b7

View File

@@ -1264,7 +1264,7 @@ mod glow_integration {
viewports.retain_mut( viewports.retain_mut(
|ViewportOutput { |ViewportOutput {
builder, builder,
id_pair: ViewportIdPair { this: id, .. }, id_pair: ViewportIdPair { this: id, parent },
viewport_ui_cb, viewport_ui_cb,
}| { }| {
let mut glutin = glutin_ctx.borrow_mut(); let mut glutin = glutin_ctx.borrow_mut();
@@ -1273,13 +1273,14 @@ mod glow_integration {
drop(glutin); drop(glutin);
if let Some(viewport) = glutin_ctx.borrow().viewports.get(id) { if let Some(viewport) = glutin_ctx.borrow().viewports.get(id) {
let mut viewport = viewport.borrow_mut(); let mut viewport = viewport.borrow_mut();
viewport.id_pair.parent = *parent;
viewport.viewport_ui_cb = viewport_ui_cb.clone(); // always update the latest callback
if recreate { if recreate {
viewport.window = None; viewport.window = None;
viewport.gl_surface = None; viewport.gl_surface = None;
viewport.id_pair.parent = *id; } else if let Some(w) = viewport.window.clone() {
}
viewport.viewport_ui_cb = viewport_ui_cb.clone(); // always update the latest callback
if let Some(w) = viewport.window.clone() {
process_viewport_commands(commands, *id, None, &w.borrow()); process_viewport_commands(commands, *id, None, &w.borrow());
} }
active_viewports_ids.push(*id); active_viewports_ids.push(*id);
@@ -1889,7 +1890,7 @@ pub use glow_integration::run_glow;
#[cfg(feature = "wgpu")] #[cfg(feature = "wgpu")]
mod wgpu_integration { mod wgpu_integration {
use egui::{ViewportIdMap, ViewportIdPair, ViewportOutput, ViewportUiCallback}; use egui::{ViewportIdMap, ViewportIdPair, ViewportOutput, ViewportUiCallback};
use egui_winit::create_winit_window_builder; use egui_winit::{create_winit_window_builder, process_viewport_commands};
use parking_lot::Mutex; use parking_lot::Mutex;
use super::*; use super::*;
@@ -2520,9 +2521,9 @@ mod wgpu_integration {
viewport_ui_cb, viewport_ui_cb,
.. ..
}| { }| {
if let Some(window) = viewports.borrow_mut().get_mut(this) { if let Some(viewport) = viewports.borrow_mut().get_mut(this) {
window.viewport_ui_cb = viewport_ui_cb.clone(); viewport.viewport_ui_cb = viewport_ui_cb.clone();
window.parent_id = *parent; viewport.parent_id = *parent;
active_viewports_ids.push(*this); active_viewports_ids.push(*this);
false false
} else { } else {
@@ -2537,23 +2538,49 @@ mod wgpu_integration {
viewport_ui_cb, viewport_ui_cb,
} in out_viewports } in out_viewports
{ {
let mut builders = builders.borrow_mut();
let mut viewports = viewports.borrow_mut();
if builder.icon.is_none() { if builder.icon.is_none() {
builder.icon = builders builder.icon = builders
.borrow_mut()
.get_mut(&id_pair.parent) .get_mut(&id_pair.parent)
.and_then(|w| w.icon.clone()); .and_then(|w| w.icon.clone());
} }
viewports.borrow_mut().insert( if let Some(last_builder) = builders.get_mut(&id_pair.this) {
id_pair.this, let (commands, recreate) =
Viewport { egui_winit::changes_between_builders(&builder, last_builder);
window: None,
state: Rc::new(RefCell::new(None)), if recreate {
viewport_ui_cb, if let Some(viewport) = viewports.get_mut(&id_pair.this) {
parent_id: id_pair.parent, viewport.window = None;
}, viewport.state.replace(None);
); }
builders.borrow_mut().insert(id_pair.this, builder); } else if let Some(Viewport {
window: Some(window),
..
}) = viewports.get(&id_pair.this)
{
process_viewport_commands(
commands,
id_pair.this,
None,
&window.borrow(),
);
}
} else {
viewports.insert(
id_pair.this,
Viewport {
window: None,
state: Rc::new(RefCell::new(None)),
viewport_ui_cb,
parent_id: id_pair.parent,
},
);
builders.insert(id_pair.this, builder);
}
active_viewports_ids.push(id_pair.this); active_viewports_ids.push(id_pair.this);
} }
@@ -2575,6 +2602,9 @@ mod wgpu_integration {
viewports viewports
.borrow_mut() .borrow_mut()
.retain(|id, _| active_viewports_ids.contains(id)); .retain(|id, _| active_viewports_ids.contains(id));
builders
.borrow_mut()
.retain(|id, _| active_viewports_ids.contains(id));
viewport_maps viewport_maps
.borrow_mut() .borrow_mut()
.retain(|_, id| active_viewports_ids.contains(id)); .retain(|_, id| active_viewports_ids.contains(id));