mirror of
https://github.com/emilk/egui.git
synced 2026-08-31 05:40:03 -04:00
eframe:
* 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:
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user