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

Pass out pixels_per_point in output for use in tesselation

This commit is contained in:
Emil Ernerfeldt
2023-11-15 11:14:13 +01:00
parent c18eb1987e
commit 1b1be3cd6c
7 changed files with 33 additions and 25 deletions

View File

@@ -562,6 +562,7 @@ mod glow_integration {
platform_output, platform_output,
textures_delta, textures_delta,
shapes, shapes,
pixels_per_point,
viewports: viewports_out, viewports: viewports_out,
viewport_commands, viewport_commands,
} = full_output; } = full_output;
@@ -580,10 +581,6 @@ mod glow_integration {
integration.post_update(app.as_mut(), window); integration.post_update(app.as_mut(), window);
integration.handle_platform_output(window, viewport_id, platform_output, egui_winit); integration.handle_platform_output(window, viewport_id, platform_output, egui_winit);
let pixels_per_point = integration
.egui_ctx
.input_for(viewport_id, |i| i.pixels_per_point());
let clipped_primitives = integration.egui_ctx.tessellate(shapes, pixels_per_point); let clipped_primitives = integration.egui_ctx.tessellate(shapes, pixels_per_point);
*current_gl_context = Some( *current_gl_context = Some(
@@ -1581,7 +1578,7 @@ mod glow_integration {
let screen_size_in_pixels: [u32; 2] = window.inner_size().into(); let screen_size_in_pixels: [u32; 2] = window.inner_size().into();
let pixels_per_point = egui_ctx.input_for(ids.this, |i| i.pixels_per_point()); let pixels_per_point = egui_ctx.input_for(ids.this, |i| i.pixels_per_point());
let clipped_primitives = egui_ctx.tessellate(output.shapes, pixels_per_point); let clipped_primitives = egui_ctx.tessellate(output.shapes, output.pixels_per_point);
let mut painter = painter.borrow_mut(); let mut painter = painter.borrow_mut();
@@ -2181,7 +2178,7 @@ mod wgpu_integration {
} }
let pixels_per_point = egui_ctx.input_for(ids.this, |i| i.pixels_per_point()); let pixels_per_point = egui_ctx.input_for(ids.this, |i| i.pixels_per_point());
let clipped_primitives = egui_ctx.tessellate(output.shapes, pixels_per_point); let clipped_primitives = egui_ctx.tessellate(output.shapes, output.pixels_per_point);
painter.paint_and_update_textures( painter.paint_and_update_textures(
ids.this, ids.this,
pixels_per_point, pixels_per_point,
@@ -2504,6 +2501,7 @@ mod wgpu_integration {
platform_output, platform_output,
textures_delta, textures_delta,
shapes, shapes,
pixels_per_point,
viewports: out_viewports, viewports: out_viewports,
viewport_commands, viewport_commands,
} = full_output; } = full_output;
@@ -2511,10 +2509,6 @@ mod wgpu_integration {
integration.handle_platform_output(window, viewport_id, platform_output, egui_winit); integration.handle_platform_output(window, viewport_id, platform_output, egui_winit);
{ {
let pixels_per_point = integration
.egui_ctx
.input_for(viewport_id, |i| i.pixels_per_point());
let clipped_primitives = integration.egui_ctx.tessellate(shapes, pixels_per_point); let clipped_primitives = integration.egui_ctx.tessellate(shapes, pixels_per_point);
let screenshot_requested = &mut integration.frame.output.screenshot_requested; let screenshot_requested = &mut integration.frame.output.screenshot_requested;

View File

@@ -429,7 +429,7 @@ impl ContextImpl {
/// }); /// });
/// }); /// });
/// handle_platform_output(full_output.platform_output); /// handle_platform_output(full_output.platform_output);
/// let clipped_primitives = ctx.tessellate(full_output.shapes); // create triangles to paint /// let clipped_primitives = ctx.tessellate(full_output.shapes, full_output.pixels_per_point);
/// paint(full_output.textures_delta, clipped_primitives); /// paint(full_output.textures_delta, clipped_primitives);
/// } /// }
/// ``` /// ```
@@ -1486,6 +1486,7 @@ impl ContextImpl {
fn end_frame(&mut self) -> FullOutput { fn end_frame(&mut self) -> FullOutput {
let ended_viewport_id = self.viewport_id(); let ended_viewport_id = self.viewport_id();
let viewport = self.viewports.entry(ended_viewport_id).or_default(); let viewport = self.viewports.entry(ended_viewport_id).or_default();
let pixels_per_point = viewport.input.pixels_per_point;
if viewport.input.wants_repaint() { if viewport.input.wants_repaint() {
self.repaint.requested_repaint(&ended_viewport_id); self.repaint.requested_repaint(&ended_viewport_id);
@@ -1607,6 +1608,7 @@ impl ContextImpl {
platform_output, platform_output,
textures_delta, textures_delta,
shapes, shapes,
pixels_per_point,
viewports: out_viewports, viewports: out_viewports,
// We should not process viewport commands when we are a sync viewport, because that will cause a deadlock for egui backend // We should not process viewport commands when we are a sync viewport, because that will cause a deadlock for egui backend
viewport_commands: if is_last { viewport_commands: if is_last {

View File

@@ -21,6 +21,11 @@ pub struct FullOutput {
/// You can use [`crate::Context::tessellate`] to turn this into triangles. /// You can use [`crate::Context::tessellate`] to turn this into triangles.
pub shapes: Vec<epaint::ClippedShape>, pub shapes: Vec<epaint::ClippedShape>,
/// The number of physical pixels per logical ui point, for the viewport that was updated.
///
/// You can pass this to [`Context::tesselate`] together with [`Self::shapes`].
pub pixels_per_point: f32,
/// All the active viewports, excluding the root. /// All the active viewports, excluding the root.
pub viewports: Vec<ViewportOutput>, pub viewports: Vec<ViewportOutput>,
@@ -35,6 +40,7 @@ impl FullOutput {
platform_output, platform_output,
textures_delta, textures_delta,
shapes, shapes,
pixels_per_point,
mut viewports, mut viewports,
mut viewport_commands, mut viewport_commands,
} = newer; } = newer;
@@ -42,6 +48,7 @@ impl FullOutput {
self.platform_output.append(platform_output); self.platform_output.append(platform_output);
self.textures_delta.append(textures_delta); self.textures_delta.append(textures_delta);
self.shapes = shapes; // Only paint the latest self.shapes = shapes; // Only paint the latest
self.pixels_per_point = pixels_per_point; // Use latest
self.viewports.append(&mut viewports); self.viewports.append(&mut viewports);
self.viewport_commands.append(&mut viewport_commands); self.viewport_commands.append(&mut viewport_commands);
} }

View File

@@ -134,7 +134,7 @@
//! }); //! });
//! }); //! });
//! handle_platform_output(full_output.platform_output); //! handle_platform_output(full_output.platform_output);
//! let clipped_primitives = ctx.tessellate(full_output.shapes); // create triangles to paint //! let clipped_primitives = ctx.tessellate(full_output.shapes, full_output.pixels_per_point);
//! paint(full_output.textures_delta, clipped_primitives); //! paint(full_output.textures_delta, clipped_primitives);
//! } //! }
//! ``` //! ```

View File

@@ -9,7 +9,6 @@ pub fn criterion_benchmark(c: &mut Criterion) {
{ {
let ctx = egui::Context::default(); let ctx = egui::Context::default();
let mut demo_windows = egui_demo_lib::DemoWindows::default(); let mut demo_windows = egui_demo_lib::DemoWindows::default();
let pixels_per_point = 1.0;
// The most end-to-end benchmark. // The most end-to-end benchmark.
c.bench_function("demo_with_tessellate__realistic", |b| { c.bench_function("demo_with_tessellate__realistic", |b| {
@@ -17,7 +16,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
let full_output = ctx.run(RawInput::default(), |ctx| { let full_output = ctx.run(RawInput::default(), |ctx| {
demo_windows.ui(ctx); demo_windows.ui(ctx);
}); });
ctx.tessellate(full_output.shapes, pixels_per_point) ctx.tessellate(full_output.shapes, full_output.pixels_per_point)
}); });
}); });
@@ -33,7 +32,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
demo_windows.ui(ctx); demo_windows.ui(ctx);
}); });
c.bench_function("demo_only_tessellate", |b| { c.bench_function("demo_only_tessellate", |b| {
b.iter(|| ctx.tessellate(full_output.shapes.clone(), pixels_per_point)); b.iter(|| ctx.tessellate(full_output.shapes.clone(), full_output.pixels_per_point));
}); });
} }

View File

@@ -71,14 +71,13 @@ fn test_egui_e2e() {
let mut demo_windows = crate::DemoWindows::default(); let mut demo_windows = crate::DemoWindows::default();
let ctx = egui::Context::default(); let ctx = egui::Context::default();
let raw_input = egui::RawInput::default(); let raw_input = egui::RawInput::default();
let pixels_per_point = 1.0;
const NUM_FRAMES: usize = 5; const NUM_FRAMES: usize = 5;
for _ in 0..NUM_FRAMES { for _ in 0..NUM_FRAMES {
let full_output = ctx.run(raw_input.clone(), |ctx| { let full_output = ctx.run(raw_input.clone(), |ctx| {
demo_windows.ui(ctx); demo_windows.ui(ctx);
}); });
let clipped_primitives = ctx.tessellate(full_output.shapes, pixels_per_point); let clipped_primitives = ctx.tessellate(full_output.shapes, full_output.pixels_per_point);
assert!(!clipped_primitives.is_empty()); assert!(!clipped_primitives.is_empty());
} }
} }
@@ -91,14 +90,13 @@ fn test_egui_zero_window_size() {
screen_rect: Some(egui::Rect::from_min_max(egui::Pos2::ZERO, egui::Pos2::ZERO)), screen_rect: Some(egui::Rect::from_min_max(egui::Pos2::ZERO, egui::Pos2::ZERO)),
..Default::default() ..Default::default()
}; };
let pixels_per_point = 1.0;
const NUM_FRAMES: usize = 5; const NUM_FRAMES: usize = 5;
for _ in 0..NUM_FRAMES { for _ in 0..NUM_FRAMES {
let full_output = ctx.run(raw_input.clone(), |ctx| { let full_output = ctx.run(raw_input.clone(), |ctx| {
demo_windows.ui(ctx); demo_windows.ui(ctx);
}); });
let clipped_primitives = ctx.tessellate(full_output.shapes, pixels_per_point); let clipped_primitives = ctx.tessellate(full_output.shapes, full_output.pixels_per_point);
assert!( assert!(
clipped_primitives.is_empty(), clipped_primitives.is_empty(),
"There should be nothing to show, has at least one primitive with clip_rect: {:?}", "There should be nothing to show, has at least one primitive with clip_rect: {:?}",

View File

@@ -10,7 +10,9 @@ pub struct EguiGlow {
pub egui_winit: egui_winit::State, pub egui_winit: egui_winit::State,
pub painter: crate::Painter, pub painter: crate::Painter,
// output from the last update:
shapes: Vec<egui::epaint::ClippedShape>, shapes: Vec<egui::epaint::ClippedShape>,
pixels_per_point: f32,
textures_delta: egui::TexturesDelta, textures_delta: egui::TexturesDelta,
} }
@@ -28,15 +30,19 @@ impl EguiGlow {
}) })
.unwrap(); .unwrap();
let egui_winit = egui_winit::State::new(
event_loop,
native_pixels_per_point,
Some(painter.max_texture_side()),
);
let pixels_per_point = egui_winit.pixels_per_point();
Self { Self {
egui_ctx: Default::default(), egui_ctx: Default::default(),
egui_winit: egui_winit::State::new( egui_winit,
event_loop,
native_pixels_per_point,
Some(painter.max_texture_side()),
),
painter, painter,
shapes: Default::default(), shapes: Default::default(),
pixels_per_point,
textures_delta: Default::default(), textures_delta: Default::default(),
} }
} }
@@ -55,6 +61,7 @@ impl EguiGlow {
platform_output, platform_output,
textures_delta, textures_delta,
shapes, shapes,
pixels_per_point,
viewports, viewports,
viewport_commands, viewport_commands,
} = self.egui_ctx.run(raw_input, run_ui); } = self.egui_ctx.run(raw_input, run_ui);
@@ -76,6 +83,7 @@ impl EguiGlow {
); );
self.shapes = shapes; self.shapes = shapes;
self.pixels_per_point = pixels_per_point;
self.textures_delta.append(textures_delta); self.textures_delta.append(textures_delta);
} }
@@ -88,7 +96,7 @@ impl EguiGlow {
self.painter.set_texture(id, &image_delta); self.painter.set_texture(id, &image_delta);
} }
let pixels_per_point = self.egui_ctx.pixels_per_point(); let pixels_per_point = self.pixels_per_point;
let clipped_primitives = self.egui_ctx.tessellate(shapes, pixels_per_point); let clipped_primitives = self.egui_ctx.tessellate(shapes, pixels_per_point);
let dimensions: [u32; 2] = window.inner_size().into(); let dimensions: [u32; 2] = window.inner_size().into();
self.painter self.painter