cleanup bevy_render/lib.rs (#16481)
# Objective - Refactor ## Solution - Refactor ## Testing - Ran 3d_scene --- ## Migration Guide `RenderCreation::Manual` variant fields are now wrapped in a struct called `RenderResources`
This commit is contained in:
parent
28efc1401a
commit
636e99c9fb
@ -76,7 +76,8 @@ use bevy_window::{PrimaryWindow, RawHandleWrapperHolder};
|
||||
use extract_resource::ExtractResourcePlugin;
|
||||
use globals::GlobalsPlugin;
|
||||
use render_asset::RenderAssetBytesPerFrame;
|
||||
use renderer::{RenderAdapter, RenderAdapterInfo, RenderDevice, RenderQueue};
|
||||
use renderer::{RenderDevice, RenderQueue};
|
||||
use settings::RenderResources;
|
||||
use sync_world::{
|
||||
despawn_temporary_render_entities, entity_sync_system, SyncToRenderWorld, SyncWorldPlugin,
|
||||
};
|
||||
@ -95,7 +96,7 @@ use crate::{
|
||||
use alloc::sync::Arc;
|
||||
use bevy_app::{App, AppLabel, Plugin, SubApp};
|
||||
use bevy_asset::{load_internal_asset, AssetApp, AssetServer, Handle};
|
||||
use bevy_ecs::{prelude::*, schedule::ScheduleLabel, system::SystemState};
|
||||
use bevy_ecs::{prelude::*, schedule::ScheduleLabel};
|
||||
use bevy_utils::tracing::debug;
|
||||
use core::ops::{Deref, DerefMut};
|
||||
use std::sync::Mutex;
|
||||
@ -240,19 +241,7 @@ pub mod graph {
|
||||
}
|
||||
|
||||
#[derive(Resource)]
|
||||
struct FutureRendererResources(
|
||||
Arc<
|
||||
Mutex<
|
||||
Option<(
|
||||
RenderDevice,
|
||||
RenderQueue,
|
||||
RenderAdapterInfo,
|
||||
RenderAdapter,
|
||||
RenderInstance,
|
||||
)>,
|
||||
>,
|
||||
>,
|
||||
);
|
||||
struct FutureRenderResources(Arc<Mutex<Option<RenderResources>>>);
|
||||
|
||||
/// A label for the rendering sub-app.
|
||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, AppLabel)]
|
||||
@ -271,31 +260,27 @@ impl Plugin for RenderPlugin {
|
||||
.init_asset_loader::<ShaderLoader>();
|
||||
|
||||
match &self.render_creation {
|
||||
RenderCreation::Manual(device, queue, adapter_info, adapter, instance) => {
|
||||
let future_renderer_resources_wrapper = Arc::new(Mutex::new(Some((
|
||||
device.clone(),
|
||||
queue.clone(),
|
||||
adapter_info.clone(),
|
||||
adapter.clone(),
|
||||
instance.clone(),
|
||||
))));
|
||||
app.insert_resource(FutureRendererResources(
|
||||
future_renderer_resources_wrapper.clone(),
|
||||
RenderCreation::Manual(resources) => {
|
||||
let future_render_resources_wrapper = Arc::new(Mutex::new(Some(resources.clone())));
|
||||
app.insert_resource(FutureRenderResources(
|
||||
future_render_resources_wrapper.clone(),
|
||||
));
|
||||
// SAFETY: Plugins should be set up on the main thread.
|
||||
unsafe { initialize_render_app(app) };
|
||||
}
|
||||
RenderCreation::Automatic(render_creation) => {
|
||||
if let Some(backends) = render_creation.backends {
|
||||
let future_renderer_resources_wrapper = Arc::new(Mutex::new(None));
|
||||
app.insert_resource(FutureRendererResources(
|
||||
future_renderer_resources_wrapper.clone(),
|
||||
let future_render_resources_wrapper = Arc::new(Mutex::new(None));
|
||||
app.insert_resource(FutureRenderResources(
|
||||
future_render_resources_wrapper.clone(),
|
||||
));
|
||||
|
||||
let mut system_state: SystemState<
|
||||
Query<&RawHandleWrapperHolder, With<PrimaryWindow>>,
|
||||
> = SystemState::new(app.world_mut());
|
||||
let primary_window = system_state.get(app.world()).get_single().ok().cloned();
|
||||
let primary_window = app
|
||||
.world_mut()
|
||||
.query_filtered::<&RawHandleWrapperHolder, With<PrimaryWindow>>()
|
||||
.get_single(app.world())
|
||||
.ok()
|
||||
.cloned();
|
||||
let settings = render_creation.clone();
|
||||
let async_renderer = async move {
|
||||
let instance = wgpu::Instance::new(wgpu::InstanceDescriptor {
|
||||
@ -305,13 +290,13 @@ impl Plugin for RenderPlugin {
|
||||
gles_minor_version: settings.gles3_minor_version,
|
||||
});
|
||||
|
||||
// SAFETY: Plugins should be set up on the main thread.
|
||||
let surface = primary_window.and_then(|wrapper| unsafe {
|
||||
let surface = primary_window.and_then(|wrapper| {
|
||||
let maybe_handle = wrapper.0.lock().expect(
|
||||
"Couldn't get the window handle in time for renderer initialization",
|
||||
);
|
||||
if let Some(wrapper) = maybe_handle.as_ref() {
|
||||
let handle = wrapper.get_handle();
|
||||
// SAFETY: Plugins should be set up on the main thread.
|
||||
let handle = unsafe { wrapper.get_handle() };
|
||||
Some(
|
||||
instance
|
||||
.create_surface(handle)
|
||||
@ -337,9 +322,9 @@ impl Plugin for RenderPlugin {
|
||||
.await;
|
||||
debug!("Configured wgpu adapter Limits: {:#?}", device.limits());
|
||||
debug!("Configured wgpu adapter Features: {:#?}", device.features());
|
||||
let mut future_renderer_resources_inner =
|
||||
future_renderer_resources_wrapper.lock().unwrap();
|
||||
*future_renderer_resources_inner = Some((
|
||||
let mut future_render_resources_inner =
|
||||
future_render_resources_wrapper.lock().unwrap();
|
||||
*future_render_resources_inner = Some(RenderResources(
|
||||
device,
|
||||
queue,
|
||||
adapter_info,
|
||||
@ -391,7 +376,7 @@ impl Plugin for RenderPlugin {
|
||||
|
||||
fn ready(&self, app: &App) -> bool {
|
||||
app.world()
|
||||
.get_resource::<FutureRendererResources>()
|
||||
.get_resource::<FutureRenderResources>()
|
||||
.and_then(|frr| frr.0.try_lock().map(|locked| locked.is_some()).ok())
|
||||
.unwrap_or(true)
|
||||
}
|
||||
@ -404,11 +389,11 @@ impl Plugin for RenderPlugin {
|
||||
"color_operations.wgsl",
|
||||
Shader::from_wgsl
|
||||
);
|
||||
if let Some(future_renderer_resources) =
|
||||
app.world_mut().remove_resource::<FutureRendererResources>()
|
||||
if let Some(future_render_resources) =
|
||||
app.world_mut().remove_resource::<FutureRenderResources>()
|
||||
{
|
||||
let (device, queue, adapter_info, render_adapter, instance) =
|
||||
future_renderer_resources.0.lock().unwrap().take().unwrap();
|
||||
let RenderResources(device, queue, adapter_info, render_adapter, instance) =
|
||||
future_render_resources.0.lock().unwrap().take().unwrap();
|
||||
|
||||
app.insert_resource(device.clone())
|
||||
.insert_resource(queue.clone())
|
||||
|
||||
@ -124,16 +124,19 @@ impl Default for WgpuSettings {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct RenderResources(
|
||||
pub RenderDevice,
|
||||
pub RenderQueue,
|
||||
pub RenderAdapterInfo,
|
||||
pub RenderAdapter,
|
||||
pub RenderInstance,
|
||||
);
|
||||
|
||||
/// An enum describing how the renderer will initialize resources. This is used when creating the [`RenderPlugin`](crate::RenderPlugin).
|
||||
pub enum RenderCreation {
|
||||
/// Allows renderer resource initialization to happen outside of the rendering plugin.
|
||||
Manual(
|
||||
RenderDevice,
|
||||
RenderQueue,
|
||||
RenderAdapterInfo,
|
||||
RenderAdapter,
|
||||
RenderInstance,
|
||||
),
|
||||
Manual(RenderResources),
|
||||
/// Lets the rendering plugin create resources itself.
|
||||
Automatic(WgpuSettings),
|
||||
}
|
||||
@ -147,7 +150,13 @@ impl RenderCreation {
|
||||
adapter: RenderAdapter,
|
||||
instance: RenderInstance,
|
||||
) -> Self {
|
||||
Self::Manual(device, queue, adapter_info, adapter, instance)
|
||||
RenderResources(device, queue, adapter_info, adapter, instance).into()
|
||||
}
|
||||
}
|
||||
|
||||
impl From<RenderResources> for RenderCreation {
|
||||
fn from(value: RenderResources) -> Self {
|
||||
Self::Manual(value)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user