"Arc" device

This commit is contained in:
Carter Anderson 2020-04-09 12:35:15 -07:00
parent d9b2324f08
commit d8c748644c
2 changed files with 14 additions and 21 deletions

View File

@ -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);
} }

View File

@ -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,