"Arc" device
This commit is contained in:
		
							parent
							
								
									d9b2324f08
								
							
						
					
					
						commit
						d8c748644c
					
				| @ -22,14 +22,13 @@ use bevy_render::{ | |||||||
| use bevy_window::{Window, WindowCreated, WindowResized, Windows}; | use bevy_window::{Window, WindowCreated, WindowResized, Windows}; | ||||||
| use legion::prelude::*; | use legion::prelude::*; | ||||||
| use std::{ | use std::{ | ||||||
|     cell::RefCell, |  | ||||||
|     collections::{HashMap, HashSet}, |     collections::{HashMap, HashSet}, | ||||||
|     ops::Deref, |     ops::Deref, | ||||||
|     rc::Rc, |     sync::Arc, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| pub struct WgpuRenderer { | pub struct WgpuRenderer { | ||||||
|     pub device: Rc<RefCell<wgpu::Device>>, |     pub device: Arc<wgpu::Device>, | ||||||
|     pub queue: wgpu::Queue, |     pub queue: wgpu::Queue, | ||||||
|     pub encoder: Option<wgpu::CommandEncoder>, |     pub encoder: Option<wgpu::CommandEncoder>, | ||||||
|     pub render_pipelines: HashMap<Handle<PipelineDescriptor>, wgpu::RenderPipeline>, |     pub render_pipelines: HashMap<Handle<PipelineDescriptor>, wgpu::RenderPipeline>, | ||||||
| @ -64,7 +63,7 @@ impl WgpuRenderer { | |||||||
|             .await; |             .await; | ||||||
| 
 | 
 | ||||||
|         WgpuRenderer { |         WgpuRenderer { | ||||||
|             device: Rc::new(RefCell::new(device)), |             device: Arc::new(device), | ||||||
|             queue, |             queue, | ||||||
|             encoder: None, |             encoder: None, | ||||||
|             window_resized_event_reader, |             window_resized_event_reader, | ||||||
| @ -223,7 +222,6 @@ impl WgpuRenderer { | |||||||
|     pub fn initialize_resource_providers(&mut self, world: &mut World, resources: &mut Resources) { |     pub fn initialize_resource_providers(&mut self, world: &mut World, resources: &mut Resources) { | ||||||
|         self.encoder = Some( |         self.encoder = Some( | ||||||
|             self.device |             self.device | ||||||
|                 .borrow() |  | ||||||
|                 .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }), |                 .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }), | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
| @ -314,7 +312,6 @@ impl WgpuRenderer { | |||||||
|         let swap_chain_descriptor: wgpu::SwapChainDescriptor = window.wgpu_into(); |         let swap_chain_descriptor: wgpu::SwapChainDescriptor = window.wgpu_into(); | ||||||
|         let swap_chain = self |         let swap_chain = self | ||||||
|             .device |             .device | ||||||
|             .borrow() |  | ||||||
|             .create_swap_chain(surface, &swap_chain_descriptor); |             .create_swap_chain(surface, &swap_chain_descriptor); | ||||||
|         self.wgpu_resources |         self.wgpu_resources | ||||||
|             .window_swap_chains |             .window_swap_chains | ||||||
| @ -359,7 +356,6 @@ impl Renderer for WgpuRenderer { | |||||||
|         // exposing the wgpu renderer internals to ResourceProvider traits. if this can be made cleaner that would be pretty cool.
 |         // exposing the wgpu renderer internals to ResourceProvider traits. if this can be made cleaner that would be pretty cool.
 | ||||||
|         self.encoder = Some( |         self.encoder = Some( | ||||||
|             self.device |             self.device | ||||||
|                 .borrow() |  | ||||||
|                 .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }), |                 .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }), | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
| @ -434,12 +430,12 @@ impl Renderer for WgpuRenderer { | |||||||
| 
 | 
 | ||||||
|     fn create_buffer_with_data(&mut self, buffer_info: BufferInfo, data: &[u8]) -> RenderResource { |     fn create_buffer_with_data(&mut self, buffer_info: BufferInfo, data: &[u8]) -> RenderResource { | ||||||
|         self.wgpu_resources |         self.wgpu_resources | ||||||
|             .create_buffer_with_data(&self.device.borrow(), buffer_info, data) |             .create_buffer_with_data(&self.device, buffer_info, data) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn create_buffer(&mut self, buffer_info: BufferInfo) -> RenderResource { |     fn create_buffer(&mut self, buffer_info: BufferInfo) -> RenderResource { | ||||||
|         self.wgpu_resources |         self.wgpu_resources | ||||||
|             .create_buffer(&self.device.borrow(), buffer_info) |             .create_buffer(&self.device, buffer_info) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn get_resource_info(&self, resource: RenderResource) -> Option<&ResourceInfo> { |     fn get_resource_info(&self, resource: RenderResource) -> Option<&ResourceInfo> { | ||||||
| @ -483,7 +479,7 @@ impl Renderer for WgpuRenderer { | |||||||
| 
 | 
 | ||||||
|     fn create_sampler(&mut self, sampler_descriptor: &SamplerDescriptor) -> RenderResource { |     fn create_sampler(&mut self, sampler_descriptor: &SamplerDescriptor) -> RenderResource { | ||||||
|         self.wgpu_resources |         self.wgpu_resources | ||||||
|             .create_sampler(&self.device.borrow(), sampler_descriptor) |             .create_sampler(&self.device, sampler_descriptor) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn create_texture( |     fn create_texture( | ||||||
| @ -492,7 +488,7 @@ impl Renderer for WgpuRenderer { | |||||||
|         bytes: Option<&[u8]>, |         bytes: Option<&[u8]>, | ||||||
|     ) -> RenderResource { |     ) -> RenderResource { | ||||||
|         self.wgpu_resources.create_texture( |         self.wgpu_resources.create_texture( | ||||||
|             &self.device.borrow(), |             &self.device, | ||||||
|             self.encoder.as_mut().unwrap(), |             self.encoder.as_mut().unwrap(), | ||||||
|             texture_descriptor, |             texture_descriptor, | ||||||
|             bytes, |             bytes, | ||||||
| @ -530,7 +526,7 @@ impl Renderer for WgpuRenderer { | |||||||
|                     .get_bind_group(bind_group.id, render_resource_set_id) |                     .get_bind_group(bind_group.id, render_resource_set_id) | ||||||
|                 { |                 { | ||||||
|                     self.wgpu_resources.create_bind_group( |                     self.wgpu_resources.create_bind_group( | ||||||
|                         &self.device.borrow(), |                         &self.device, | ||||||
|                         bind_group, |                         bind_group, | ||||||
|                         render_resource_assignments, |                         render_resource_assignments, | ||||||
|                     ); |                     ); | ||||||
| @ -555,7 +551,6 @@ impl Renderer for WgpuRenderer { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         let device = self.device.borrow(); |  | ||||||
|         let layout = pipeline_descriptor.get_layout().unwrap(); |         let layout = pipeline_descriptor.get_layout().unwrap(); | ||||||
|         for bind_group in layout.bind_groups.iter() { |         for bind_group in layout.bind_groups.iter() { | ||||||
|             if let None = self.wgpu_resources.bind_group_layouts.get(&bind_group.id) { |             if let None = self.wgpu_resources.bind_group_layouts.get(&bind_group.id) { | ||||||
| @ -569,7 +564,7 @@ impl Renderer for WgpuRenderer { | |||||||
|                     }) |                     }) | ||||||
|                     .collect::<Vec<wgpu::BindGroupLayoutEntry>>(); |                     .collect::<Vec<wgpu::BindGroupLayoutEntry>>(); | ||||||
|                 let wgpu_bind_group_layout = |                 let wgpu_bind_group_layout = | ||||||
|                     device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { |                     self.device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { | ||||||
|                         bindings: bind_group_layout_binding.as_slice(), |                         bindings: bind_group_layout_binding.as_slice(), | ||||||
|                         label: None, |                         label: None, | ||||||
|                     }); |                     }); | ||||||
| @ -592,7 +587,7 @@ impl Renderer for WgpuRenderer { | |||||||
|             }) |             }) | ||||||
|             .collect::<Vec<&wgpu::BindGroupLayout>>(); |             .collect::<Vec<&wgpu::BindGroupLayout>>(); | ||||||
| 
 | 
 | ||||||
|         let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { |         let pipeline_layout = self.device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { | ||||||
|             bind_group_layouts: bind_group_layouts.as_slice(), |             bind_group_layouts: bind_group_layouts.as_slice(), | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
| @ -614,7 +609,7 @@ impl Renderer for WgpuRenderer { | |||||||
|             .get(&pipeline_descriptor.shader_stages.vertex) |             .get(&pipeline_descriptor.shader_stages.vertex) | ||||||
|         { |         { | ||||||
|             self.wgpu_resources.create_shader_module( |             self.wgpu_resources.create_shader_module( | ||||||
|                 &device, |                 &self.device, | ||||||
|                 pipeline_descriptor.shader_stages.vertex, |                 pipeline_descriptor.shader_stages.vertex, | ||||||
|                 shader_storage, |                 shader_storage, | ||||||
|             ); |             ); | ||||||
| @ -623,7 +618,7 @@ impl Renderer for WgpuRenderer { | |||||||
|         if let Some(fragment_handle) = pipeline_descriptor.shader_stages.fragment { |         if let Some(fragment_handle) = pipeline_descriptor.shader_stages.fragment { | ||||||
|             if let None = self.wgpu_resources.shader_modules.get(&fragment_handle) { |             if let None = self.wgpu_resources.shader_modules.get(&fragment_handle) { | ||||||
|                 self.wgpu_resources |                 self.wgpu_resources | ||||||
|                     .create_shader_module(&device, fragment_handle, shader_storage); |                     .create_shader_module(&self.device, fragment_handle, shader_storage); | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
| @ -678,7 +673,7 @@ impl Renderer for WgpuRenderer { | |||||||
|             alpha_to_coverage_enabled: pipeline_descriptor.alpha_to_coverage_enabled, |             alpha_to_coverage_enabled: pipeline_descriptor.alpha_to_coverage_enabled, | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         let render_pipeline = device.create_render_pipeline(&mut render_pipeline_descriptor); |         let render_pipeline = self.device.create_render_pipeline(&mut render_pipeline_descriptor); | ||||||
|         self.render_pipelines |         self.render_pipelines | ||||||
|             .insert(pipeline_handle, render_pipeline); |             .insert(pipeline_handle, render_pipeline); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -197,9 +197,7 @@ impl WgpuResources { | |||||||
|         renderer: &mut WgpuRenderer, |         renderer: &mut WgpuRenderer, | ||||||
|         setup_data: &mut dyn FnMut(&mut [u8], &mut dyn Renderer), |         setup_data: &mut dyn FnMut(&mut [u8], &mut dyn Renderer), | ||||||
|     ) -> wgpu::Buffer { |     ) -> wgpu::Buffer { | ||||||
|         let device_rc = renderer.device.clone(); |         let device = renderer.device.clone(); | ||||||
|         let device = device_rc.borrow(); |  | ||||||
| 
 |  | ||||||
|         let mut mapped = device.create_buffer_mapped( |         let mut mapped = device.create_buffer_mapped( | ||||||
|             &wgpu::BufferDescriptor { |             &wgpu::BufferDescriptor { | ||||||
|                 size: buffer_info.size as u64, |                 size: buffer_info.size as u64, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Carter Anderson
						Carter Anderson