add headless render resource context
This commit is contained in:
parent
2fd7020646
commit
012a33ed32
@ -0,0 +1,109 @@
|
|||||||
|
use super::RenderResourceContext;
|
||||||
|
use crate::{
|
||||||
|
render_resource::{BufferInfo, RenderResource, ResourceInfo},
|
||||||
|
shader::Shader,
|
||||||
|
texture::{SamplerDescriptor, TextureDescriptor},
|
||||||
|
};
|
||||||
|
use bevy_asset::{AssetStorage, Handle, HandleUntyped};
|
||||||
|
use bevy_window::{Window, WindowId};
|
||||||
|
use std::{
|
||||||
|
collections::HashMap,
|
||||||
|
sync::{Arc, RwLock},
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct HeadlessRenderResourceContext {
|
||||||
|
resource_info: Arc<RwLock<HashMap<RenderResource, ResourceInfo>>>,
|
||||||
|
pub asset_resources: Arc<RwLock<HashMap<(HandleUntyped, usize), RenderResource>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HeadlessRenderResourceContext {
|
||||||
|
pub fn add_resource_info(&self, resource: RenderResource, resource_info: ResourceInfo) {
|
||||||
|
self.resource_info
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.insert(resource, resource_info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RenderResourceContext for HeadlessRenderResourceContext {
|
||||||
|
fn create_swap_chain(&self, _window: &Window) {}
|
||||||
|
fn next_swap_chain_texture(&self, _window_id: WindowId) -> RenderResource {
|
||||||
|
RenderResource::new()
|
||||||
|
}
|
||||||
|
fn drop_swap_chain_texture(&self, _render_resource: RenderResource) {}
|
||||||
|
fn drop_all_swap_chain_textures(&self) {}
|
||||||
|
fn create_sampler(&self, _sampler_descriptor: &SamplerDescriptor) -> RenderResource {
|
||||||
|
let resource = RenderResource::new();
|
||||||
|
self.add_resource_info(resource, ResourceInfo::Sampler);
|
||||||
|
resource
|
||||||
|
}
|
||||||
|
fn create_texture(&self, _texture_descriptor: &TextureDescriptor) -> RenderResource {
|
||||||
|
let resource = RenderResource::new();
|
||||||
|
self.add_resource_info(resource, ResourceInfo::Texture);
|
||||||
|
resource
|
||||||
|
}
|
||||||
|
fn create_buffer(&self, buffer_info: BufferInfo) -> RenderResource {
|
||||||
|
let resource = RenderResource::new();
|
||||||
|
self.add_resource_info(resource, ResourceInfo::Buffer(buffer_info));
|
||||||
|
resource
|
||||||
|
}
|
||||||
|
fn create_buffer_mapped(
|
||||||
|
&self,
|
||||||
|
buffer_info: BufferInfo,
|
||||||
|
setup_data: &mut dyn FnMut(&mut [u8], &dyn RenderResourceContext),
|
||||||
|
) -> RenderResource {
|
||||||
|
let mut buffer = vec![0; buffer_info.size];
|
||||||
|
setup_data(&mut buffer, self);
|
||||||
|
RenderResource::new()
|
||||||
|
}
|
||||||
|
fn create_buffer_with_data(&self, buffer_info: BufferInfo, _data: &[u8]) -> RenderResource {
|
||||||
|
let resource = RenderResource::new();
|
||||||
|
self.add_resource_info(resource, ResourceInfo::Buffer(buffer_info));
|
||||||
|
resource
|
||||||
|
}
|
||||||
|
fn create_shader_module(
|
||||||
|
&mut self,
|
||||||
|
_shader_handle: Handle<Shader>,
|
||||||
|
_shader_storage: &AssetStorage<Shader>,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
fn remove_buffer(&self, resource: RenderResource) {
|
||||||
|
self.resource_info.write().unwrap().remove(&resource);
|
||||||
|
}
|
||||||
|
fn remove_texture(&self, resource: RenderResource) {
|
||||||
|
self.resource_info.write().unwrap().remove(&resource);
|
||||||
|
}
|
||||||
|
fn remove_sampler(&self, resource: RenderResource) {
|
||||||
|
self.resource_info.write().unwrap().remove(&resource);
|
||||||
|
}
|
||||||
|
fn get_resource_info(
|
||||||
|
&self,
|
||||||
|
resource: RenderResource,
|
||||||
|
handle_info: &mut dyn FnMut(Option<&ResourceInfo>),
|
||||||
|
) {
|
||||||
|
handle_info(self.resource_info.read().unwrap().get(&resource));
|
||||||
|
}
|
||||||
|
fn set_asset_resource_untyped(
|
||||||
|
&self,
|
||||||
|
handle: HandleUntyped,
|
||||||
|
render_resource: RenderResource,
|
||||||
|
index: usize,
|
||||||
|
) {
|
||||||
|
self.asset_resources
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.insert((handle, index), render_resource);
|
||||||
|
}
|
||||||
|
fn get_asset_resource_untyped(
|
||||||
|
&self,
|
||||||
|
handle: HandleUntyped,
|
||||||
|
index: usize,
|
||||||
|
) -> Option<RenderResource> {
|
||||||
|
self.asset_resources
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.get(&(handle, index))
|
||||||
|
.cloned()
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
mod render_context;
|
mod render_context;
|
||||||
mod render_resource_context;
|
mod render_resource_context;
|
||||||
|
mod headless_render_resource_context;
|
||||||
|
|
||||||
pub use render_context::*;
|
pub use render_context::*;
|
||||||
pub use render_resource_context::*;
|
pub use render_resource_context::*;
|
||||||
|
pub use headless_render_resource_context::*;
|
||||||
|
@ -72,7 +72,7 @@ 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
|
pub resource_info: Arc<RwLock<HashMap<RenderResource, ResourceInfo>>>,
|
||||||
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<RenderResource, wgpu::SwapChainOutput>>>,
|
pub swap_chain_outputs: Arc<RwLock<HashMap<RenderResource, wgpu::SwapChainOutput>>>,
|
||||||
@ -80,7 +80,6 @@ pub struct WgpuResources {
|
|||||||
pub texture_views: Arc<RwLock<HashMap<RenderResource, wgpu::TextureView>>>,
|
pub texture_views: Arc<RwLock<HashMap<RenderResource, wgpu::TextureView>>>,
|
||||||
pub textures: Arc<RwLock<HashMap<RenderResource, wgpu::Texture>>>,
|
pub textures: Arc<RwLock<HashMap<RenderResource, wgpu::Texture>>>,
|
||||||
pub samplers: Arc<RwLock<HashMap<RenderResource, wgpu::Sampler>>>,
|
pub samplers: Arc<RwLock<HashMap<RenderResource, wgpu::Sampler>>>,
|
||||||
pub resource_info: Arc<RwLock<HashMap<RenderResource, ResourceInfo>>>,
|
|
||||||
pub shader_modules: Arc<RwLock<HashMap<Handle<Shader>, wgpu::ShaderModule>>>,
|
pub shader_modules: Arc<RwLock<HashMap<Handle<Shader>, wgpu::ShaderModule>>>,
|
||||||
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>>>,
|
||||||
|
Loading…
Reference in New Issue
Block a user