merge asset resources / support arbitrary asset handles / make them RwLocked
This commit is contained in:
		
							parent
							
								
									bcbddf8719
								
							
						
					
					
						commit
						1f5f432e6c
					
				| @ -3,7 +3,7 @@ use legion::prelude::*; | |||||||
| 
 | 
 | ||||||
| use crate::{ | use crate::{ | ||||||
|     draw_target::DrawTarget, |     draw_target::DrawTarget, | ||||||
|     mesh::Mesh, |     mesh::{self, Mesh}, | ||||||
|     pass::RenderPass, |     pass::RenderPass, | ||||||
|     pipeline::{PipelineAssignments, PipelineDescriptor}, |     pipeline::{PipelineAssignments, PipelineDescriptor}, | ||||||
|     render_resource::{ |     render_resource::{ | ||||||
| @ -49,15 +49,15 @@ impl DrawTarget for AssignedMeshesDrawTarget { | |||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 let mesh = *world.get_component::<Handle<Mesh>>(*entity).unwrap(); |                 let mesh_handle = *world.get_component::<Handle<Mesh>>(*entity).unwrap(); | ||||||
|                 let render_context = render_pass.get_render_context(); |                 let render_context = render_pass.get_render_context(); | ||||||
|                 let render_resources = render_context.resources(); |                 let render_resources = render_context.resources(); | ||||||
|                 if current_mesh_handle != Some(mesh) { |                 if current_mesh_handle != Some(mesh_handle) { | ||||||
|                     if let Some(vertex_buffer_resource) = |                     if let Some(vertex_buffer_resource) = | ||||||
|                         render_resources.get_mesh_vertices_resource(mesh) |                         render_resources.get_asset_resource(mesh_handle, mesh::VERTEX_BUFFER_ASSET_INDEX) | ||||||
|                     { |                     { | ||||||
|                         let index_buffer_resource = |                         let index_buffer_resource = | ||||||
|                             render_resources.get_mesh_indices_resource(mesh).unwrap(); |                             render_resources.get_asset_resource(mesh_handle, mesh::INDEX_BUFFER_ASSET_INDEX).unwrap(); | ||||||
|                         render_resources.get_resource_info( |                         render_resources.get_resource_info( | ||||||
|                             index_buffer_resource, |                             index_buffer_resource, | ||||||
|                             &mut |resource_info| match resource_info { |                             &mut |resource_info| match resource_info { | ||||||
| @ -71,7 +71,7 @@ impl DrawTarget for AssignedMeshesDrawTarget { | |||||||
|                         render_pass.set_vertex_buffer(0, vertex_buffer_resource, 0); |                         render_pass.set_vertex_buffer(0, vertex_buffer_resource, 0); | ||||||
|                     } |                     } | ||||||
|                     // TODO: Verify buffer format matches render pass
 |                     // TODO: Verify buffer format matches render pass
 | ||||||
|                     current_mesh_handle = Some(mesh); |                     current_mesh_handle = Some(mesh_handle); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 // TODO: validate bind group properties against shader uniform properties at least once
 |                 // TODO: validate bind group properties against shader uniform properties at least once
 | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| use crate::{ | use crate::{ | ||||||
|     draw_target::DrawTarget, |     draw_target::DrawTarget, | ||||||
|     mesh::Mesh, |     mesh::{self, Mesh}, | ||||||
|     pass::RenderPass, |     pass::RenderPass, | ||||||
|     pipeline::PipelineDescriptor, |     pipeline::PipelineDescriptor, | ||||||
|     render_resource::{resource_name, ResourceInfo}, |     render_resource::{resource_name, ResourceInfo}, | ||||||
| @ -24,19 +24,19 @@ impl DrawTarget for MeshesDrawTarget { | |||||||
|         let mut current_mesh_handle = None; |         let mut current_mesh_handle = None; | ||||||
|         let mut current_mesh_index_len = 0; |         let mut current_mesh_index_len = 0; | ||||||
|         let mesh_query = <(Read<Handle<Mesh>>, Read<Renderable>)>::query(); |         let mesh_query = <(Read<Handle<Mesh>>, Read<Renderable>)>::query(); | ||||||
|         for (mesh, renderable) in mesh_query.iter(world) { |         for (mesh_handle, renderable) in mesh_query.iter(world) { | ||||||
|             if !renderable.is_visible || renderable.is_instanced { |             if !renderable.is_visible || renderable.is_instanced { | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             let render_context = render_pass.get_render_context(); |             let render_context = render_pass.get_render_context(); | ||||||
|             let render_resources = render_context.resources(); |             let render_resources = render_context.resources(); | ||||||
|             if current_mesh_handle != Some(*mesh) { |             if current_mesh_handle != Some(*mesh_handle) { | ||||||
|                 if let Some(vertex_buffer_resource) = |                 if let Some(vertex_buffer_resource) = | ||||||
|                     render_resources.get_mesh_vertices_resource(*mesh) |                     render_resources.get_asset_resource(*mesh_handle, mesh::VERTEX_BUFFER_ASSET_INDEX) | ||||||
|                 { |                 { | ||||||
|                     let index_buffer_resource = |                     let index_buffer_resource = | ||||||
|                         render_resources.get_mesh_indices_resource(*mesh).unwrap(); |                         render_resources.get_asset_resource(*mesh_handle, mesh::INDEX_BUFFER_ASSET_INDEX).unwrap(); | ||||||
|                     render_resources.get_resource_info(index_buffer_resource, &mut |resource_info| { |                     render_resources.get_resource_info(index_buffer_resource, &mut |resource_info| { | ||||||
|                         match resource_info { |                         match resource_info { | ||||||
|                             Some(ResourceInfo::Buffer(buffer_info)) => { |                             Some(ResourceInfo::Buffer(buffer_info)) => { | ||||||
| @ -49,7 +49,7 @@ impl DrawTarget for MeshesDrawTarget { | |||||||
|                     render_pass.set_vertex_buffer(0, vertex_buffer_resource, 0); |                     render_pass.set_vertex_buffer(0, vertex_buffer_resource, 0); | ||||||
|                 } |                 } | ||||||
|                 // TODO: Verify buffer format matches render pass
 |                 // TODO: Verify buffer format matches render pass
 | ||||||
|                 current_mesh_handle = Some(*mesh); |                 current_mesh_handle = Some(*mesh_handle); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             // TODO: validate bind group properties against shader uniform properties at least once
 |             // TODO: validate bind group properties against shader uniform properties at least once
 | ||||||
|  | |||||||
| @ -3,6 +3,9 @@ use bevy_asset::{Asset, Handle}; | |||||||
| use glam::*; | use glam::*; | ||||||
| use legion::prelude::*; | use legion::prelude::*; | ||||||
| 
 | 
 | ||||||
|  | pub const VERTEX_BUFFER_ASSET_INDEX: usize = 0; | ||||||
|  | pub const INDEX_BUFFER_ASSET_INDEX: usize = 1; | ||||||
|  | 
 | ||||||
| pub enum MeshType { | pub enum MeshType { | ||||||
|     Cube, |     Cube, | ||||||
|     Plane { size: f32 }, |     Plane { size: f32 }, | ||||||
|  | |||||||
| @ -1,6 +1,3 @@ | |||||||
| use crate::{mesh::Mesh, texture::Texture}; |  | ||||||
| use bevy_asset::Handle; |  | ||||||
| use std::collections::HashMap; |  | ||||||
| use uuid::Uuid; | use uuid::Uuid; | ||||||
| 
 | 
 | ||||||
| // TODO: Rename to RenderResourceId
 | // TODO: Rename to RenderResourceId
 | ||||||
| @ -12,51 +9,3 @@ impl RenderResource { | |||||||
|         RenderResource(Uuid::new_v4()) |         RenderResource(Uuid::new_v4()) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| // TODO: consider scoping breaking these mappings up by type: Texture, Sampler, etc
 |  | ||||||
| // the overlap could cause accidents.
 |  | ||||||
| #[derive(Default, Clone)] |  | ||||||
| pub struct AssetResources { |  | ||||||
|     texture_to_resource: HashMap<Handle<Texture>, RenderResource>, |  | ||||||
|     texture_to_sampler_resource: HashMap<Handle<Texture>, RenderResource>, |  | ||||||
|     mesh_to_vertices_resource: HashMap<Handle<Mesh>, RenderResource>, |  | ||||||
|     mesh_to_indices_resource: HashMap<Handle<Mesh>, RenderResource>, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl AssetResources { |  | ||||||
|     pub fn set_texture_resource(&mut self, texture: Handle<Texture>, resource: RenderResource) { |  | ||||||
|         self.texture_to_resource.insert(texture, resource); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     pub fn get_texture_resource(&self, texture: Handle<Texture>) -> Option<RenderResource> { |  | ||||||
|         self.texture_to_resource.get(&texture).cloned() |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     pub fn set_mesh_vertices_resource(&mut self, mesh: Handle<Mesh>, resource: RenderResource) { |  | ||||||
|         self.mesh_to_vertices_resource.insert(mesh, resource); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     pub fn get_mesh_vertices_resource(&self, mesh: Handle<Mesh>) -> Option<RenderResource> { |  | ||||||
|         self.mesh_to_vertices_resource.get(&mesh).cloned() |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     pub fn set_mesh_indices_resource(&mut self, mesh: Handle<Mesh>, resource: RenderResource) { |  | ||||||
|         self.mesh_to_indices_resource.insert(mesh, resource); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     pub fn get_mesh_indices_resource(&self, mesh: Handle<Mesh>) -> Option<RenderResource> { |  | ||||||
|         self.mesh_to_indices_resource.get(&mesh).cloned() |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     pub fn set_texture_sampler_resource( |  | ||||||
|         &mut self, |  | ||||||
|         texture: Handle<Texture>, |  | ||||||
|         resource: RenderResource, |  | ||||||
|     ) { |  | ||||||
|         self.texture_to_sampler_resource.insert(texture, resource); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     pub fn get_texture_sampler_resource(&self, texture: Handle<Texture>) -> Option<RenderResource> { |  | ||||||
|         self.texture_to_sampler_resource.get(&texture).cloned() |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| use crate::{ | use crate::{ | ||||||
|     mesh::Mesh, |     mesh::{self, Mesh}, | ||||||
|     pipeline::VertexBufferDescriptors, |     pipeline::VertexBufferDescriptors, | ||||||
|     render_resource::{ |     render_resource::{ | ||||||
|         AssetBatchers, BufferInfo, BufferUsage, RenderResourceAssignments, ResourceProvider, |         AssetBatchers, BufferInfo, BufferUsage, RenderResourceAssignments, ResourceProvider, | ||||||
| @ -24,10 +24,10 @@ impl MeshResourceProvider { | |||||||
|     ) { |     ) { | ||||||
|         let render_resources = render_context.resources_mut(); |         let render_resources = render_context.resources_mut(); | ||||||
|         let (vertex_buffer, index_buffer) = |         let (vertex_buffer, index_buffer) = | ||||||
|             if let Some(vertex_buffer) = render_resources.get_mesh_vertices_resource(handle) { |             if let Some(vertex_buffer) = render_resources.get_asset_resource(handle, mesh::VERTEX_BUFFER_ASSET_INDEX) { | ||||||
|                 ( |                 ( | ||||||
|                     vertex_buffer, |                     vertex_buffer, | ||||||
|                     render_resources.get_mesh_indices_resource(handle), |                     render_resources.get_asset_resource(handle, mesh::INDEX_BUFFER_ASSET_INDEX), | ||||||
|                 ) |                 ) | ||||||
|             } else { |             } else { | ||||||
|                 let mesh_asset = mesh_storage.get(&handle).unwrap(); |                 let mesh_asset = mesh_storage.get(&handle).unwrap(); | ||||||
| @ -46,9 +46,8 @@ impl MeshResourceProvider { | |||||||
|                     mesh_asset.indices.as_bytes(), |                     mesh_asset.indices.as_bytes(), | ||||||
|                 ); |                 ); | ||||||
| 
 | 
 | ||||||
|                 let asset_resources = render_resources.asset_resources_mut(); |                 render_resources.set_asset_resource(handle, vertex_buffer, mesh::VERTEX_BUFFER_ASSET_INDEX); | ||||||
|                 asset_resources.set_mesh_vertices_resource(handle, vertex_buffer); |                 render_resources.set_asset_resource(handle, index_buffer, mesh::INDEX_BUFFER_ASSET_INDEX); | ||||||
|                 asset_resources.set_mesh_indices_resource(handle, index_buffer); |  | ||||||
|                 (vertex_buffer, Some(index_buffer)) |                 (vertex_buffer, Some(index_buffer)) | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ use crate::{ | |||||||
|     }, |     }, | ||||||
|     renderer_2::{RenderContext, RenderResourceContext}, |     renderer_2::{RenderContext, RenderResourceContext}, | ||||||
|     shader::{AsUniforms, FieldBindType}, |     shader::{AsUniforms, FieldBindType}, | ||||||
|     texture::{SamplerDescriptor, Texture, TextureDescriptor}, |     texture::{SamplerDescriptor, Texture, TextureDescriptor, self}, | ||||||
|     Renderable, |     Renderable, | ||||||
| }; | }; | ||||||
| use bevy_asset::{AssetStorage, Handle}; | use bevy_asset::{AssetStorage, Handle}; | ||||||
| @ -379,13 +379,13 @@ where | |||||||
|                         .unwrap(); |                         .unwrap(); | ||||||
|                     let (texture_resource, sampler_resource) = match render_context |                     let (texture_resource, sampler_resource) = match render_context | ||||||
|                         .resources() |                         .resources() | ||||||
|                         .get_texture_resource(texture_handle) |                         .get_asset_resource(texture_handle, texture::TEXTURE_ASSET_INDEX) | ||||||
|                     { |                     { | ||||||
|                         Some(texture_resource) => ( |                         Some(texture_resource) => ( | ||||||
|                             texture_resource, |                             texture_resource, | ||||||
|                             render_context |                             render_context | ||||||
|                                 .resources() |                                 .resources() | ||||||
|                                 .get_texture_sampler_resource(texture_handle) |                                 .get_asset_resource(texture_handle, texture::SAMPLER_ASSET_INDEX) | ||||||
|                                 .unwrap(), |                                 .unwrap(), | ||||||
|                         ), |                         ), | ||||||
|                         None => { |                         None => { | ||||||
| @ -401,10 +401,9 @@ where | |||||||
|                             let sampler_resource = |                             let sampler_resource = | ||||||
|                                 render_resources.create_sampler(&sampler_descriptor); |                                 render_resources.create_sampler(&sampler_descriptor); | ||||||
| 
 | 
 | ||||||
|                             let asset_resources = render_resources.asset_resources_mut(); |                             render_resources.set_asset_resource(texture_handle, texture_resource, 0); | ||||||
|                             asset_resources.set_texture_resource(texture_handle, texture_resource); |                             render_resources | ||||||
|                             asset_resources |                                 .set_asset_resource(texture_handle, sampler_resource, 1); | ||||||
|                                 .set_texture_sampler_resource(texture_handle, sampler_resource); |  | ||||||
|                             (texture_resource, sampler_resource) |                             (texture_resource, sampler_resource) | ||||||
|                         } |                         } | ||||||
|                     }; |                     }; | ||||||
|  | |||||||
| @ -1,10 +1,9 @@ | |||||||
| use crate::{ | use crate::{ | ||||||
|     mesh::Mesh, |     render_resource::{BufferInfo, RenderResource, ResourceInfo}, | ||||||
|     render_resource::{AssetResources, BufferInfo, RenderResource, ResourceInfo}, |  | ||||||
|     shader::Shader, |     shader::Shader, | ||||||
|     texture::{SamplerDescriptor, Texture, TextureDescriptor}, |     texture::{SamplerDescriptor, TextureDescriptor}, | ||||||
| }; | }; | ||||||
| use bevy_asset::{AssetStorage, Handle}; | use bevy_asset::{AssetStorage, Handle, HandleUntyped}; | ||||||
| use bevy_window::{Window, WindowId}; | use bevy_window::{Window, WindowId}; | ||||||
| use std::any::Any; | use std::any::Any; | ||||||
| 
 | 
 | ||||||
| @ -55,11 +54,39 @@ pub trait RenderResourceContext: Any { | |||||||
|     fn remove_buffer(&mut self, resource: RenderResource); |     fn remove_buffer(&mut self, resource: RenderResource); | ||||||
|     fn remove_texture(&mut self, resource: RenderResource); |     fn remove_texture(&mut self, resource: RenderResource); | ||||||
|     fn remove_sampler(&mut self, resource: RenderResource); |     fn remove_sampler(&mut self, resource: RenderResource); | ||||||
|     fn get_resource_info(&self, resource: RenderResource, handle_info: &mut dyn FnMut(Option<&ResourceInfo>)); |     fn get_resource_info( | ||||||
|     fn asset_resources(&self) -> &AssetResources; |         &self, | ||||||
|     fn asset_resources_mut(&mut self) -> &mut AssetResources; |         resource: RenderResource, | ||||||
|     fn get_texture_resource(&self, texture: Handle<Texture>) -> Option<RenderResource>; |         handle_info: &mut dyn FnMut(Option<&ResourceInfo>), | ||||||
|     fn get_texture_sampler_resource(&self, texture: Handle<Texture>) -> Option<RenderResource>; |     ); | ||||||
|     fn get_mesh_vertices_resource(&self, mesh: Handle<Mesh>) -> Option<RenderResource>; |     fn set_asset_resource_untyped( | ||||||
|     fn get_mesh_indices_resource(&self, mesh: Handle<Mesh>) -> Option<RenderResource>; |         &mut self, | ||||||
|  |         handle: HandleUntyped, | ||||||
|  |         render_resource: RenderResource, | ||||||
|  |         index: usize, | ||||||
|  |     ); | ||||||
|  |     fn get_asset_resource_untyped( | ||||||
|  |         &self, | ||||||
|  |         handle: HandleUntyped, | ||||||
|  |         index: usize, | ||||||
|  |     ) -> Option<RenderResource>; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl dyn RenderResourceContext { | ||||||
|  |     pub fn set_asset_resource<T>( | ||||||
|  |         &mut self, | ||||||
|  |         handle: Handle<T>, | ||||||
|  |         render_resource: RenderResource, | ||||||
|  |         index: usize, | ||||||
|  |     ) where | ||||||
|  |         T: 'static, | ||||||
|  |     { | ||||||
|  |         self.set_asset_resource_untyped(handle.into(), render_resource, index); | ||||||
|  |     } | ||||||
|  |     pub fn get_asset_resource<T>(&self, handle: Handle<T>, index: usize) -> Option<RenderResource> | ||||||
|  |     where | ||||||
|  |         T: 'static, | ||||||
|  |     { | ||||||
|  |         self.get_asset_resource_untyped(handle.into(), index) | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,6 +2,8 @@ use crate::shader::ShaderDefSuffixProvider; | |||||||
| use bevy_asset::{Asset, Handle}; | use bevy_asset::{Asset, Handle}; | ||||||
| use std::fs::File; | use std::fs::File; | ||||||
| 
 | 
 | ||||||
|  | pub const TEXTURE_ASSET_INDEX: usize = 0; | ||||||
|  | pub const SAMPLER_ASSET_INDEX: usize = 1; | ||||||
| pub enum TextureType { | pub enum TextureType { | ||||||
|     Data(Vec<u8>, usize, usize), |     Data(Vec<u8>, usize, usize), | ||||||
|     Png(String), // TODO: please rethink this
 |     Png(String), // TODO: please rethink this
 | ||||||
|  | |||||||
| @ -1,17 +1,14 @@ | |||||||
| use crate::WgpuResources; | use crate::WgpuResources; | ||||||
| 
 | 
 | ||||||
| use bevy_asset::{AssetStorage, Handle}; | use bevy_asset::{AssetStorage, Handle, HandleUntyped}; | ||||||
| use bevy_render::{ | use bevy_render::{ | ||||||
|     mesh::Mesh, |     render_resource::{BufferInfo, RenderResource, ResourceInfo}, | ||||||
|     render_resource::{ |  | ||||||
|         AssetResources, BufferInfo, RenderResource, ResourceInfo, |  | ||||||
|     }, |  | ||||||
|     renderer_2::RenderResourceContext, |     renderer_2::RenderResourceContext, | ||||||
|     shader::Shader, |     shader::Shader, | ||||||
|     texture::{SamplerDescriptor, Texture, TextureDescriptor}, |     texture::{SamplerDescriptor, TextureDescriptor}, | ||||||
| }; | }; | ||||||
|  | use bevy_window::{Window, WindowId}; | ||||||
| use std::sync::Arc; | use std::sync::Arc; | ||||||
| use bevy_window::{WindowId, Window}; |  | ||||||
| 
 | 
 | ||||||
| #[derive(Clone)] | #[derive(Clone)] | ||||||
| pub struct WgpuRenderResourceContext { | pub struct WgpuRenderResourceContext { | ||||||
| @ -19,7 +16,6 @@ pub struct WgpuRenderResourceContext { | |||||||
|     pub wgpu_resources: WgpuResources, |     pub wgpu_resources: WgpuResources, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| impl WgpuRenderResourceContext { | impl WgpuRenderResourceContext { | ||||||
|     pub fn new(device: Arc<wgpu::Device>) -> Self { |     pub fn new(device: Arc<wgpu::Device>) -> Self { | ||||||
|         WgpuRenderResourceContext { |         WgpuRenderResourceContext { | ||||||
| @ -71,46 +67,27 @@ impl RenderResourceContext for WgpuRenderResourceContext { | |||||||
|         self.wgpu_resources.remove_sampler(resource); |         self.wgpu_resources.remove_sampler(resource); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn get_texture_resource(&self, texture: Handle<Texture>) -> Option<RenderResource> { |     fn get_resource_info( | ||||||
|         self.wgpu_resources |         &self, | ||||||
|             .asset_resources |         resource: RenderResource, | ||||||
|             .get_texture_resource(texture) |         handle_info: &mut dyn FnMut(Option<&ResourceInfo>), | ||||||
|     } |     ) { | ||||||
| 
 |  | ||||||
|     fn get_texture_sampler_resource(&self, texture: Handle<Texture>) -> Option<RenderResource> { |  | ||||||
|         self.wgpu_resources |  | ||||||
|             .asset_resources |  | ||||||
|             .get_texture_sampler_resource(texture) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     fn get_mesh_vertices_resource(&self, mesh: Handle<Mesh>) -> Option<RenderResource> { |  | ||||||
|         self.wgpu_resources |  | ||||||
|             .asset_resources |  | ||||||
|             .get_mesh_vertices_resource(mesh) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     fn get_mesh_indices_resource(&self, mesh: Handle<Mesh>) -> Option<RenderResource> { |  | ||||||
|         self.wgpu_resources |  | ||||||
|             .asset_resources |  | ||||||
|             .get_mesh_indices_resource(mesh) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     fn get_resource_info(&self, resource: RenderResource, handle_info: &mut dyn FnMut(Option<&ResourceInfo>)) { |  | ||||||
|         self.wgpu_resources.get_resource_info(resource, handle_info); |         self.wgpu_resources.get_resource_info(resource, handle_info); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn asset_resources(&self) -> &AssetResources { |  | ||||||
|         &self.wgpu_resources.asset_resources |  | ||||||
|     } |  | ||||||
|     fn asset_resources_mut(&mut self) -> &mut AssetResources { |  | ||||||
|         &mut self.wgpu_resources.asset_resources |  | ||||||
|     } |  | ||||||
|     fn create_shader_module( |     fn create_shader_module( | ||||||
|         &mut self, |         &mut self, | ||||||
|         shader_handle: Handle<Shader>, |         shader_handle: Handle<Shader>, | ||||||
|         shader_storage: &AssetStorage<Shader>, |         shader_storage: &AssetStorage<Shader>, | ||||||
|     ) { |     ) { | ||||||
|         if self.wgpu_resources.shader_modules.read().unwrap().get(&shader_handle).is_some() { |         if self | ||||||
|  |             .wgpu_resources | ||||||
|  |             .shader_modules | ||||||
|  |             .read() | ||||||
|  |             .unwrap() | ||||||
|  |             .get(&shader_handle) | ||||||
|  |             .is_some() | ||||||
|  |         { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -119,7 +96,8 @@ impl RenderResourceContext for WgpuRenderResourceContext { | |||||||
|             .create_shader_module(&self.device, shader_handle, shader); |             .create_shader_module(&self.device, shader_handle, shader); | ||||||
|     } |     } | ||||||
|     fn create_swap_chain(&mut self, window: &Window) { |     fn create_swap_chain(&mut self, window: &Window) { | ||||||
|         self.wgpu_resources.create_window_swap_chain(&self.device, window) |         self.wgpu_resources | ||||||
|  |             .create_window_swap_chain(&self.device, window) | ||||||
|     } |     } | ||||||
|     fn next_swap_chain_texture(&mut self, window_id: bevy_window::WindowId) { |     fn next_swap_chain_texture(&mut self, window_id: bevy_window::WindowId) { | ||||||
|         self.wgpu_resources.next_swap_chain_texture(window_id); |         self.wgpu_resources.next_swap_chain_texture(window_id); | ||||||
| @ -127,4 +105,21 @@ impl RenderResourceContext for WgpuRenderResourceContext { | |||||||
|     fn drop_swap_chain_texture(&mut self, window_id: WindowId) { |     fn drop_swap_chain_texture(&mut self, window_id: WindowId) { | ||||||
|         self.wgpu_resources.remove_swap_chain_texture(window_id); |         self.wgpu_resources.remove_swap_chain_texture(window_id); | ||||||
|     } |     } | ||||||
|  |     fn set_asset_resource_untyped( | ||||||
|  |         &mut self, | ||||||
|  |         handle: HandleUntyped, | ||||||
|  |         render_resource: RenderResource, | ||||||
|  |         index: usize, | ||||||
|  |     ) { | ||||||
|  |         self.wgpu_resources | ||||||
|  |             .set_asset_resource_untyped(handle, render_resource, index); | ||||||
|  |     } | ||||||
|  |     fn get_asset_resource_untyped( | ||||||
|  |         &self, | ||||||
|  |         handle: HandleUntyped, | ||||||
|  |         index: usize, | ||||||
|  |     ) -> Option<RenderResource> { | ||||||
|  |         self.wgpu_resources | ||||||
|  |             .get_asset_resource_untyped(handle, index) | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,9 +1,9 @@ | |||||||
| use crate::{renderer_2::WgpuRenderResourceContext, wgpu_type_converter::WgpuInto}; | use crate::{renderer_2::WgpuRenderResourceContext, wgpu_type_converter::WgpuInto}; | ||||||
| use bevy_asset::Handle; | use bevy_asset::{HandleUntyped, Handle}; | ||||||
| use bevy_render::{ | use bevy_render::{ | ||||||
|     pipeline::{BindGroupDescriptorId, PipelineDescriptor}, |     pipeline::{BindGroupDescriptorId, PipelineDescriptor}, | ||||||
|     render_resource::{ |     render_resource::{ | ||||||
|         AssetResources, BufferInfo, RenderResource, RenderResourceSetId, ResourceInfo, |         BufferInfo, RenderResource, RenderResourceSetId, ResourceInfo, | ||||||
|     }, |     }, | ||||||
|     renderer_2::RenderResourceContext, |     renderer_2::RenderResourceContext, | ||||||
|     shader::Shader, |     shader::Shader, | ||||||
| @ -74,7 +74,6 @@ pub struct WgpuResourceRefs<'a> { | |||||||
| #[derive(Default, Clone)] | #[derive(Default, Clone)] | ||||||
| pub struct WgpuResources { | pub struct WgpuResources { | ||||||
|     // TODO: remove this from WgpuResources. it doesn't need to be here
 |     // TODO: remove this from WgpuResources. it doesn't need to be here
 | ||||||
|     pub asset_resources: AssetResources, |  | ||||||
|     pub window_surfaces: Arc<RwLock<HashMap<WindowId, wgpu::Surface>>>, |     pub window_surfaces: Arc<RwLock<HashMap<WindowId, wgpu::Surface>>>, | ||||||
|     pub window_swap_chains: Arc<RwLock<HashMap<WindowId, wgpu::SwapChain>>>, |     pub window_swap_chains: Arc<RwLock<HashMap<WindowId, wgpu::SwapChain>>>, | ||||||
|     pub swap_chain_outputs: Arc<RwLock<HashMap<WindowId, wgpu::SwapChainOutput>>>, |     pub swap_chain_outputs: Arc<RwLock<HashMap<WindowId, wgpu::SwapChainOutput>>>, | ||||||
| @ -86,6 +85,7 @@ pub struct WgpuResources { | |||||||
|     pub render_pipelines: Arc<RwLock<HashMap<Handle<PipelineDescriptor>, wgpu::RenderPipeline>>>, |     pub render_pipelines: Arc<RwLock<HashMap<Handle<PipelineDescriptor>, wgpu::RenderPipeline>>>, | ||||||
|     pub bind_groups: Arc<RwLock<HashMap<BindGroupDescriptorId, WgpuBindGroupInfo>>>, |     pub bind_groups: Arc<RwLock<HashMap<BindGroupDescriptorId, WgpuBindGroupInfo>>>, | ||||||
|     pub bind_group_layouts: Arc<RwLock<HashMap<BindGroupDescriptorId, wgpu::BindGroupLayout>>>, |     pub bind_group_layouts: Arc<RwLock<HashMap<BindGroupDescriptorId, wgpu::BindGroupLayout>>>, | ||||||
|  |     pub asset_resources: Arc<RwLock<HashMap<(HandleUntyped, usize), RenderResource>>>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl WgpuResources { | impl WgpuResources { | ||||||
| @ -362,12 +362,20 @@ impl WgpuResources { | |||||||
|         self.resource_info.write().unwrap().remove(&resource); |         self.resource_info.write().unwrap().remove(&resource); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn get_render_resources(&self) -> &AssetResources { |     pub fn set_asset_resource<T>(&mut self, handle: Handle<T>, render_resource: RenderResource, index: usize) where T: 'static { | ||||||
|         &self.asset_resources |         self.asset_resources.write().unwrap().insert((handle.into(), index), render_resource); | ||||||
|     } 
 |     } 
 | ||||||
| 
 | 
 | ||||||
|     pub fn get_render_resources_mut(&mut self) -> &mut AssetResources { |     pub fn get_asset_resource<T>(&mut self, handle: Handle<T>, index: usize) -> Option<RenderResource> where T: 'static { | ||||||
|         &mut self.asset_resources |         self.asset_resources.write().unwrap().get(&(handle.into(), index)).cloned() | ||||||
|  |     } 
 | ||||||
|  | 
 | ||||||
|  |     pub fn set_asset_resource_untyped(&mut self, handle: HandleUntyped, render_resource: RenderResource, index: usize) { | ||||||
|  |         self.asset_resources.write().unwrap().insert((handle, index), render_resource); | ||||||
|  |     } 
 | ||||||
|  | 
 | ||||||
|  |     pub fn get_asset_resource_untyped(&self, handle: HandleUntyped, index: usize) -> Option<RenderResource> { | ||||||
|  |         self.asset_resources.write().unwrap().get(&(handle, index)).cloned() | ||||||
|     } 
 |     } 
 | ||||||
| 
 | 
 | ||||||
|     pub fn create_bind_group_layout( |     pub fn create_bind_group_layout( | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Carter Anderson
						Carter Anderson