"Arc" device
This commit is contained in:
parent
d9b2324f08
commit
d8c748644c
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user