mirror of
https://github.com/emilk/egui.git
synced 2026-06-27 07:03:14 -04:00
Re-implement PaintCallbacks With Support for WGPU (#1684)
* Re-implement PaintCallbacks With Support for WGPU This makes breaking changes to the PaintCallback system, but makes it flexible enough to support both the WGPU and glow backends with custom rendering. Also adds a WGPU equivalent to the glow demo for custom painting.
This commit is contained in:
@@ -29,6 +29,11 @@ pub struct CreationContext<'s> {
|
||||
/// you might want to use later from a [`egui::PaintCallback`].
|
||||
#[cfg(feature = "glow")]
|
||||
pub gl: Option<std::sync::Arc<glow::Context>>,
|
||||
|
||||
/// Can be used to manage GPU resources for custom rendering with WGPU using
|
||||
/// [`egui::PaintCallback`]s.
|
||||
#[cfg(feature = "wgpu")]
|
||||
pub render_state: Option<egui_wgpu::RenderState>,
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -335,6 +340,11 @@ pub struct Frame {
|
||||
#[cfg(feature = "glow")]
|
||||
#[doc(hidden)]
|
||||
pub gl: Option<std::sync::Arc<glow::Context>>,
|
||||
|
||||
/// Can be used to manage GPU resources for custom rendering with WGPU using
|
||||
/// [`egui::PaintCallback`]s.
|
||||
#[cfg(feature = "wgpu")]
|
||||
pub render_state: Option<egui_wgpu::RenderState>,
|
||||
}
|
||||
|
||||
impl Frame {
|
||||
|
||||
@@ -61,6 +61,9 @@ pub use {egui, egui::emath, egui::epaint};
|
||||
#[cfg(feature = "glow")]
|
||||
pub use {egui_glow, glow};
|
||||
|
||||
#[cfg(feature = "wgpu")]
|
||||
pub use {egui_wgpu, wgpu};
|
||||
|
||||
mod epi;
|
||||
|
||||
// Re-export everything in `epi` so `eframe` users don't have to care about what `epi` is:
|
||||
|
||||
@@ -188,6 +188,7 @@ impl EpiIntegration {
|
||||
window: &winit::window::Window,
|
||||
storage: Option<Box<dyn epi::Storage>>,
|
||||
#[cfg(feature = "glow")] gl: Option<std::sync::Arc<glow::Context>>,
|
||||
#[cfg(feature = "wgpu")] render_state: Option<egui_wgpu::RenderState>,
|
||||
) -> Self {
|
||||
let egui_ctx = egui::Context::default();
|
||||
|
||||
@@ -207,6 +208,8 @@ impl EpiIntegration {
|
||||
storage,
|
||||
#[cfg(feature = "glow")]
|
||||
gl,
|
||||
#[cfg(feature = "wgpu")]
|
||||
render_state,
|
||||
};
|
||||
|
||||
if prefer_dark_mode == Some(true) {
|
||||
|
||||
@@ -62,6 +62,8 @@ pub fn run_glow(
|
||||
gl_window.window(),
|
||||
storage,
|
||||
Some(gl.clone()),
|
||||
#[cfg(feature = "wgpu")]
|
||||
None,
|
||||
);
|
||||
|
||||
{
|
||||
@@ -76,6 +78,8 @@ pub fn run_glow(
|
||||
integration_info: integration.frame.info(),
|
||||
storage: integration.frame.storage(),
|
||||
gl: Some(gl.clone()),
|
||||
#[cfg(feature = "wgpu")]
|
||||
render_state: None,
|
||||
});
|
||||
|
||||
if app.warm_up_enabled() {
|
||||
@@ -230,6 +234,8 @@ pub fn run_wgpu(
|
||||
painter
|
||||
};
|
||||
|
||||
let render_state = painter.get_render_state().expect("Uninitialized");
|
||||
|
||||
let mut integration = epi_integration::EpiIntegration::new(
|
||||
&event_loop,
|
||||
painter.max_texture_side().unwrap_or(2048),
|
||||
@@ -237,6 +243,7 @@ pub fn run_wgpu(
|
||||
storage,
|
||||
#[cfg(feature = "glow")]
|
||||
None,
|
||||
Some(render_state.clone()),
|
||||
);
|
||||
|
||||
{
|
||||
@@ -252,6 +259,7 @@ pub fn run_wgpu(
|
||||
storage: integration.frame.storage(),
|
||||
#[cfg(feature = "glow")]
|
||||
gl: None,
|
||||
render_state: Some(render_state),
|
||||
});
|
||||
|
||||
if app.warm_up_enabled() {
|
||||
|
||||
@@ -170,6 +170,8 @@ impl AppRunner {
|
||||
storage: Some(&storage),
|
||||
#[cfg(feature = "glow")]
|
||||
gl: Some(painter.painter.gl().clone()),
|
||||
#[cfg(feature = "wgpu")]
|
||||
render_state: None,
|
||||
});
|
||||
|
||||
let frame = epi::Frame {
|
||||
@@ -178,6 +180,8 @@ impl AppRunner {
|
||||
storage: Some(Box::new(storage)),
|
||||
#[cfg(feature = "glow")]
|
||||
gl: Some(painter.gl().clone()),
|
||||
#[cfg(feature = "wgpu")]
|
||||
render_state: None,
|
||||
};
|
||||
|
||||
let needs_repaint: std::sync::Arc<NeedRepaint> = Default::default();
|
||||
|
||||
Reference in New Issue
Block a user