From dc0f5891cf40362f97a6d65d7ca7699098a844ed Mon Sep 17 00:00:00 2001 From: ira Date: Tue, 20 Dec 2022 16:17:11 +0000 Subject: [PATCH] Move 'startup' Resource `WgpuSettings` into the `RenderPlugin` (#6946) # Objective The `WgpuSettings` resource is only used during plugin build. Move it into the `RenderPlugin` struct. Changing these settings requires re-initializing the render context, which is currently not supported. If it is supported in the future it should probably be more explicit than changing a field on a resource, maybe something similar to the `CreateWindow` event. ## Migration Guide ```rust // Before (0.9) App::new() .insert_resource(WgpuSettings { .. }) .add_plugins(DefaultPlugins) // After (0.10) App::new() .add_plugins(DefaultPlugins.set(RenderPlugin { wgpu_settings: WgpuSettings { .. }, })) ``` Co-authored-by: devil-ira --- crates/bevy_render/src/lib.rs | 24 ++++++++++++------------ crates/bevy_render/src/settings.rs | 3 +-- examples/3d/wireframe.rs | 13 +++++++------ examples/android/src/lib.rs | 20 ++++++++++++-------- examples/app/no_renderer.rs | 16 ++++++++++------ 5 files changed, 42 insertions(+), 34 deletions(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index 5cef409d2b809..87409f4e98b4d 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -48,6 +48,7 @@ use crate::{ prelude::ComputedVisibility, render_resource::{PipelineCache, Shader, ShaderLoader}, renderer::{render_system, RenderInstance}, + settings::WgpuSettings, view::{ViewPlugin, WindowRenderPlugin}, }; use bevy_app::{App, AppLabel, Plugin}; @@ -61,7 +62,9 @@ use std::{ /// Contains the default Bevy rendering backend based on wgpu. #[derive(Default)] -pub struct RenderPlugin; +pub struct RenderPlugin { + pub wgpu_settings: WgpuSettings, +} /// The labels of the default App rendering stages. #[derive(Debug, Hash, PartialEq, Eq, Clone, StageLabel)] @@ -129,18 +132,12 @@ pub struct RenderApp; impl Plugin for RenderPlugin { /// Initializes the renderer, sets up the [`RenderStage`](RenderStage) and creates the rendering sub-app. fn build(&self, app: &mut App) { - let options = app - .world - .get_resource::() - .cloned() - .unwrap_or_default(); - app.add_asset::() .add_debug_asset::() .init_asset_loader::() .init_debug_asset_loader::(); - if let Some(backends) = options.backends { + if let Some(backends) = self.wgpu_settings.backends { let windows = app.world.resource_mut::(); let instance = wgpu::Instance::new(backends); @@ -153,13 +150,16 @@ impl Plugin for RenderPlugin { }); let request_adapter_options = wgpu::RequestAdapterOptions { - power_preference: options.power_preference, + power_preference: self.wgpu_settings.power_preference, compatible_surface: surface.as_ref(), ..Default::default() }; - let (device, queue, adapter_info, render_adapter) = futures_lite::future::block_on( - renderer::initialize_renderer(&instance, &options, &request_adapter_options), - ); + let (device, queue, adapter_info, render_adapter) = + futures_lite::future::block_on(renderer::initialize_renderer( + &instance, + &self.wgpu_settings, + &request_adapter_options, + )); debug!("Configured wgpu adapter Limits: {:#?}", device.limits()); debug!("Configured wgpu adapter Features: {:#?}", device.features()); app.insert_resource(device.clone()) diff --git a/crates/bevy_render/src/settings.rs b/crates/bevy_render/src/settings.rs index 52c15fad7720b..b65c878cee8d6 100644 --- a/crates/bevy_render/src/settings.rs +++ b/crates/bevy_render/src/settings.rs @@ -1,6 +1,5 @@ use std::borrow::Cow; -use bevy_ecs::system::Resource; pub use wgpu::{Backends, Features as WgpuFeatures, Limits as WgpuLimits, PowerPreference}; /// Configures the priority used when automatically configuring the features/limits of `wgpu`. @@ -23,7 +22,7 @@ pub enum WgpuSettingsPriority { /// NOTE: If you want to use [`Backends::GL`](Backends::GL) in a native app on Windows, you must /// use [`ANGLE`](https://github.com/gfx-rs/wgpu#angle). This is because wgpu requires EGL to /// create a GL context without a window and only ANGLE supports that. -#[derive(Resource, Clone)] +#[derive(Clone)] pub struct WgpuSettings { pub device_label: Option>, pub backends: Option, diff --git a/examples/3d/wireframe.rs b/examples/3d/wireframe.rs index c20757e5b538f..ef7599eda57c5 100644 --- a/examples/3d/wireframe.rs +++ b/examples/3d/wireframe.rs @@ -3,16 +3,17 @@ use bevy::{ pbr::wireframe::{Wireframe, WireframeConfig, WireframePlugin}, prelude::*, - render::{render_resource::WgpuFeatures, settings::WgpuSettings}, + render::{render_resource::WgpuFeatures, settings::WgpuSettings, RenderPlugin}, }; fn main() { App::new() - .insert_resource(WgpuSettings { - features: WgpuFeatures::POLYGON_MODE_LINE, - ..default() - }) - .add_plugins(DefaultPlugins) + .add_plugins(DefaultPlugins.set(RenderPlugin { + wgpu_settings: WgpuSettings { + features: WgpuFeatures::POLYGON_MODE_LINE, + ..default() + }, + })) .add_plugin(WireframePlugin) .add_startup_system(setup) .run(); diff --git a/examples/android/src/lib.rs b/examples/android/src/lib.rs index 6db1cae703397..244027265a2cf 100644 --- a/examples/android/src/lib.rs +++ b/examples/android/src/lib.rs @@ -1,19 +1,23 @@ use bevy::{ prelude::*, - render::settings::{WgpuSettings, WgpuSettingsPriority}, + render::{ + settings::{WgpuSettings, WgpuSettingsPriority}, + RenderPlugin, + }, }; // the `bevy_main` proc_macro generates the required android boilerplate #[bevy_main] fn main() { App::new() - // This configures the app to use the most compatible rendering settings. - // They help with compatibility with as many devices as possible. - .insert_resource(WgpuSettings { - priority: WgpuSettingsPriority::Compatibility, - ..default() - }) - .add_plugins(DefaultPlugins) + .add_plugins(DefaultPlugins.set(RenderPlugin { + // This configures the app to use the most compatible rendering settings. + // They help with compatibility with as many devices as possible. + wgpu_settings: WgpuSettings { + priority: WgpuSettingsPriority::Compatibility, + ..default() + }, + })) .add_startup_system(setup) .run(); } diff --git a/examples/app/no_renderer.rs b/examples/app/no_renderer.rs index ef6ef38c976db..2c892e4b123fd 100644 --- a/examples/app/no_renderer.rs +++ b/examples/app/no_renderer.rs @@ -4,14 +4,18 @@ //! //! See also the `headless` example which does not display a window. -use bevy::{prelude::*, render::settings::WgpuSettings}; +use bevy::{ + prelude::*, + render::{settings::WgpuSettings, RenderPlugin}, +}; fn main() { App::new() - .insert_resource(WgpuSettings { - backends: None, - ..default() - }) - .add_plugins(DefaultPlugins) + .add_plugins(DefaultPlugins.set(RenderPlugin { + wgpu_settings: WgpuSettings { + backends: None, + ..default() + }, + })) .run(); }