"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 legion::prelude::*;
use std::{
cell::RefCell,
collections::{HashMap, HashSet},
ops::Deref,
rc::Rc,
sync::Arc,
};
pub struct WgpuRenderer {
pub device: Rc<RefCell<wgpu::Device>>,
pub device: Arc<wgpu::Device>,
pub queue: wgpu::Queue,
pub encoder: Option<wgpu::CommandEncoder>,
pub render_pipelines: HashMap<Handle<PipelineDescriptor>, wgpu::RenderPipeline>,
@ -64,7 +63,7 @@ impl WgpuRenderer {
.await;
WgpuRenderer {
device: Rc::new(RefCell::new(device)),
device: Arc::new(device),
queue,
encoder: None,
window_resized_event_reader,
@ -223,7 +222,6 @@ impl WgpuRenderer {
pub fn initialize_resource_providers(&mut self, world: &mut World, resources: &mut Resources) {
self.encoder = Some(
self.device
.borrow()
.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 = self
.device
.borrow()
.create_swap_chain(surface, &swap_chain_descriptor);
self.wgpu_resources
.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.
self.encoder = Some(
self.device
.borrow()
.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 {
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 {
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> {
@ -483,7 +479,7 @@ impl Renderer for WgpuRenderer {
fn create_sampler(&mut self, sampler_descriptor: &SamplerDescriptor) -> RenderResource {
self.wgpu_resources
.create_sampler(&self.device.borrow(), sampler_descriptor)
.create_sampler(&self.device, sampler_descriptor)
}
fn create_texture(
@ -492,7 +488,7 @@ impl Renderer for WgpuRenderer {
bytes: Option<&[u8]>,
) -> RenderResource {
self.wgpu_resources.create_texture(
&self.device.borrow(),
&self.device,
self.encoder.as_mut().unwrap(),
texture_descriptor,
bytes,
@ -530,7 +526,7 @@ impl Renderer for WgpuRenderer {
.get_bind_group(bind_group.id, render_resource_set_id)
{
self.wgpu_resources.create_bind_group(
&self.device.borrow(),
&self.device,
bind_group,
render_resource_assignments,
);
@ -555,7 +551,6 @@ impl Renderer for WgpuRenderer {
return;
}
let device = self.device.borrow();
let layout = pipeline_descriptor.get_layout().unwrap();
for bind_group in layout.bind_groups.iter() {
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>>();
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(),
label: None,
});
@ -592,7 +587,7 @@ impl Renderer for WgpuRenderer {
})
.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(),
});
@ -614,7 +609,7 @@ impl Renderer for WgpuRenderer {
.get(&pipeline_descriptor.shader_stages.vertex)
{
self.wgpu_resources.create_shader_module(
&device,
&self.device,
pipeline_descriptor.shader_stages.vertex,
shader_storage,
);
@ -623,7 +618,7 @@ impl Renderer for WgpuRenderer {
if let Some(fragment_handle) = pipeline_descriptor.shader_stages.fragment {
if let None = self.wgpu_resources.shader_modules.get(&fragment_handle) {
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,
};
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
.insert(pipeline_handle, render_pipeline);
}

View File

@ -197,9 +197,7 @@ impl WgpuResources {
renderer: &mut WgpuRenderer,
setup_data: &mut dyn FnMut(&mut [u8], &mut dyn Renderer),
) -> wgpu::Buffer {
let device_rc = renderer.device.clone();
let device = device_rc.borrow();
let device = renderer.device.clone();
let mut mapped = device.create_buffer_mapped(
&wgpu::BufferDescriptor {
size: buffer_info.size as u64,