Browse Source

egui-wgpu: Support multisampling (#2878)

* Minimal implementation for egui wgpu multisampling support

* Update crates/egui-wgpu/CHANGELOG.md

Added pull request url

Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>

* Fixed cargo cranky error

---------

Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
pull/2908/head
Pēteris Pakalns 2 years ago
committed by GitHub
parent
commit
c86bfb6e67
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      crates/egui-wgpu/CHANGELOG.md
  2. 47
      crates/egui-wgpu/src/winit.rs

1
crates/egui-wgpu/CHANGELOG.md

@ -5,6 +5,7 @@ All notable changes to the `egui-wgpu` integration will be noted in this file.
## Unreleased ## Unreleased
* Add `read_screan_rgba` to the egui-wgpu `Painter`, to allow for capturing the current frame when using wgpu. Used in conjuction with `Frame::request_screenshot`. ([#2676](https://github.com/emilk/egui/pull/2676)) * Add `read_screan_rgba` to the egui-wgpu `Painter`, to allow for capturing the current frame when using wgpu. Used in conjuction with `Frame::request_screenshot`. ([#2676](https://github.com/emilk/egui/pull/2676))
* Improve performance of `update_buffers` ([#2820](https://github.com/emilk/egui/pull/2820)) * Improve performance of `update_buffers` ([#2820](https://github.com/emilk/egui/pull/2820))
* Added support for multisampling (MSAA) ([#2878](https://github.com/emilk/egui/pull/2878))
## 0.21.0 - 2023-02-08 ## 0.21.0 - 2023-02-08

47
crates/egui-wgpu/src/winit.rs

@ -81,6 +81,7 @@ pub struct Painter {
support_transparent_backbuffer: bool, support_transparent_backbuffer: bool,
depth_format: Option<wgpu::TextureFormat>, depth_format: Option<wgpu::TextureFormat>,
depth_texture_view: Option<wgpu::TextureView>, depth_texture_view: Option<wgpu::TextureView>,
msaa_texture_view: Option<wgpu::TextureView>,
screen_capture_state: Option<CaptureState>, screen_capture_state: Option<CaptureState>,
instance: wgpu::Instance, instance: wgpu::Instance,
@ -125,6 +126,7 @@ impl Painter {
adapter: None, adapter: None,
render_state: None, render_state: None,
surface_state: None, surface_state: None,
msaa_texture_view: None,
} }
} }
@ -272,7 +274,7 @@ impl Painter {
height: size.height, height: size.height,
alpha_mode, alpha_mode,
}); });
self.resize_and_generate_depth_texture_view(size.width, size.height); self.resize_and_generate_depth_texture_view_and_msaa_view(size.width, size.height);
} }
None => { None => {
self.surface_state = None; self.surface_state = None;
@ -292,7 +294,7 @@ impl Painter {
.map(|rs| rs.device.limits().max_texture_dimension_2d as usize) .map(|rs| rs.device.limits().max_texture_dimension_2d as usize)
} }
fn resize_and_generate_depth_texture_view( fn resize_and_generate_depth_texture_view_and_msaa_view(
&mut self, &mut self,
width_in_pixels: u32, width_in_pixels: u32,
height_in_pixels: u32, height_in_pixels: u32,
@ -325,11 +327,38 @@ impl Painter {
}) })
.create_view(&wgpu::TextureViewDescriptor::default()) .create_view(&wgpu::TextureViewDescriptor::default())
}); });
self.msaa_texture_view = (self.msaa_samples > 1)
.then_some(self.render_state.as_ref())
.flatten()
.map(|render_state| {
let texture_format = render_state.target_format;
render_state
.device
.create_texture(&wgpu::TextureDescriptor {
label: Some("egui_msaa_texture"),
size: wgpu::Extent3d {
width: width_in_pixels,
height: height_in_pixels,
depth_or_array_layers: 1,
},
mip_level_count: 1,
sample_count: self.msaa_samples,
dimension: wgpu::TextureDimension::D2,
format: texture_format,
usage: wgpu::TextureUsages::RENDER_ATTACHMENT,
view_formats: &[texture_format],
})
.create_view(&wgpu::TextureViewDescriptor::default())
});
} }
pub fn on_window_resized(&mut self, width_in_pixels: u32, height_in_pixels: u32) { pub fn on_window_resized(&mut self, width_in_pixels: u32, height_in_pixels: u32) {
if self.surface_state.is_some() { if self.surface_state.is_some() {
self.resize_and_generate_depth_texture_view(width_in_pixels, height_in_pixels); self.resize_and_generate_depth_texture_view_and_msaa_view(
width_in_pixels,
height_in_pixels,
);
} else { } else {
error!("Ignoring window resize notification with no surface created via Painter::set_window()"); error!("Ignoring window resize notification with no surface created via Painter::set_window()");
} }
@ -522,10 +551,18 @@ impl Painter {
.texture .texture
.create_view(&wgpu::TextureViewDescriptor::default()) .create_view(&wgpu::TextureViewDescriptor::default())
}; };
let (view, resolve_target) = (self.msaa_samples > 1)
.then_some(self.msaa_texture_view.as_ref())
.flatten()
.map_or((&frame_view, None), |texture_view| {
(texture_view, Some(&frame_view))
});
let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
color_attachments: &[Some(wgpu::RenderPassColorAttachment { color_attachments: &[Some(wgpu::RenderPassColorAttachment {
view: &frame_view, view,
resolve_target: None, resolve_target,
ops: wgpu::Operations { ops: wgpu::Operations {
load: wgpu::LoadOp::Clear(wgpu::Color { load: wgpu::LoadOp::Clear(wgpu::Color {
r: clear_color[0] as f64, r: clear_color[0] as f64,

Loading…
Cancel
Save