initial multi-threaded resource creation using WgpuRenderContext
This commit is contained in:
		
							parent
							
								
									d8c748644c
								
							
						
					
					
						commit
						a7605b2d7a
					
				| @ -3,6 +3,8 @@ mod camera; | |||||||
| pub mod entity; | pub mod entity; | ||||||
| pub mod mesh; | pub mod mesh; | ||||||
| pub mod render_graph; | pub mod render_graph; | ||||||
|  | pub mod render_graph_2; | ||||||
|  | pub mod renderer_2; | ||||||
| pub mod shader; | pub mod shader; | ||||||
| 
 | 
 | ||||||
| mod color; | mod color; | ||||||
|  | |||||||
							
								
								
									
										0
									
								
								bevy_render/src/render_graph_2/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								bevy_render/src/render_graph_2/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @ -1,9 +1,17 @@ | |||||||
| use crate::{mesh::Mesh, texture::Texture}; | use crate::{mesh::Mesh, texture::Texture}; | ||||||
| use bevy_asset::Handle; | use bevy_asset::Handle; | ||||||
| use std::collections::HashMap; | use std::collections::HashMap; | ||||||
|  | use uuid::Uuid; | ||||||
| 
 | 
 | ||||||
|  | // TODO: Rename to RenderResourceId
 | ||||||
| #[derive(Copy, Clone, Hash, Debug, Eq, PartialEq)] | #[derive(Copy, Clone, Hash, Debug, Eq, PartialEq)] | ||||||
| pub struct RenderResource(pub u64); | pub struct RenderResource(Uuid); | ||||||
|  | 
 | ||||||
|  | impl RenderResource { | ||||||
|  |     pub fn new() -> Self { | ||||||
|  |         RenderResource(Uuid::new_v4()) | ||||||
|  |     } | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| // TODO: consider scoping breaking these mappings up by type: Texture, Sampler, etc
 | // TODO: consider scoping breaking these mappings up by type: Texture, Sampler, etc
 | ||||||
| // the overlap could cause accidents.
 | // the overlap could cause accidents.
 | ||||||
| @ -13,7 +21,6 @@ pub struct RenderResources { | |||||||
|     pub texture_to_sampler_resource: HashMap<Handle<Texture>, RenderResource>, |     pub texture_to_sampler_resource: HashMap<Handle<Texture>, RenderResource>, | ||||||
|     pub mesh_to_vertices_resource: HashMap<Handle<Mesh>, RenderResource>, |     pub mesh_to_vertices_resource: HashMap<Handle<Mesh>, RenderResource>, | ||||||
|     pub mesh_to_indices_resource: HashMap<Handle<Mesh>, RenderResource>, |     pub mesh_to_indices_resource: HashMap<Handle<Mesh>, RenderResource>, | ||||||
|     pub resource_index: u64, |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl RenderResources { | impl RenderResources { | ||||||
| @ -52,11 +59,4 @@ impl RenderResources { | |||||||
|     pub fn get_texture_sampler_resource(&self, texture: Handle<Texture>) -> Option<RenderResource> { |     pub fn get_texture_sampler_resource(&self, texture: Handle<Texture>) -> Option<RenderResource> { | ||||||
|         self.texture_to_sampler_resource.get(&texture).cloned() |         self.texture_to_sampler_resource.get(&texture).cloned() | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     pub fn get_next_resource(&mut self) -> RenderResource { |  | ||||||
|         let resource = self.resource_index; |  | ||||||
|         self.resource_index += 1; |  | ||||||
| 
 |  | ||||||
|         RenderResource(resource) |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								bevy_render/src/renderer_2/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								bevy_render/src/renderer_2/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | mod render_context; | ||||||
|  | 
 | ||||||
|  | pub use render_context::*; | ||||||
							
								
								
									
										61
									
								
								bevy_render/src/renderer_2/render_context.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								bevy_render/src/renderer_2/render_context.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | |||||||
|  | use crate::{ | ||||||
|  |     render_resource::{ | ||||||
|  |         BufferInfo, RenderResource, RenderResources, ResourceInfo, | ||||||
|  |     }, | ||||||
|  |     texture::{SamplerDescriptor, TextureDescriptor}, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | pub trait RenderContext { | ||||||
|  |     fn create_sampler(&mut self, sampler_descriptor: &SamplerDescriptor) -> RenderResource; | ||||||
|  |     fn create_texture( | ||||||
|  |         &mut self, | ||||||
|  |         texture_descriptor: &TextureDescriptor, | ||||||
|  |     ) -> RenderResource; | ||||||
|  |     fn create_buffer(&mut self, buffer_info: BufferInfo) -> RenderResource; | ||||||
|  |     fn create_buffer_mapped( | ||||||
|  |         &mut self, | ||||||
|  |         buffer_info: BufferInfo, | ||||||
|  |         setup_data: &mut dyn FnMut(&mut [u8], &mut dyn RenderContext), | ||||||
|  |     ) -> RenderResource; | ||||||
|  |     fn create_buffer_with_data(&mut self, buffer_info: BufferInfo, data: &[u8]) -> RenderResource; | ||||||
|  |     fn remove_buffer(&mut self, resource: RenderResource); | ||||||
|  |     fn remove_texture(&mut self, resource: RenderResource); | ||||||
|  |     fn remove_sampler(&mut self, resource: RenderResource); | ||||||
|  |     fn get_resource_info(&self, resource: RenderResource) -> Option<&ResourceInfo>; | ||||||
|  |     fn get_resource_info_mut(&mut self, resource: RenderResource) -> Option<&mut ResourceInfo>; | ||||||
|  |     fn render_resources(&self) -> &RenderResources; | ||||||
|  |     fn render_resources_mut(&mut self) -> &mut RenderResources; | ||||||
|  |     // fn setup_render_pipeline(
 | ||||||
|  |     //     &mut self,
 | ||||||
|  |     //     pipeline_handle: Handle<PipelineDescriptor>,
 | ||||||
|  |     //     pipeline_descriptor: &mut PipelineDescriptor,
 | ||||||
|  |     //     shader_storage: &AssetStorage<Shader>,
 | ||||||
|  |     // );
 | ||||||
|  |     // fn setup_bind_groups(
 | ||||||
|  |     //     &mut self,
 | ||||||
|  |     //     render_resource_assignments: &mut RenderResourceAssignments,
 | ||||||
|  |     //     pipeline_descriptor: &PipelineDescriptor,
 | ||||||
|  |     // );
 | ||||||
|  | 
 | ||||||
|  |     fn create_texture_with_data( | ||||||
|  |         &mut self, | ||||||
|  |         texture_descriptor: &TextureDescriptor, | ||||||
|  |         bytes: Option<&[u8]>, | ||||||
|  |     ) -> RenderResource; | ||||||
|  |     fn copy_buffer_to_buffer( | ||||||
|  |         &mut self, | ||||||
|  |         source_buffer: RenderResource, | ||||||
|  |         source_offset: u64, | ||||||
|  |         destination_buffer: RenderResource, | ||||||
|  |         destination_offset: u64, | ||||||
|  |         size: u64, | ||||||
|  |     ); | ||||||
|  |     // fn copy_buffer_to_texture(
 | ||||||
|  |     //     &mut self,
 | ||||||
|  |     //     source_buffer: RenderResource,
 | ||||||
|  |     //     source_offset: u64,
 | ||||||
|  |     //     destination_buffer: RenderResource,
 | ||||||
|  |     //     destination_offset: u64,
 | ||||||
|  |     //     size: u64,
 | ||||||
|  |     // );
 | ||||||
|  | } | ||||||
| @ -23,3 +23,4 @@ wgpu = { version = "0.5.0" } | |||||||
| 
 | 
 | ||||||
| futures = "0.3" | futures = "0.3" | ||||||
| log = { version = "0.4", features = ["release_max_level_info"] } | log = { version = "0.4", features = ["release_max_level_info"] } | ||||||
|  | crossbeam-channel = "0.4.2" | ||||||
| @ -2,6 +2,7 @@ mod wgpu_render_pass; | |||||||
| mod wgpu_renderer; | mod wgpu_renderer; | ||||||
| mod wgpu_resources; | mod wgpu_resources; | ||||||
| mod wgpu_type_converter; | mod wgpu_type_converter; | ||||||
|  | pub mod renderer_2; | ||||||
| 
 | 
 | ||||||
| pub use wgpu_render_pass::*; | pub use wgpu_render_pass::*; | ||||||
| pub use wgpu_renderer::*; | pub use wgpu_renderer::*; | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								bevy_wgpu/src/renderer_2/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								bevy_wgpu/src/renderer_2/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | mod wgpu_render_context; | ||||||
|  | 
 | ||||||
|  | pub use wgpu_render_context::*; | ||||||
							
								
								
									
										133
									
								
								bevy_wgpu/src/renderer_2/wgpu_render_context.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								bevy_wgpu/src/renderer_2/wgpu_render_context.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,133 @@ | |||||||
|  | use crate::WgpuResources; | ||||||
|  | 
 | ||||||
|  | use bevy_render::{ | ||||||
|  |     render_resource::{BufferInfo, RenderResource, RenderResources, ResourceInfo}, | ||||||
|  |     renderer_2::RenderContext, | ||||||
|  |     texture::{SamplerDescriptor, TextureDescriptor}, | ||||||
|  | }; | ||||||
|  | use std::sync::Arc; | ||||||
|  | 
 | ||||||
|  | #[derive(Default)] | ||||||
|  | struct LazyCommandEncoder { | ||||||
|  |     command_encoder: Option<wgpu::CommandEncoder>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl LazyCommandEncoder { | ||||||
|  |     pub fn get_or_create(&mut self, device: &wgpu::Device) -> &mut wgpu::CommandEncoder { | ||||||
|  |         match self.command_encoder { | ||||||
|  |             Some(ref mut command_encoder) => command_encoder, | ||||||
|  |             None => { | ||||||
|  |                 let command_encoder = | ||||||
|  |                     device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); | ||||||
|  |                 self.command_encoder = Some(command_encoder); | ||||||
|  |                 self.command_encoder.as_mut().unwrap() | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn take(&mut self) -> Option<wgpu::CommandEncoder> { | ||||||
|  |         self.command_encoder.take() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub struct WgpuRenderContext { | ||||||
|  |     pub device: Arc<wgpu::Device>, | ||||||
|  |     command_encoder: LazyCommandEncoder, | ||||||
|  |     wgpu_resources: WgpuResources, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl WgpuRenderContext { | ||||||
|  |     pub fn new(device: Arc<wgpu::Device>) -> Self { | ||||||
|  |         WgpuRenderContext { | ||||||
|  |             device, | ||||||
|  |             command_encoder: LazyCommandEncoder::default(), | ||||||
|  |             wgpu_resources: WgpuResources::default(), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn finish(&mut self) -> Option<wgpu::CommandBuffer> { | ||||||
|  |         self.command_encoder.take().map(|encoder| encoder.finish()) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl RenderContext for WgpuRenderContext { | ||||||
|  |     fn create_sampler(&mut self, sampler_descriptor: &SamplerDescriptor) -> RenderResource { | ||||||
|  |         self.wgpu_resources | ||||||
|  |             .create_sampler(&self.device, sampler_descriptor) | ||||||
|  |     } | ||||||
|  |     fn create_texture(&mut self, texture_descriptor: &TextureDescriptor) -> RenderResource { | ||||||
|  |         self.wgpu_resources | ||||||
|  |             .create_texture(&self.device, texture_descriptor) | ||||||
|  |     } | ||||||
|  |     fn create_buffer(&mut self, buffer_info: BufferInfo) -> RenderResource { | ||||||
|  |         self.wgpu_resources.create_buffer(&self.device, buffer_info) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // TODO: clean this up
 | ||||||
|  |     fn create_buffer_mapped( | ||||||
|  |         &mut self, | ||||||
|  |         buffer_info: BufferInfo, | ||||||
|  |         setup_data: &mut dyn FnMut(&mut [u8], &mut dyn RenderContext), | ||||||
|  |     ) -> RenderResource { | ||||||
|  |         let buffer = WgpuResources::begin_create_buffer_mapped_render_context( | ||||||
|  |             &buffer_info, | ||||||
|  |             self, | ||||||
|  |             setup_data, | ||||||
|  |         ); | ||||||
|  |         self.wgpu_resources.assign_buffer(buffer, buffer_info) | ||||||
|  |     } | ||||||
|  |     fn create_texture_with_data( | ||||||
|  |         &mut self, | ||||||
|  |         texture_descriptor: &TextureDescriptor, | ||||||
|  |         bytes: Option<&[u8]>, | ||||||
|  |     ) -> RenderResource { | ||||||
|  |         self.wgpu_resources.create_texture_with_data( | ||||||
|  |             &self.device, | ||||||
|  |             self.command_encoder.get_or_create(&self.device), | ||||||
|  |             texture_descriptor, | ||||||
|  |             bytes, | ||||||
|  |         ) | ||||||
|  |     } | ||||||
|  |     fn remove_buffer(&mut self, resource: RenderResource) { | ||||||
|  |         self.wgpu_resources.remove_buffer(resource); | ||||||
|  |     } | ||||||
|  |     fn remove_texture(&mut self, resource: RenderResource) { | ||||||
|  |         self.wgpu_resources.remove_texture(resource); | ||||||
|  |     } | ||||||
|  |     fn remove_sampler(&mut self, resource: RenderResource) { | ||||||
|  |         self.wgpu_resources.remove_sampler(resource); | ||||||
|  |     } | ||||||
|  |     fn get_resource_info(&self, resource: RenderResource) -> Option<&ResourceInfo> { | ||||||
|  |         self.wgpu_resources.resource_info.get(&resource) | ||||||
|  |     } | ||||||
|  |     fn get_resource_info_mut(&mut self, resource: RenderResource) -> Option<&mut ResourceInfo> { | ||||||
|  |         self.wgpu_resources.resource_info.get_mut(&resource) | ||||||
|  |     } | ||||||
|  |     fn render_resources(&self) -> &RenderResources { | ||||||
|  |         &self.wgpu_resources.render_resources | ||||||
|  |     } | ||||||
|  |     fn render_resources_mut(&mut self) -> &mut RenderResources { | ||||||
|  |         &mut self.wgpu_resources.render_resources | ||||||
|  |     } | ||||||
|  |     fn copy_buffer_to_buffer( | ||||||
|  |         &mut self, | ||||||
|  |         source_buffer: RenderResource, | ||||||
|  |         source_offset: u64, | ||||||
|  |         destination_buffer: RenderResource, | ||||||
|  |         destination_offset: u64, | ||||||
|  |         size: u64, | ||||||
|  |     ) { | ||||||
|  |         self.wgpu_resources.copy_buffer_to_buffer( | ||||||
|  |             self.command_encoder.get_or_create(&self.device), | ||||||
|  |             source_buffer, | ||||||
|  |             source_offset, | ||||||
|  |             destination_buffer, | ||||||
|  |             destination_offset, | ||||||
|  |             size, | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |     fn create_buffer_with_data(&mut self, buffer_info: BufferInfo, data: &[u8]) -> RenderResource { | ||||||
|  |         self.wgpu_resources | ||||||
|  |             .create_buffer_with_data(&self.device, buffer_info, data) | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -2,6 +2,7 @@ use super::{ | |||||||
|     wgpu_type_converter::{OwnedWgpuVertexBufferDescriptor, WgpuInto}, |     wgpu_type_converter::{OwnedWgpuVertexBufferDescriptor, WgpuInto}, | ||||||
|     WgpuRenderPass, WgpuResources, |     WgpuRenderPass, WgpuResources, | ||||||
| }; | }; | ||||||
|  | use crate::renderer_2::WgpuRenderContext; | ||||||
| use bevy_app::{EventReader, Events}; | use bevy_app::{EventReader, Events}; | ||||||
| use bevy_asset::{AssetStorage, Handle}; | use bevy_asset::{AssetStorage, Handle}; | ||||||
| use bevy_render::{ | use bevy_render::{ | ||||||
| @ -12,8 +13,8 @@ use bevy_render::{ | |||||||
|     pipeline::{update_shader_assignments, PipelineCompiler, PipelineDescriptor}, |     pipeline::{update_shader_assignments, PipelineCompiler, PipelineDescriptor}, | ||||||
|     render_graph::RenderGraph, |     render_graph::RenderGraph, | ||||||
|     render_resource::{ |     render_resource::{ | ||||||
|         resource_name, BufferInfo, RenderResource, RenderResourceAssignments, RenderResources, |         resource_name, BufferInfo, BufferUsage, RenderResource, RenderResourceAssignments, | ||||||
|         ResourceInfo, |         RenderResources, ResourceInfo, | ||||||
|     }, |     }, | ||||||
|     renderer::Renderer, |     renderer::Renderer, | ||||||
|     shader::Shader, |     shader::Shader, | ||||||
| @ -359,6 +360,43 @@ impl Renderer for WgpuRenderer { | |||||||
|                 .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }), |                 .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }), | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
|  |         // use bevy_render::renderer_2::RenderContext;
 | ||||||
|  |         // let thread_count = 5;
 | ||||||
|  |         // let (sender, receiver) = crossbeam_channel::bounded(thread_count);
 | ||||||
|  |         // for i in 0..thread_count {
 | ||||||
|  |         //     let device = self.device.clone();
 | ||||||
|  |         //     let sender = sender.clone();
 | ||||||
|  |         //     std::thread::spawn(move || {
 | ||||||
|  |         //         let mut context = WgpuRenderContext::new(device);
 | ||||||
|  |         //         let data: Vec::<u8> = vec![1, 2, 3,4 ];
 | ||||||
|  |         //         let data2: Vec::<u8> = vec![4, 2, 3,4 ];
 | ||||||
|  |         //         let buffer  = context.create_buffer_with_data(BufferInfo {
 | ||||||
|  |         //             buffer_usage: BufferUsage::COPY_SRC,
 | ||||||
|  |         //             ..Default::default()
 | ||||||
|  |         //         }, &data);
 | ||||||
|  | 
 | ||||||
|  |         //         let buffer2  = context.create_buffer_with_data(BufferInfo {
 | ||||||
|  |         //             buffer_usage: BufferUsage::UNIFORM |BufferUsage::COPY_DST,
 | ||||||
|  |         //             ..Default::default()
 | ||||||
|  |         //         }, &data2);
 | ||||||
|  | 
 | ||||||
|  |         //         context.copy_buffer_to_buffer(buffer, 0, buffer2, 0, data.len() as u64);
 | ||||||
|  | 
 | ||||||
|  |         //         sender.send(context.finish()).unwrap();
 | ||||||
|  |         //     });
 | ||||||
|  |         // }
 | ||||||
|  | 
 | ||||||
|  |         // let mut command_buffers = Vec::new();
 | ||||||
|  |         // for i in 0..thread_count {
 | ||||||
|  |         //     if let Some(command_buffer) = receiver.recv().unwrap() {
 | ||||||
|  |         //         command_buffers.push(command_buffer);
 | ||||||
|  |         //     }
 | ||||||
|  | 
 | ||||||
|  |         //     println!("got {}", i);
 | ||||||
|  |         // }
 | ||||||
|  | 
 | ||||||
|  |         // self.queue.submit(&command_buffers);
 | ||||||
|  | 
 | ||||||
|         self.update_resource_providers(world, resources); |         self.update_resource_providers(world, resources); | ||||||
|         update_shader_assignments(world, resources, self); |         update_shader_assignments(world, resources, self); | ||||||
|         self.create_queued_textures(resources); |         self.create_queued_textures(resources); | ||||||
| @ -434,8 +472,7 @@ impl Renderer for WgpuRenderer { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     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, 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> { | ||||||
| @ -487,7 +524,7 @@ impl Renderer for WgpuRenderer { | |||||||
|         texture_descriptor: &TextureDescriptor, |         texture_descriptor: &TextureDescriptor, | ||||||
|         bytes: Option<&[u8]>, |         bytes: Option<&[u8]>, | ||||||
|     ) -> RenderResource { |     ) -> RenderResource { | ||||||
|         self.wgpu_resources.create_texture( |         self.wgpu_resources.create_texture_with_data( | ||||||
|             &self.device, |             &self.device, | ||||||
|             self.encoder.as_mut().unwrap(), |             self.encoder.as_mut().unwrap(), | ||||||
|             texture_descriptor, |             texture_descriptor, | ||||||
| @ -564,7 +601,8 @@ impl Renderer for WgpuRenderer { | |||||||
|                     }) |                     }) | ||||||
|                     .collect::<Vec<wgpu::BindGroupLayoutEntry>>(); |                     .collect::<Vec<wgpu::BindGroupLayoutEntry>>(); | ||||||
|                 let wgpu_bind_group_layout = |                 let wgpu_bind_group_layout = | ||||||
|                     self.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, | ||||||
|                         }); |                         }); | ||||||
| @ -587,7 +625,9 @@ impl Renderer for WgpuRenderer { | |||||||
|             }) |             }) | ||||||
|             .collect::<Vec<&wgpu::BindGroupLayout>>(); |             .collect::<Vec<&wgpu::BindGroupLayout>>(); | ||||||
| 
 | 
 | ||||||
|         let pipeline_layout = self.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(), | ||||||
|             }); |             }); | ||||||
| 
 | 
 | ||||||
| @ -617,8 +657,11 @@ 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( | ||||||
|                     .create_shader_module(&self.device, fragment_handle, shader_storage); |                     &self.device, | ||||||
|  |                     fragment_handle, | ||||||
|  |                     shader_storage, | ||||||
|  |                 ); | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
| @ -673,7 +716,9 @@ 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 = self.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); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| use super::WgpuRenderer; | use super::WgpuRenderer; | ||||||
| use crate::wgpu_type_converter::WgpuInto; | use crate::{renderer_2::WgpuRenderContext, wgpu_type_converter::WgpuInto}; | ||||||
| use bevy_asset::{AssetStorage, Handle}; | use bevy_asset::{AssetStorage, Handle}; | ||||||
| use bevy_render::{ | use bevy_render::{ | ||||||
|     pipeline::{BindGroupDescriptor, BindGroupDescriptorId, BindType}, |     pipeline::{BindGroupDescriptor, BindGroupDescriptorId, BindType}, | ||||||
| @ -9,7 +9,7 @@ use bevy_render::{ | |||||||
|     }, |     }, | ||||||
|     renderer::Renderer, |     renderer::Renderer, | ||||||
|     shader::Shader, |     shader::Shader, | ||||||
|     texture::{SamplerDescriptor, TextureDescriptor}, |     texture::{SamplerDescriptor, TextureDescriptor}, renderer_2::RenderContext, | ||||||
| }; | }; | ||||||
| use bevy_window::WindowId; | use bevy_window::WindowId; | ||||||
| use std::collections::HashMap; | use std::collections::HashMap; | ||||||
| @ -154,7 +154,7 @@ impl WgpuResources { | |||||||
|             usage: buffer_info.buffer_usage.wgpu_into(), |             usage: buffer_info.buffer_usage.wgpu_into(), | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         let resource = self.render_resources.get_next_resource(); |         let resource = RenderResource::new(); | ||||||
|         self.add_resource_info(resource, ResourceInfo::Buffer(buffer_info)); |         self.add_resource_info(resource, ResourceInfo::Buffer(buffer_info)); | ||||||
| 
 | 
 | ||||||
|         self.buffers.insert(resource, buffer); |         self.buffers.insert(resource, buffer); | ||||||
| @ -186,7 +186,7 @@ impl WgpuResources { | |||||||
|         buffer: wgpu::Buffer, |         buffer: wgpu::Buffer, | ||||||
|         buffer_info: BufferInfo, |         buffer_info: BufferInfo, | ||||||
|     ) -> RenderResource { |     ) -> RenderResource { | ||||||
|         let resource = self.render_resources.get_next_resource(); |         let resource = RenderResource::new(); | ||||||
|         self.add_resource_info(resource, ResourceInfo::Buffer(buffer_info)); |         self.add_resource_info(resource, ResourceInfo::Buffer(buffer_info)); | ||||||
|         self.buffers.insert(resource, buffer); |         self.buffers.insert(resource, buffer); | ||||||
|         resource |         resource | ||||||
| @ -209,6 +209,24 @@ impl WgpuResources { | |||||||
|         mapped.finish() |         mapped.finish() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     // TODO: clean this up
 | ||||||
|  |     pub fn begin_create_buffer_mapped_render_context( | ||||||
|  |         buffer_info: &BufferInfo, | ||||||
|  |         render_context: &mut WgpuRenderContext, | ||||||
|  |         setup_data: &mut dyn FnMut(&mut [u8], &mut dyn RenderContext), | ||||||
|  |     ) -> wgpu::Buffer { | ||||||
|  |         let device = render_context.device.clone(); | ||||||
|  |         let mut mapped = device.create_buffer_mapped( | ||||||
|  |             &wgpu::BufferDescriptor { | ||||||
|  |                 size: buffer_info.size as u64, | ||||||
|  |                 usage: buffer_info.buffer_usage.wgpu_into(), | ||||||
|  |                 label: None, | ||||||
|  |             } | ||||||
|  |         ); | ||||||
|  |         setup_data(&mut mapped.data, render_context); | ||||||
|  |         mapped.finish() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     pub fn copy_buffer_to_buffer( |     pub fn copy_buffer_to_buffer( | ||||||
|         &mut self, |         &mut self, | ||||||
|         encoder: &mut wgpu::CommandEncoder, |         encoder: &mut wgpu::CommandEncoder, | ||||||
| @ -242,13 +260,27 @@ impl WgpuResources { | |||||||
|     ) -> RenderResource { |     ) -> RenderResource { | ||||||
|         let descriptor: wgpu::SamplerDescriptor = (*sampler_descriptor).wgpu_into(); |         let descriptor: wgpu::SamplerDescriptor = (*sampler_descriptor).wgpu_into(); | ||||||
|         let sampler = device.create_sampler(&descriptor); |         let sampler = device.create_sampler(&descriptor); | ||||||
|         let resource = self.render_resources.get_next_resource(); |         let resource = RenderResource::new(); | ||||||
|         self.samplers.insert(resource, sampler); |         self.samplers.insert(resource, sampler); | ||||||
|         self.add_resource_info(resource, ResourceInfo::Sampler); |         self.add_resource_info(resource, ResourceInfo::Sampler); | ||||||
|         resource |         resource | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn create_texture( |     pub fn create_texture( | ||||||
|  |         &mut self, | ||||||
|  |         device: &wgpu::Device, | ||||||
|  |         texture_descriptor: &TextureDescriptor, | ||||||
|  |     ) -> RenderResource { | ||||||
|  |         let descriptor: wgpu::TextureDescriptor = (*texture_descriptor).wgpu_into(); | ||||||
|  |         let texture = device.create_texture(&descriptor); | ||||||
|  |         let texture_view = texture.create_default_view(); | ||||||
|  |         let resource = RenderResource::new(); | ||||||
|  |         self.add_resource_info(resource, ResourceInfo::Texture); | ||||||
|  |         self.textures.insert(resource, texture_view); | ||||||
|  |         resource | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn create_texture_with_data( | ||||||
|         &mut self, |         &mut self, | ||||||
|         device: &wgpu::Device, |         device: &wgpu::Device, | ||||||
|         encoder: &mut wgpu::CommandEncoder, |         encoder: &mut wgpu::CommandEncoder, | ||||||
| @ -277,7 +309,7 @@ impl WgpuResources { | |||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         let resource = self.render_resources.get_next_resource(); |         let resource = RenderResource::new(); | ||||||
|         self.add_resource_info(resource, ResourceInfo::Texture); |         self.add_resource_info(resource, ResourceInfo::Texture); | ||||||
|         self.textures.insert(resource, texture_view); |         self.textures.insert(resource, texture_view); | ||||||
|         resource |         resource | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Carter Anderson
						Carter Anderson