1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
pub mod diagnostic; pub mod renderer; mod wgpu_render_pass; mod wgpu_renderer; mod wgpu_resources; mod wgpu_type_converter; pub use wgpu_render_pass::*; pub use wgpu_renderer::*; pub use wgpu_resources::*; use bevy_app::prelude::*; use bevy_ecs::{IntoQuerySystem, IntoThreadLocalSystem, Resources, World}; use bevy_render::renderer::{free_shared_buffers_system, RenderResourceContext, SharedBuffers}; use renderer::WgpuRenderResourceContext; #[derive(Default)] pub struct WgpuPlugin; impl Plugin for WgpuPlugin { fn build(&self, app: &mut AppBuilder) { let render_system = wgpu_render_system(app.resources_mut()); app.add_system_to_stage( bevy_render::stage::RENDER, render_system.thread_local_system(), ) .add_system_to_stage( bevy_render::stage::POST_RENDER, free_shared_buffers_system.system(), ); } } pub fn wgpu_render_system(resources: &mut Resources) -> impl FnMut(&mut World, &mut Resources) { let mut wgpu_renderer = pollster::block_on(WgpuRenderer::new()); let resource_context = WgpuRenderResourceContext::new(wgpu_renderer.device.clone()); resources.insert::<Box<dyn RenderResourceContext>>(Box::new(resource_context.clone())); resources.insert(SharedBuffers::new(Box::new(resource_context))); move |world, resources| { wgpu_renderer.update(world, resources); } }