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

Better error reporting

This commit is contained in:
Emil Ernerfeldt
2023-11-14 18:23:17 +01:00
parent 999a54ffc7
commit f9e6860c85
5 changed files with 56 additions and 28 deletions

View File

@@ -313,6 +313,11 @@ pub enum Error {
#[error("Found no glutin configs matching the template: {0:?}. Error: {1:?}")] #[error("Found no glutin configs matching the template: {0:?}. Error: {1:?}")]
NoGlutinConfigs(glutin::config::ConfigTemplate, Box<dyn std::error::Error>), NoGlutinConfigs(glutin::config::ConfigTemplate, Box<dyn std::error::Error>),
/// An error from [`glutin`] when using [`glow`].
#[cfg(feature = "glow")]
#[error("egui_glow: {0}")]
OpenGL(#[from] egui_glow::PainterError),
/// An error from [`wgpu`]. /// An error from [`wgpu`].
#[cfg(feature = "wgpu")] #[cfg(feature = "wgpu")]
#[error("WGPU error: {0}")] #[error("WGPU error: {0}")]

View File

@@ -1021,17 +1021,18 @@ mod glow_integration {
.get_mut(&viewport_id) .get_mut(&viewport_id)
.expect("viewport doesn't exist"); .expect("viewport doesn't exist");
let window = viewport.window.get_or_insert_with(|| { let window = if let Some(window) = &mut viewport.window {
window
} else {
log::trace!("Window doesn't exist yet. Creating one now with finalize_window"); log::trace!("Window doesn't exist yet. Creating one now with finalize_window");
Rc::new( viewport
glutin_winit::finalize_window( .window
.insert(Rc::new(glutin_winit::finalize_window(
event_loop, event_loop,
create_winit_window_builder(&viewport.builder), create_winit_window_builder(&viewport.builder),
&self.gl_config, &self.gl_config,
) )?))
.expect("failed to finalize glutin window"), };
)
});
{ {
// surface attributes // surface attributes
@@ -1330,8 +1331,7 @@ mod glow_integration {
})) }))
}; };
let painter = egui_glow::Painter::new(gl, "", native_options.shader_version) let painter = egui_glow::Painter::new(gl, "", native_options.shader_version)?;
.unwrap_or_else(|err| panic!("An OpenGL error occurred: {err}\n"));
Ok((glutin_window_context, painter)) Ok((glutin_window_context, painter))
} }
@@ -1821,22 +1821,27 @@ mod wgpu_integration {
let viewport_id = self.ids.this; let viewport_id = self.ids.this;
if let Ok(new_window) = create_winit_window_builder(&self.builder).build(event_loop) { match create_winit_window_builder(&self.builder).build(event_loop) {
windows_id.insert(new_window.id(), viewport_id); Ok(new_window) => {
windows_id.insert(new_window.id(), viewport_id);
if let Err(err) = if let Err(err) =
pollster::block_on(painter.set_window(viewport_id, Some(&new_window))) pollster::block_on(painter.set_window(viewport_id, Some(&new_window)))
{ {
log::error!("on set_window: viewport_id {viewport_id:?} {err}"); log::error!("on set_window: viewport_id {viewport_id:?} {err}");
}
self.egui_winit = Some(egui_winit::State::new(
event_loop,
Some(new_window.scale_factor() as f32),
painter.max_texture_side(),
));
self.window = Some(Rc::new(new_window));
}
Err(err) => {
log::error!("Failed to create window: {err}");
} }
self.egui_winit = Some(egui_winit::State::new(
event_loop,
Some(new_window.scale_factor() as f32),
painter.max_texture_side(),
));
self.window = Some(Rc::new(new_window));
} }
} }
} }

View File

@@ -58,7 +58,7 @@ mod texture_loader;
use std::borrow::Cow; use std::borrow::Cow;
use std::fmt::Debug; use std::fmt::Debug;
use std::ops::Deref; use std::ops::Deref;
use std::{error::Error as StdError, fmt::Display, sync::Arc}; use std::{fmt::Display, sync::Arc};
use ahash::HashMap; use ahash::HashMap;
@@ -118,7 +118,7 @@ impl Display for LoadError {
} }
} }
impl StdError for LoadError {} impl std::error::Error for LoadError {}
pub type Result<T, E = LoadError> = std::result::Result<T, E>; pub type Result<T, E = LoadError> = std::result::Result<T, E>;

View File

@@ -13,7 +13,7 @@
pub mod painter; pub mod painter;
pub use glow; pub use glow;
pub use painter::{CallbackFn, Painter}; pub use painter::{CallbackFn, Painter, PainterError};
mod misc_util; mod misc_util;
mod shader_version; mod shader_version;
mod vao; mod vao;

View File

@@ -34,6 +34,24 @@ impl TextureFilterExt for egui::TextureFilter {
} }
} }
#[derive(Debug)]
pub struct PainterError(String);
impl std::error::Error for PainterError {}
impl std::fmt::Display for PainterError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "OpenGL: {}", self.0)
}
}
impl From<String> for PainterError {
#[inline]
fn from(value: String) -> Self {
Self(value)
}
}
/// An OpenGL painter using [`glow`]. /// An OpenGL painter using [`glow`].
/// ///
/// This is responsible for painting egui and managing egui textures. /// This is responsible for painting egui and managing egui textures.
@@ -103,7 +121,7 @@ impl Painter {
gl: Arc<glow::Context>, gl: Arc<glow::Context>,
shader_prefix: &str, shader_prefix: &str,
shader_version: Option<ShaderVersion>, shader_version: Option<ShaderVersion>,
) -> Result<Painter, String> { ) -> Result<Painter, PainterError> {
crate::profile_function!(); crate::profile_function!();
crate::check_for_gl_error_even_in_release!(&gl, "before Painter::new"); crate::check_for_gl_error_even_in_release!(&gl, "before Painter::new");
@@ -121,7 +139,7 @@ impl Painter {
if gl.version().major < 2 { if gl.version().major < 2 {
// this checks on desktop that we are not using opengl 1.1 microsoft sw rendering context. // this checks on desktop that we are not using opengl 1.1 microsoft sw rendering context.
// ShaderVersion::get fn will segfault due to SHADING_LANGUAGE_VERSION (added in gl2.0) // ShaderVersion::get fn will segfault due to SHADING_LANGUAGE_VERSION (added in gl2.0)
return Err("egui_glow requires opengl 2.0+. ".to_owned()); return Err(PainterError("egui_glow requires opengl 2.0+. ".to_owned()));
} }
let max_texture_side = unsafe { gl.get_parameter_i32(glow::MAX_TEXTURE_SIZE) } as usize; let max_texture_side = unsafe { gl.get_parameter_i32(glow::MAX_TEXTURE_SIZE) } as usize;