1
0
mirror of https://github.com/emilk/egui.git synced 2026-06-27 15:13:12 -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(
|ViewportOutput {
builder,
id_pair: ViewportIdPair { this: id, .. },
id_pair: ViewportIdPair { this: id, parent },
viewport_ui_cb,
}| {
let mut glutin = glutin_ctx.borrow_mut();
@@ -1273,13 +1273,14 @@ mod glow_integration {
drop(glutin);
if let Some(viewport) = glutin_ctx.borrow().viewports.get(id) {
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 {
viewport.window = None;
viewport.gl_surface = None;
viewport.id_pair.parent = *id;
}
viewport.viewport_ui_cb = viewport_ui_cb.clone(); // always update the latest callback
if let Some(w) = viewport.window.clone() {
} else if let Some(w) = viewport.window.clone() {
process_viewport_commands(commands, *id, None, &w.borrow());
}
active_viewports_ids.push(*id);
@@ -1889,7 +1890,7 @@ pub use glow_integration::run_glow;
#[cfg(feature = "wgpu")]
mod wgpu_integration {
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 super::*;
@@ -2520,9 +2521,9 @@ mod wgpu_integration {
viewport_ui_cb,
..
}| {
if let Some(window) = viewports.borrow_mut().get_mut(this) {
window.viewport_ui_cb = viewport_ui_cb.clone();
window.parent_id = *parent;
if let Some(viewport) = viewports.borrow_mut().get_mut(this) {
viewport.viewport_ui_cb = viewport_ui_cb.clone();
viewport.parent_id = *parent;
active_viewports_ids.push(*this);
false
} else {
@@ -2537,23 +2538,49 @@ mod wgpu_integration {
viewport_ui_cb,
} in out_viewports
{
let mut builders = builders.borrow_mut();
let mut viewports = viewports.borrow_mut();
if builder.icon.is_none() {
builder.icon = builders
.borrow_mut()
.get_mut(&id_pair.parent)
.and_then(|w| w.icon.clone());
}
viewports.borrow_mut().insert(
id_pair.this,
Viewport {
window: None,
state: Rc::new(RefCell::new(None)),
viewport_ui_cb,
parent_id: id_pair.parent,
},
);
builders.borrow_mut().insert(id_pair.this, builder);
if let Some(last_builder) = builders.get_mut(&id_pair.this) {
let (commands, recreate) =
egui_winit::changes_between_builders(&builder, last_builder);
if recreate {
if let Some(viewport) = viewports.get_mut(&id_pair.this) {
viewport.window = None;
viewport.state.replace(None);
}
} 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);
}
@@ -2575,6 +2602,9 @@ mod wgpu_integration {
viewports
.borrow_mut()
.retain(|id, _| active_viewports_ids.contains(id));
builders
.borrow_mut()
.retain(|id, _| active_viewports_ids.contains(id));
viewport_maps
.borrow_mut()
.retain(|_, id| active_viewports_ids.contains(id));