Skip to content

egui-wgpu renderer renaming #2021

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

Merged
merged 2 commits into from
Sep 7, 2022
Merged
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
4 changes: 4 additions & 0 deletions crates/egui-wgpu/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ All notable changes to the `egui-wgpu` integration will be noted in this file.


## Unreleased
* Rename `RenderPass` to `Renderer`
* Rename `RenderPass::execute` to `RenderPass::render`
* Rename `RenderPass::execute_with_renderpass` to `Renderer::render_onto_renderpass`
* Reexport `Renderer`


## 0.19.0 - 2022-08-20
Expand Down
1 change: 1 addition & 0 deletions crates/egui-wgpu/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ pub use wgpu;
/// Low-level painting of [`egui`] on [`wgpu`].
pub mod renderer;
pub use renderer::CallbackFn;
pub use renderer::Renderer;

/// Module for painting [`egui`] with [`wgpu`] on [`winit`].
#[cfg(feature = "winit")]
Expand Down
71 changes: 34 additions & 37 deletions crates/egui-wgpu/src/renderer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use wgpu::util::DeviceExt as _;
/// can issue draw commands.
///
/// The final argument of both the `prepare` and `paint` callbacks is a the
/// [`paint_callback_resources`][crate::renderer::RenderPass::paint_callback_resources].
/// [`paint_callback_resources`][crate::renderer::Renderer::paint_callback_resources].
/// `paint_callback_resources` has the same lifetime as the Egui render pass, so it can be used to
/// store buffers, pipelines, and other information that needs to be accessed during the render
/// pass.
Expand Down Expand Up @@ -118,9 +118,9 @@ struct SizedBuffer {
size: usize,
}

/// Render pass to render a egui based GUI.
pub struct RenderPass {
render_pipeline: wgpu::RenderPipeline,
/// Renderer for a egui based GUI.
pub struct Renderer {
pipeline: wgpu::RenderPipeline,
depth_texture: Option<(wgpu::Texture, wgpu::TextureView)>,
index_buffers: Vec<SizedBuffer>,
vertex_buffers: Vec<SizedBuffer>,
Expand All @@ -137,8 +137,8 @@ pub struct RenderPass {
pub paint_callback_resources: TypeMap,
}

impl RenderPass {
/// Creates a new render pass to render a egui UI.
impl Renderer {
/// Creates a renderer for a egui UI.
///
/// If the format passed is not a *Srgb format, the shader will automatically convert to `sRGB` colors in the shader.
pub fn new(
Expand Down Expand Up @@ -231,7 +231,7 @@ impl RenderPass {
bias: wgpu::DepthBiasState::default(),
});

let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {
let pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {
label: Some("egui_pipeline"),
layout: Some(&pipeline_layout),
vertex: wgpu::VertexState {
Expand Down Expand Up @@ -290,7 +290,7 @@ impl RenderPass {
});

Self {
render_pipeline,
pipeline,
vertex_buffers: Vec::with_capacity(64),
index_buffers: Vec::with_capacity(64),
uniform_buffer,
Expand Down Expand Up @@ -323,8 +323,8 @@ impl RenderPass {
self.depth_texture = Some((texture, view));
}

/// Executes the egui render pass.
pub fn execute(
/// Executes the renderer on its own render pass.
pub fn render(
&self,
encoder: &mut wgpu::CommandEncoder,
color_attachment: &wgpu::TextureView,
Expand All @@ -349,7 +349,7 @@ impl RenderPass {
}
});

let mut rpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
view: color_attachment,
resolve_target: None,
Expand All @@ -359,26 +359,23 @@ impl RenderPass {
},
})],
depth_stencil_attachment,
label: Some("egui main render pass"),
label: Some("egui_render_pass"),
});
rpass.push_debug_group("egui_pass");

self.execute_with_renderpass(&mut rpass, paint_jobs, screen_descriptor);

rpass.pop_debug_group();
self.render_onto_renderpass(&mut render_pass, paint_jobs, screen_descriptor);
}

/// Executes the egui render pass onto an existing wgpu renderpass.
pub fn execute_with_renderpass<'rpass>(
&'rpass self,
rpass: &mut wgpu::RenderPass<'rpass>,
/// Executes the egui renderer onto an existing wgpu renderpass.
pub fn render_onto_renderpass<'rp>(
&'rp self,
render_pass: &mut wgpu::RenderPass<'rp>,
paint_jobs: &[egui::epaint::ClippedPrimitive],
screen_descriptor: &ScreenDescriptor,
) {
let pixels_per_point = screen_descriptor.pixels_per_point;
let size_in_pixels = screen_descriptor.size_in_pixels;

// Whether or not we need to reset the renderpass state because a paint callback has just
// Whether or not we need to reset the render pass because a paint callback has just
// run.
let mut needs_reset = true;

Expand All @@ -391,16 +388,16 @@ impl RenderPass {
} in paint_jobs
{
if needs_reset {
rpass.set_viewport(
render_pass.set_viewport(
0.0,
0.0,
size_in_pixels[0] as f32,
size_in_pixels[1] as f32,
0.0,
1.0,
);
rpass.set_pipeline(&self.render_pipeline);
rpass.set_bind_group(0, &self.uniform_bind_group, &[]);
render_pass.set_pipeline(&self.pipeline);
render_pass.set_bind_group(0, &self.uniform_bind_group, &[]);
needs_reset = false;
}

Expand All @@ -417,7 +414,7 @@ impl RenderPass {
continue;
}

rpass.set_scissor_rect(rect.x, rect.y, rect.width, rect.height);
render_pass.set_scissor_rect(rect.x, rect.y, rect.width, rect.height);
}

match primitive {
Expand All @@ -426,13 +423,13 @@ impl RenderPass {
let vertex_buffer = vertex_buffers.next().unwrap();

if let Some((_texture, bind_group)) = self.textures.get(&mesh.texture_id) {
rpass.set_bind_group(1, bind_group, &[]);
rpass.set_index_buffer(
render_pass.set_bind_group(1, bind_group, &[]);
render_pass.set_index_buffer(
index_buffer.buffer.slice(..),
wgpu::IndexFormat::Uint32,
);
rpass.set_vertex_buffer(0, vertex_buffer.buffer.slice(..));
rpass.draw_indexed(0..mesh.indices.len() as u32, 0, 0..1);
render_pass.set_vertex_buffer(0, vertex_buffer.buffer.slice(..));
render_pass.draw_indexed(0..mesh.indices.len() as u32, 0, 0..1);
} else {
tracing::warn!("Missing texture: {:?}", mesh.texture_id);
}
Expand Down Expand Up @@ -461,7 +458,7 @@ impl RenderPass {
let rect_max_x = rect_max_x.round();
let rect_max_y = rect_max_y.round();

rpass.set_viewport(
render_pass.set_viewport(
rect_min_x,
rect_min_y,
rect_max_x - rect_min_x,
Expand All @@ -478,18 +475,18 @@ impl RenderPass {
pixels_per_point,
screen_size_px: size_in_pixels,
},
rpass,
render_pass,
&self.paint_callback_resources,
);
}
}
}
}

rpass.set_scissor_rect(0, 0, size_in_pixels[0], size_in_pixels[1]);
render_pass.set_scissor_rect(0, 0, size_in_pixels[0], size_in_pixels[1]);
}

/// Should be called before `execute()`.
/// Should be called before `render()`.
pub fn update_texture(
&mut self,
device: &wgpu::Device,
Expand Down Expand Up @@ -768,8 +765,8 @@ impl RenderPass {
*user_texture_binding = bind_group;
}

/// Uploads the uniform, vertex and index data used by the render pass.
/// Should be called before `execute()`.
/// Uploads the uniform, vertex and index data used by the renderer.
/// Should be called before `render()`.
pub fn update_buffers(
&mut self,
device: &wgpu::Device,
Expand Down Expand Up @@ -922,7 +919,7 @@ impl ScissorRect {
}

#[test]
fn render_pass_impl_send_sync() {
fn renderer_impl_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<RenderPass>();
assert_send_sync::<Renderer>();
}
28 changes: 16 additions & 12 deletions crates/egui-wgpu/src/winit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use egui::mutex::RwLock;
use tracing::error;
use wgpu::{Adapter, Instance, Surface};

use crate::renderer;
use crate::{renderer, Renderer};

/// Access to the render state for egui, which can be useful in combination with
/// [`egui::PaintCallback`]s for custom rendering using WGPU.
Expand All @@ -13,7 +13,7 @@ pub struct RenderState {
pub device: Arc<wgpu::Device>,
pub queue: Arc<wgpu::Queue>,
pub target_format: wgpu::TextureFormat,
pub egui_rpass: Arc<RwLock<renderer::RenderPass>>,
pub renderer: Arc<RwLock<Renderer>>,
}

struct SurfaceState {
Expand Down Expand Up @@ -90,14 +90,13 @@ impl<'a> Painter<'a> {
let (device, queue) =
pollster::block_on(adapter.request_device(&self.device_descriptor, None)).unwrap();

let rpass =
renderer::RenderPass::new(&device, target_format, self.msaa_samples, self.depth_bits);
let renderer = Renderer::new(&device, target_format, self.msaa_samples, self.depth_bits);

RenderState {
device: Arc::new(device),
queue: Arc::new(queue),
target_format,
egui_rpass: Arc::new(RwLock::new(rpass)),
renderer: Arc::new(RwLock::new(renderer)),
}
}

Expand Down Expand Up @@ -151,7 +150,7 @@ impl<'a> Painter<'a> {
surface_state.height = height_in_pixels;

if self.depth_bits > 0 {
render_state.egui_rpass.write().update_depth_texture(
render_state.renderer.write().update_depth_texture(
&render_state.device,
width_in_pixels,
height_in_pixels,
Expand Down Expand Up @@ -272,12 +271,17 @@ impl<'a> Painter<'a> {
};

{
let mut rpass = render_state.egui_rpass.write();
let mut renderer = render_state.renderer.write();
for (id, image_delta) in &textures_delta.set {
rpass.update_texture(&render_state.device, &render_state.queue, *id, image_delta);
renderer.update_texture(
&render_state.device,
&render_state.queue,
*id,
image_delta,
);
}

rpass.update_buffers(
renderer.update_buffers(
&render_state.device,
&render_state.queue,
clipped_primitives,
Expand All @@ -286,7 +290,7 @@ impl<'a> Painter<'a> {
}

// Record all render passes.
render_state.egui_rpass.read().execute(
render_state.renderer.read().render(
&mut encoder,
&output_view,
clipped_primitives,
Expand All @@ -300,9 +304,9 @@ impl<'a> Painter<'a> {
);

{
let mut rpass = render_state.egui_rpass.write();
let mut renderer = render_state.renderer.write();
for id in &textures_delta.free {
rpass.free_texture(id);
renderer.free_texture(id);
}
}

Expand Down
14 changes: 7 additions & 7 deletions crates/egui_demo_app/src/apps/custom3d_wgpu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ impl Custom3d {
// instead of storing the pipeline in our `Custom3D` struct, we insert it into the
// `paint_callback_resources` type map, which is stored alongside the render pass.
wgpu_render_state
.egui_rpass
.renderer
.write()
.paint_callback_resources
.insert(TriangleRenderResources {
Expand Down Expand Up @@ -142,9 +142,9 @@ impl Custom3d {
let resources: &TriangleRenderResources = paint_callback_resources.get().unwrap();
resources.prepare(device, queue, angle);
})
.paint(move |_info, rpass, paint_callback_resources| {
.paint(move |_info, render_pass, paint_callback_resources| {
let resources: &TriangleRenderResources = paint_callback_resources.get().unwrap();
resources.paint(rpass);
resources.paint(render_pass);
});

let callback = egui::PaintCallback {
Expand All @@ -168,10 +168,10 @@ impl TriangleRenderResources {
queue.write_buffer(&self.uniform_buffer, 0, bytemuck::cast_slice(&[angle]));
}

fn paint<'rpass>(&'rpass self, rpass: &mut wgpu::RenderPass<'rpass>) {
fn paint<'rp>(&'rp self, render_pass: &mut wgpu::RenderPass<'rp>) {
// Draw our triangle!
rpass.set_pipeline(&self.pipeline);
rpass.set_bind_group(0, &self.bind_group, &[]);
rpass.draw(0..3, 0..1);
render_pass.set_pipeline(&self.pipeline);
render_pass.set_bind_group(0, &self.bind_group, &[]);
render_pass.draw(0..3, 0..1);
}
}