1
0
mirror of https://github.com/emilk/egui.git synced 2026-09-01 14:20:04 -04:00

Fix crash when rendering a sync viewport in a sync viewport

This commit is contained in:
Konkitoman
2023-11-01 21:00:14 +02:00
parent 72a7ee4606
commit 2b8e5b5896

View File

@@ -1084,9 +1084,9 @@ mod glow_integration {
viewport_builder, viewport_builder,
pair, pair,
render, render,
&mut c_glutin.borrow_mut(), &c_glutin,
&c_gl, &c_gl,
&mut c_painter.borrow_mut(), &c_painter,
c_time, c_time,
); );
}, },
@@ -1110,15 +1110,17 @@ mod glow_integration {
mut viewport_builder: ViewportBuilder, mut viewport_builder: ViewportBuilder,
pair: ViewportIdPair, pair: ViewportIdPair,
render: Box<dyn FnOnce(&egui::Context) + '_>, render: Box<dyn FnOnce(&egui::Context) + '_>,
glutin: &mut GlutinWindowContext, glutin: &RefCell<GlutinWindowContext>,
gl: &glow::Context, gl: &glow::Context,
painter: &mut egui_glow::Painter, painter: &RefCell<egui_glow::Painter>,
time: Instant, time: Instant,
) { ) {
let has_window = glutin.viewports.get(&pair).is_some(); let has_window = glutin.borrow().viewports.get(&pair).is_some();
// This will create a new native window if is needed // This will create a new native window if is needed
if !has_window { if !has_window {
let mut glutin = glutin.borrow_mut();
// Inherit parent icon if none // Inherit parent icon if none
{ {
if viewport_builder.icon.is_none() && glutin.builders.get(&pair).is_none() { if viewport_builder.icon.is_none() && glutin.builders.get(&pair).is_none() {
@@ -1158,7 +1160,7 @@ mod glow_integration {
// Rendering the sync viewport // Rendering the sync viewport
let window = glutin.viewports.get(&pair).cloned(); let window = glutin.borrow().viewports.get(&pair).cloned();
let Some(window) = window else { return }; let Some(window) = window else { return };
let output; let output;
@@ -1176,6 +1178,9 @@ mod glow_integration {
let clipped_primitives = egui_ctx.tessellate(output.shapes, pair.this); let clipped_primitives = egui_ctx.tessellate(output.shapes, pair.this);
let mut glutin = glutin.borrow_mut();
let mut painter = painter.borrow_mut();
glutin.current_gl_context = Some( glutin.current_gl_context = Some(
glutin glutin
.current_gl_context .current_gl_context
@@ -2139,10 +2144,10 @@ mod wgpu_integration {
pair, pair,
render, render,
&c_viewports, &c_viewports,
&mut c_builders.borrow_mut(), &c_builders,
c_time, c_time,
&mut c_painter.borrow_mut(), &c_painter,
&mut c_windows_id.borrow_mut(), &c_windows_id,
); );
}, },
); );
@@ -2167,13 +2172,14 @@ mod wgpu_integration {
pair: ViewportIdPair, pair: ViewportIdPair,
render: Box<dyn FnOnce(&egui::Context) + '_>, render: Box<dyn FnOnce(&egui::Context) + '_>,
c_viewports: &Viewports, c_viewports: &Viewports,
builders: &mut HashMap<ViewportId, ViewportBuilder>, builders: &RefCell<HashMap<ViewportId, ViewportBuilder>>,
c_time: Instant, c_time: Instant,
c_painter: &mut egui_wgpu::winit::Painter, c_painter: &RefCell<egui_wgpu::winit::Painter>,
c_windows_id: &mut HashMap<winit::window::WindowId, ViewportId>, c_windows_id: &RefCell<HashMap<winit::window::WindowId, ViewportId>>,
) { ) {
// Creating a new native window if is needed // Creating a new native window if is needed
if c_viewports.borrow().get(&pair).is_none() { if c_viewports.borrow().get(&pair).is_none() {
let mut builders = builders.borrow_mut();
let mut _windows = c_viewports.borrow_mut(); let mut _windows = c_viewports.borrow_mut();
{ {
@@ -2205,8 +2211,8 @@ mod wgpu_integration {
Self::init_window( Self::init_window(
pair.this, pair.this,
&viewport_builder, &viewport_builder,
c_windows_id, &mut c_windows_id.borrow_mut(),
c_painter, &mut c_painter.borrow_mut(),
window, window,
&mut state.borrow_mut(), &mut state.borrow_mut(),
event_loop, event_loop,
@@ -2227,6 +2233,8 @@ mod wgpu_integration {
render(ctx); render(ctx);
}); });
let mut c_painter = c_painter.borrow_mut();
if let Err(err) = pollster::block_on(c_painter.set_window(pair.this, Some(&win))) { if let Err(err) = pollster::block_on(c_painter.set_window(pair.this, Some(&win))) {
log::error!( log::error!(
"when rendering viewport_id: {}, set_window Error {err}", "when rendering viewport_id: {}, set_window Error {err}",