support downcasting RenderResourceContext ... this should be a part of std!

This commit is contained in:
Carter Anderson 2020-04-15 15:52:29 -07:00
parent 1f5f432e6c
commit c213865cbf
4 changed files with 12 additions and 19 deletions

View file

@ -27,4 +27,5 @@ glam = "0.8.6"
zerocopy = "0.3" zerocopy = "0.3"
bitflags = "1.0" bitflags = "1.0"
# TODO: replace once_cell with std equivalent if/when this lands: https://github.com/rust-lang/rfcs/pull/2788 # TODO: replace once_cell with std equivalent if/when this lands: https://github.com/rust-lang/rfcs/pull/2788
once_cell = "1.3.1" once_cell = "1.3.1"
downcast-rs = "1.1.1"

View file

@ -5,35 +5,24 @@ use crate::{
}; };
use bevy_asset::{AssetStorage, Handle, HandleUntyped}; use bevy_asset::{AssetStorage, Handle, HandleUntyped};
use bevy_window::{Window, WindowId}; use bevy_window::{Window, WindowId};
use std::any::Any; use downcast_rs::{Downcast, impl_downcast};
pub struct GlobalRenderResourceContext { pub struct GlobalRenderResourceContext {
pub context: Box<dyn Any + Send + Sync + 'static>, pub context: Box<dyn RenderResourceContext>,
// TODO: why doesn't this work?
// pub context: Box<dyn RenderResourceContext + Send + Sync + 'static>,
} }
impl GlobalRenderResourceContext { impl GlobalRenderResourceContext {
pub fn new<T>(context: T) -> GlobalRenderResourceContext pub fn new<T>(context: T) -> GlobalRenderResourceContext
where where
T: RenderResourceContext + Send + Sync + 'static, T: RenderResourceContext,
{ {
GlobalRenderResourceContext { GlobalRenderResourceContext {
context: Box::new(context), context: Box::new(context),
} }
} }
// pub fn render_resources_mut(&mut self) -> &dyn RenderResourceContext {
// (&mut self.context).downcast_mut::<dyn RenderResourceContext>()
// }
// pub fn downcast_mut(&self) -> &dyn RenderResourceContext {
// self.context.downcast_ref::<RenderResourceContext>()
// }
} }
// TODO: Rename to RenderResources after cleaning up AssetResources rename pub trait RenderResourceContext: Downcast + Send + Sync + 'static {
pub trait RenderResourceContext: Any {
fn create_swap_chain(&mut self, window: &Window); fn create_swap_chain(&mut self, window: &Window);
fn next_swap_chain_texture(&mut self, window_id: WindowId); fn next_swap_chain_texture(&mut self, window_id: WindowId);
fn drop_swap_chain_texture(&mut self, window_id: WindowId); fn drop_swap_chain_texture(&mut self, window_id: WindowId);
@ -90,3 +79,5 @@ impl dyn RenderResourceContext {
self.get_asset_resource_untyped(handle.into(), index) self.get_asset_resource_untyped(handle.into(), index)
} }
} }
impl_downcast!(RenderResourceContext);

View file

@ -3,7 +3,7 @@ use crate::WgpuResources;
use bevy_asset::{AssetStorage, Handle, HandleUntyped}; use bevy_asset::{AssetStorage, Handle, HandleUntyped};
use bevy_render::{ use bevy_render::{
render_resource::{BufferInfo, RenderResource, ResourceInfo}, render_resource::{BufferInfo, RenderResource, ResourceInfo},
renderer_2::RenderResourceContext, renderer_2::{RenderResourceContext},
shader::Shader, shader::Shader,
texture::{SamplerDescriptor, TextureDescriptor}, texture::{SamplerDescriptor, TextureDescriptor},
}; };
@ -25,6 +25,8 @@ impl WgpuRenderResourceContext {
} }
} }
// impl AnyRenderResourceContext for WgpuRenderResourceContext {}
impl RenderResourceContext for WgpuRenderResourceContext { impl RenderResourceContext for WgpuRenderResourceContext {
fn create_sampler(&mut self, sampler_descriptor: &SamplerDescriptor) -> RenderResource { fn create_sampler(&mut self, sampler_descriptor: &SamplerDescriptor) -> RenderResource {
self.wgpu_resources self.wgpu_resources

View file

@ -12,7 +12,6 @@ use bevy_render::{
use bevy_window::{WindowCreated, WindowResized, Windows}; use bevy_window::{WindowCreated, WindowResized, Windows};
use legion::prelude::*; use legion::prelude::*;
use std::{collections::HashSet, ops::Deref, sync::Arc}; use std::{collections::HashSet, ops::Deref, sync::Arc};
pub struct WgpuRenderer { pub struct WgpuRenderer {
pub device: Arc<wgpu::Device>, pub device: Arc<wgpu::Device>,
pub queue: wgpu::Queue, pub queue: wgpu::Queue,
@ -85,7 +84,6 @@ impl WgpuRenderer {
let world = &*world; let world = &*world;
let resources = &*resources; let resources = &*resources;
actual_thread_count += 1; actual_thread_count += 1;
// println!("spawn {}", resource_provider_chunk.len());
let render_resource_context = render_resource_context.clone(); let render_resource_context = render_resource_context.clone();
s.spawn(move |_| { s.spawn(move |_| {
let mut render_context = let mut render_context =
@ -273,6 +271,7 @@ impl WgpuRenderer {
.context .context
.downcast_mut::<WgpuRenderResourceContext>() .downcast_mut::<WgpuRenderResourceContext>()
.unwrap(); .unwrap();
let mut render_context = let mut render_context =
WgpuRenderContext::new(self.device.clone(), render_resource_context.clone()); WgpuRenderContext::new(self.device.clone(), render_resource_context.clone());
if let Some(command_encoder) = encoder.take() { if let Some(command_encoder) = encoder.take() {