diff options
Diffstat (limited to 'client/src')
-rw-r--r-- | client/src/interfaces/graphicsconfig.rs | 45 | ||||
-rw-r--r-- | client/src/render/mod.rs | 24 |
2 files changed, 55 insertions, 14 deletions
diff --git a/client/src/interfaces/graphicsconfig.rs b/client/src/interfaces/graphicsconfig.rs index 8832e8d..0021100 100644 --- a/client/src/interfaces/graphicsconfig.rs +++ b/client/src/interfaces/graphicsconfig.rs @@ -15,8 +15,9 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ use super::InterfaceData; -use egui::{Grid, Slider, Widget}; +use egui::{ComboBox, Grid, Slider, Widget}; use std::sync::Arc; +use wgpu::PresentMode; pub struct GraphicsConfigInterface { pub idata: Arc<InterfaceData>, @@ -27,11 +28,21 @@ impl Widget for &mut GraphicsConfigInterface { let mut conf = self.idata.graphics_config.lock().unwrap(); Grid::new("gconf").show(ui, |ui| { ui.label("Primitive Multisampling AA"); - ui.horizontal(|ui| { - ui.radio_value(&mut conf.1.sample_count, 1, "No MSAA"); - ui.radio_value(&mut conf.1.sample_count, 2, "MSAAx2"); - ui.radio_value(&mut conf.1.sample_count, 4, "MSAAx4"); - ui.radio_value(&mut conf.1.sample_count, 8, "MSAAx8"); + ui.vertical(|ui| { + ComboBox::from_id_salt("msaa") + .selected_text(match conf.1.sample_count { + 1 => "No MSAA", + 2 => "MSAAx2", + 4 => "MSAAx4", + 8 => "MSAAx8", + _ => unreachable!(), + }) + .show_ui(ui, |ui| { + ui.selectable_value(&mut conf.1.sample_count, 1, "No MSAA"); + ui.selectable_value(&mut conf.1.sample_count, 2, "MSAAx2"); + ui.selectable_value(&mut conf.1.sample_count, 4, "MSAAx4"); + ui.selectable_value(&mut conf.1.sample_count, 8, "MSAAx8"); + }); }); ui.end_row(); ui.label("Mipmap Levels"); @@ -40,6 +51,28 @@ impl Widget for &mut GraphicsConfigInterface { ui.label("Maximum Anisotropy"); ui.add(Slider::new(&mut conf.1.max_anisotropy, 1..=32).show_value(true)); ui.end_row(); + ui.label("Present Mode"); + ui.vertical(|ui| { + ComboBox::from_id_salt("pm") + .selected_text(format!("{:?}", conf.1.present_mode)) + .show_ui(ui, |ui| { + for mode in [ + PresentMode::AutoVsync, + PresentMode::AutoNoVsync, + PresentMode::Fifo, + PresentMode::FifoRelaxed, + PresentMode::Immediate, + PresentMode::Mailbox, + ] { + ui.selectable_value( + &mut conf.1.present_mode, + mode, + format!("{mode:?}"), + ); + } + }); + }); + ui.end_row(); }); if ui.button("Apply").clicked() { conf.0 = true; diff --git a/client/src/render/mod.rs b/client/src/render/mod.rs index a318d08..249e87f 100644 --- a/client/src/render/mod.rs +++ b/client/src/render/mod.rs @@ -35,7 +35,7 @@ use ui::UiRenderer; use weareshared::tree::SceneTree; use wgpu::{ AdapterInfo, Backends, CommandEncoderDescriptor, Device, DeviceDescriptor, Extent3d, Features, - Instance, InstanceDescriptor, Limits, MaintainBase, PowerPreference, Queue, + Instance, InstanceDescriptor, Limits, MaintainBase, PowerPreference, PresentMode, Queue, RequestAdapterOptions, Surface, SurfaceConfiguration, TextureDescriptor, TextureDimension, TextureFormat, TextureUsages, TextureView, TextureViewDescriptor, }; @@ -65,6 +65,7 @@ pub struct GraphicsConfig { pub max_anisotropy: u16, pub max_mip_count: u32, pub sample_count: u32, + pub present_mode: PresentMode, } impl<'a> Renderer<'a> { @@ -101,21 +102,23 @@ impl<'a> Renderer<'a> { ) .block_on()?; - let surface_configuration = surface + let config = GraphicsConfig { + max_anisotropy: 16, + max_mip_count: 16, + sample_count: 4, + present_mode: PresentMode::AutoVsync, + }; + + let mut surface_configuration = surface .get_default_config(&adapter, 256, 256) .ok_or(anyhow!("no default config"))?; + surface_configuration.present_mode = config.present_mode; surface.configure(&device, &surface_configuration); let device = Arc::new(device); let queue = Arc::new(queue); - let config = GraphicsConfig { - max_anisotropy: 16, - max_mip_count: 16, - sample_count: 4, - }; - let depth = device .create_texture(&TextureDescriptor { label: None, @@ -203,6 +206,11 @@ impl<'a> Renderer<'a> { info!("graphics configuration changed"); self.scene_prepare.reconfigure(&config); self.ui_renderer.reconfigure(&config); + if config.present_mode != self.surface_configuration.present_mode { + self.surface_configuration.present_mode = config.present_mode; + self.surface + .configure(&self.device, &self.surface_configuration); + } self.config = config; self.recreate_framebuffers(); } |