Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Immediate Viewport in normal operation #4043

Closed
wants to merge 23 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 25 additions & 18 deletions crates/eframe/src/native/glow_integration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,7 @@ impl GlowWinitRunning {
) -> EventResult {
crate::profile_function!();

let Some(viewport_id) = self
let Some(mut viewport_id) = self
.glutin
.borrow()
.viewport_from_window
Expand All @@ -496,24 +496,37 @@ impl GlowWinitRunning {
let mut frame_timer = crate::stopwatch::Stopwatch::new();
frame_timer.start();

{
let glutin = self.glutin.borrow();
let (raw_input, viewport_ui_cb) = {
crate::profile_scope!("Prepare");
let mut glutin = self.glutin.borrow_mut();
let viewport = &glutin.viewports[&viewport_id];

let mut is_change_to_root = false;
let is_immediate = viewport.viewport_ui_cb.is_none();

if is_immediate && viewport_id != ViewportId::ROOT {
// This will only happen if this is an immediate viewport.
// That means that the viewport cannot be rendered by itself and needs his parent to be rendered.
is_change_to_root = true;

if let Some(parent_viewport) = glutin.viewports.get(&viewport.ids.parent) {
if let Some(window) = parent_viewport.window.as_ref() {
return EventResult::RepaintNext(window.id());
let is_differed_parent = parent_viewport.viewport_ui_cb.is_some();
if is_differed_parent {
is_change_to_root = false;
viewport_id = parent_viewport.ids.this;
}
}
return EventResult::Wait;
}
}

let (raw_input, viewport_ui_cb) = {
let mut glutin = self.glutin.borrow_mut();
if is_change_to_root {
// This will only happen if this is an immediate viewport.
// That means that the viewport cannot be rendered by itself and needs his parent to be rendered.
if let Some(root_viewport) = glutin.viewports.get(&ViewportId::ROOT) {
viewport_id = root_viewport.ids.this;
} else {
// Not actually used. Because there is always a `Some()` value.
return EventResult::Wait;
}
}

let egui_ctx = glutin.egui_ctx.clone();
let viewport = glutin.viewports.get_mut(&viewport_id).unwrap();
let Some(window) = viewport.window.as_ref() else {
Expand Down Expand Up @@ -715,7 +728,6 @@ impl GlowWinitRunning {
// to resizes anyway, as doing so avoids dropping frames.
//
// See: https://github.com/emilk/egui/issues/903
let mut repaint_asap = false;

match event {
winit::event::WindowEvent::Focused(new_focused) => {
Expand All @@ -728,7 +740,6 @@ impl GlowWinitRunning {
// This solves an issue where the app would panic when minimizing on Windows.
if 0 < physical_size.width && 0 < physical_size.height {
if let Some(viewport_id) = viewport_id {
repaint_asap = true;
glutin.resize(viewport_id, *physical_size);
}
}
Expand Down Expand Up @@ -786,11 +797,7 @@ impl GlowWinitRunning {
}

if event_response.repaint {
if repaint_asap {
EventResult::RepaintNow(window_id)
} else {
EventResult::RepaintNext(window_id)
}
EventResult::RepaintNow(window_id)
} else {
EventResult::Wait
}
Expand Down
45 changes: 26 additions & 19 deletions crates/eframe/src/native/wgpu_integration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,7 @@ impl WgpuWinitRunning {
fn run_ui_and_paint(&mut self, window_id: WindowId) -> EventResult {
crate::profile_function!();

let Some(viewport_id) = self
let Some(mut viewport_id) = self
.shared
.borrow()
.viewport_from_window
Expand Down Expand Up @@ -539,19 +539,32 @@ impl WgpuWinitRunning {
viewports, painter, ..
} = &mut *shared_lock;

if viewport_id != ViewportId::ROOT {
let Some(viewport) = viewports.get(&viewport_id) else {
return EventResult::Wait;
};
let Some(viewport) = viewports.get(&viewport_id) else {
return EventResult::Wait;
};

if viewport.viewport_ui_cb.is_none() {
// This will only happen if this is an immediate viewport.
// That means that the viewport cannot be rendered by itself and needs his parent to be rendered.
if let Some(viewport) = viewports.get(&viewport.ids.parent) {
if let Some(window) = viewport.window.as_ref() {
return EventResult::RepaintNext(window.id());
}
let mut is_change_to_root = false;
let is_immediate = viewport.viewport_ui_cb.is_none();

if is_immediate && viewport_id != ViewportId::ROOT {
is_change_to_root = true;

if let Some(parent_viewport) = viewports.get(&viewport.ids.parent) {
let is_differed_parent = parent_viewport.viewport_ui_cb.is_some();
if is_differed_parent {
is_change_to_root = false;
viewport_id = parent_viewport.ids.this;
}
}
}

if is_change_to_root {
// This will only happen if this is an immediate viewport.
// That means that the viewport cannot be rendered by itself and needs his parent to be rendered.
if let Some(root_viewport) = viewports.get(&ViewportId::ROOT) {
viewport_id = root_viewport.ids.this;
} else {
// Not actually used. Because there is always a `Some()` value.
return EventResult::Wait;
}
}
Expand Down Expand Up @@ -732,7 +745,6 @@ impl WgpuWinitRunning {
// to resizes anyway, as doing so avoids dropping frames.
//
// See: https://github.com/emilk/egui/issues/903
let mut repaint_asap = false;

match event {
winit::event::WindowEvent::Focused(new_focused) => {
Expand All @@ -749,7 +761,6 @@ impl WgpuWinitRunning {
NonZeroU32::new(physical_size.width),
NonZeroU32::new(physical_size.height),
) {
repaint_asap = true;
shared.painter.on_window_resized(viewport_id, width, height);
}
}
Expand Down Expand Up @@ -797,11 +808,7 @@ impl WgpuWinitRunning {
if integration.should_close() {
EventResult::Exit
} else if event_response.repaint {
if repaint_asap {
EventResult::RepaintNow(window_id)
} else {
EventResult::RepaintNext(window_id)
}
EventResult::RepaintNow(window_id)
} else {
EventResult::Wait
}
Expand Down
Loading