cargo fmt
This commit is contained in:
parent
c213865cbf
commit
71460baa3d
@ -27,7 +27,8 @@ impl DrawTarget for AssignedBatchesDrawTarget {
|
|||||||
resources.get::<RenderResourceAssignments>().unwrap();
|
resources.get::<RenderResourceAssignments>().unwrap();
|
||||||
render_pass.set_render_resources(pipeline_descriptor, &global_render_resource_assignments);
|
render_pass.set_render_resources(pipeline_descriptor, &global_render_resource_assignments);
|
||||||
for batch in asset_batches.get_batches() {
|
for batch in asset_batches.get_batches() {
|
||||||
let indices = render_pass.set_render_resources(pipeline_descriptor, &batch.render_resource_assignments);
|
let indices = render_pass
|
||||||
|
.set_render_resources(pipeline_descriptor, &batch.render_resource_assignments);
|
||||||
log::trace!("drawing batch {:?}", batch.render_resource_assignments.id);
|
log::trace!("drawing batch {:?}", batch.render_resource_assignments.id);
|
||||||
log::trace!("{:#?}", batch);
|
log::trace!("{:#?}", batch);
|
||||||
for batched_entity in batch.entities.iter() {
|
for batched_entity in batch.entities.iter() {
|
||||||
@ -38,8 +39,10 @@ impl DrawTarget for AssignedBatchesDrawTarget {
|
|||||||
|
|
||||||
log::trace!("start drawing batched entity: {:?}", batched_entity);
|
log::trace!("start drawing batched entity: {:?}", batched_entity);
|
||||||
log::trace!("{:#?}", renderable.render_resource_assignments);
|
log::trace!("{:#?}", renderable.render_resource_assignments);
|
||||||
let entity_indices =
|
let entity_indices = render_pass.set_render_resources(
|
||||||
render_pass.set_render_resources(pipeline_descriptor, &renderable.render_resource_assignments);
|
pipeline_descriptor,
|
||||||
|
&renderable.render_resource_assignments,
|
||||||
|
);
|
||||||
let mut draw_indices = &indices;
|
let mut draw_indices = &indices;
|
||||||
if entity_indices.is_some() {
|
if entity_indices.is_some() {
|
||||||
if indices.is_some() {
|
if indices.is_some() {
|
||||||
|
|||||||
@ -53,11 +53,12 @@ impl DrawTarget for AssignedMeshesDrawTarget {
|
|||||||
let render_context = render_pass.get_render_context();
|
let render_context = render_pass.get_render_context();
|
||||||
let render_resources = render_context.resources();
|
let render_resources = render_context.resources();
|
||||||
if current_mesh_handle != Some(mesh_handle) {
|
if current_mesh_handle != Some(mesh_handle) {
|
||||||
if let Some(vertex_buffer_resource) =
|
if let Some(vertex_buffer_resource) = render_resources
|
||||||
render_resources.get_asset_resource(mesh_handle, mesh::VERTEX_BUFFER_ASSET_INDEX)
|
.get_asset_resource(mesh_handle, mesh::VERTEX_BUFFER_ASSET_INDEX)
|
||||||
{
|
{
|
||||||
let index_buffer_resource =
|
let index_buffer_resource = render_resources
|
||||||
render_resources.get_asset_resource(mesh_handle, mesh::INDEX_BUFFER_ASSET_INDEX).unwrap();
|
.get_asset_resource(mesh_handle, mesh::INDEX_BUFFER_ASSET_INDEX)
|
||||||
|
.unwrap();
|
||||||
render_resources.get_resource_info(
|
render_resources.get_resource_info(
|
||||||
index_buffer_resource,
|
index_buffer_resource,
|
||||||
&mut |resource_info| match resource_info {
|
&mut |resource_info| match resource_info {
|
||||||
|
|||||||
@ -32,19 +32,21 @@ impl DrawTarget for MeshesDrawTarget {
|
|||||||
let render_context = render_pass.get_render_context();
|
let render_context = render_pass.get_render_context();
|
||||||
let render_resources = render_context.resources();
|
let render_resources = render_context.resources();
|
||||||
if current_mesh_handle != Some(*mesh_handle) {
|
if current_mesh_handle != Some(*mesh_handle) {
|
||||||
if let Some(vertex_buffer_resource) =
|
if let Some(vertex_buffer_resource) = render_resources
|
||||||
render_resources.get_asset_resource(*mesh_handle, mesh::VERTEX_BUFFER_ASSET_INDEX)
|
.get_asset_resource(*mesh_handle, mesh::VERTEX_BUFFER_ASSET_INDEX)
|
||||||
{
|
{
|
||||||
let index_buffer_resource =
|
let index_buffer_resource = render_resources
|
||||||
render_resources.get_asset_resource(*mesh_handle, mesh::INDEX_BUFFER_ASSET_INDEX).unwrap();
|
.get_asset_resource(*mesh_handle, mesh::INDEX_BUFFER_ASSET_INDEX)
|
||||||
render_resources.get_resource_info(index_buffer_resource, &mut |resource_info| {
|
.unwrap();
|
||||||
match resource_info {
|
render_resources.get_resource_info(
|
||||||
|
index_buffer_resource,
|
||||||
|
&mut |resource_info| match resource_info {
|
||||||
Some(ResourceInfo::Buffer(buffer_info)) => {
|
Some(ResourceInfo::Buffer(buffer_info)) => {
|
||||||
current_mesh_index_len = (buffer_info.size / 2) as u32
|
current_mesh_index_len = (buffer_info.size / 2) as u32
|
||||||
}
|
}
|
||||||
_ => panic!("expected a buffer type"),
|
_ => panic!("expected a buffer type"),
|
||||||
}
|
},
|
||||||
});
|
);
|
||||||
render_pass.set_index_buffer(index_buffer_resource, 0);
|
render_pass.set_index_buffer(index_buffer_resource, 0);
|
||||||
render_pass.set_vertex_buffer(0, vertex_buffer_resource, 0);
|
render_pass.set_vertex_buffer(0, vertex_buffer_resource, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -42,9 +42,9 @@ impl DrawTarget for UiDrawTarget {
|
|||||||
let index_count = {
|
let index_count = {
|
||||||
let mut index_count = None;
|
let mut index_count = None;
|
||||||
let render_context = render_pass.get_render_context();
|
let render_context = render_pass.get_render_context();
|
||||||
render_context
|
render_context.resources().get_resource_info(
|
||||||
.resources()
|
ui_instances_buffer,
|
||||||
.get_resource_info(ui_instances_buffer, &mut |resource_info| {
|
&mut |resource_info| {
|
||||||
if let Some(ResourceInfo::Buffer(BufferInfo {
|
if let Some(ResourceInfo::Buffer(BufferInfo {
|
||||||
array_info: Some(array_info),
|
array_info: Some(array_info),
|
||||||
..
|
..
|
||||||
@ -52,7 +52,8 @@ impl DrawTarget for UiDrawTarget {
|
|||||||
{
|
{
|
||||||
index_count = Some(array_info.item_capacity);
|
index_count = Some(array_info.item_capacity);
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
index_count
|
index_count
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -3,8 +3,8 @@ use crate::{
|
|||||||
render_resource::{RenderResource, RenderResourceAssignments},
|
render_resource::{RenderResource, RenderResourceAssignments},
|
||||||
renderer_2::RenderContext,
|
renderer_2::RenderContext,
|
||||||
};
|
};
|
||||||
use std::ops::Range;
|
|
||||||
use bevy_asset::Handle;
|
use bevy_asset::Handle;
|
||||||
|
use std::ops::Range;
|
||||||
|
|
||||||
pub trait RenderPass {
|
pub trait RenderPass {
|
||||||
fn get_render_context(&self) -> &dyn RenderContext;
|
fn get_render_context(&self) -> &dyn RenderContext;
|
||||||
|
|||||||
@ -60,22 +60,21 @@ impl PipelineCompiler {
|
|||||||
for bind_group in layout.bind_groups.iter_mut() {
|
for bind_group in layout.bind_groups.iter_mut() {
|
||||||
for binding in bind_group.bindings.iter_mut() {
|
for binding in bind_group.bindings.iter_mut() {
|
||||||
if let Some(render_resource) = render_resource_assignments.get(&binding.name) {
|
if let Some(render_resource) = render_resource_assignments.get(&binding.name) {
|
||||||
render_context.resources().get_resource_info(
|
render_context.resources().get_resource_info(
|
||||||
render_resource,
|
render_resource,
|
||||||
&mut |resource_info| {
|
&mut |resource_info| {
|
||||||
if let Some(ResourceInfo::Buffer(BufferInfo {
|
if let Some(ResourceInfo::Buffer(BufferInfo { is_dynamic, .. })) =
|
||||||
is_dynamic, ..
|
resource_info
|
||||||
})) = resource_info
|
{
|
||||||
|
if let BindType::Uniform {
|
||||||
|
ref mut dynamic, ..
|
||||||
|
} = binding.bind_type
|
||||||
{
|
{
|
||||||
if let BindType::Uniform {
|
*dynamic = *is_dynamic
|
||||||
ref mut dynamic, ..
|
|
||||||
} = binding.bind_type
|
|
||||||
{
|
|
||||||
*dynamic = *is_dynamic
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,4 +8,4 @@ impl RenderResource {
|
|||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
RenderResource(Uuid::new_v4())
|
RenderResource(Uuid::new_v4())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,33 +23,42 @@ impl MeshResourceProvider {
|
|||||||
render_resource_assignments: &mut RenderResourceAssignments,
|
render_resource_assignments: &mut RenderResourceAssignments,
|
||||||
) {
|
) {
|
||||||
let render_resources = render_context.resources_mut();
|
let render_resources = render_context.resources_mut();
|
||||||
let (vertex_buffer, index_buffer) =
|
let (vertex_buffer, index_buffer) = if let Some(vertex_buffer) =
|
||||||
if let Some(vertex_buffer) = render_resources.get_asset_resource(handle, mesh::VERTEX_BUFFER_ASSET_INDEX) {
|
render_resources.get_asset_resource(handle, mesh::VERTEX_BUFFER_ASSET_INDEX)
|
||||||
(
|
{
|
||||||
vertex_buffer,
|
(
|
||||||
render_resources.get_asset_resource(handle, mesh::INDEX_BUFFER_ASSET_INDEX),
|
vertex_buffer,
|
||||||
)
|
render_resources.get_asset_resource(handle, mesh::INDEX_BUFFER_ASSET_INDEX),
|
||||||
} else {
|
)
|
||||||
let mesh_asset = mesh_storage.get(&handle).unwrap();
|
} else {
|
||||||
let vertex_buffer = render_resources.create_buffer_with_data(
|
let mesh_asset = mesh_storage.get(&handle).unwrap();
|
||||||
BufferInfo {
|
let vertex_buffer = render_resources.create_buffer_with_data(
|
||||||
buffer_usage: BufferUsage::VERTEX,
|
BufferInfo {
|
||||||
..Default::default()
|
buffer_usage: BufferUsage::VERTEX,
|
||||||
},
|
..Default::default()
|
||||||
mesh_asset.vertices.as_bytes(),
|
},
|
||||||
);
|
mesh_asset.vertices.as_bytes(),
|
||||||
let index_buffer = render_resources.create_buffer_with_data(
|
);
|
||||||
BufferInfo {
|
let index_buffer = render_resources.create_buffer_with_data(
|
||||||
buffer_usage: BufferUsage::INDEX,
|
BufferInfo {
|
||||||
..Default::default()
|
buffer_usage: BufferUsage::INDEX,
|
||||||
},
|
..Default::default()
|
||||||
mesh_asset.indices.as_bytes(),
|
},
|
||||||
);
|
mesh_asset.indices.as_bytes(),
|
||||||
|
);
|
||||||
|
|
||||||
render_resources.set_asset_resource(handle, vertex_buffer, mesh::VERTEX_BUFFER_ASSET_INDEX);
|
render_resources.set_asset_resource(
|
||||||
render_resources.set_asset_resource(handle, index_buffer, mesh::INDEX_BUFFER_ASSET_INDEX);
|
handle,
|
||||||
(vertex_buffer, Some(index_buffer))
|
vertex_buffer,
|
||||||
};
|
mesh::VERTEX_BUFFER_ASSET_INDEX,
|
||||||
|
);
|
||||||
|
render_resources.set_asset_resource(
|
||||||
|
handle,
|
||||||
|
index_buffer,
|
||||||
|
mesh::INDEX_BUFFER_ASSET_INDEX,
|
||||||
|
);
|
||||||
|
(vertex_buffer, Some(index_buffer))
|
||||||
|
};
|
||||||
|
|
||||||
render_resource_assignments.set_vertex_buffer("Vertex", vertex_buffer, index_buffer);
|
render_resource_assignments.set_vertex_buffer("Vertex", vertex_buffer, index_buffer);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
renderer_2::{RenderContext, RenderResourceContext},
|
renderer_2::{RenderContext, RenderResourceContext},
|
||||||
shader::{AsUniforms, FieldBindType},
|
shader::{AsUniforms, FieldBindType},
|
||||||
texture::{SamplerDescriptor, Texture, TextureDescriptor, self},
|
texture::{self, SamplerDescriptor, Texture, TextureDescriptor},
|
||||||
Renderable,
|
Renderable,
|
||||||
};
|
};
|
||||||
use bevy_asset::{AssetStorage, Handle};
|
use bevy_asset::{AssetStorage, Handle};
|
||||||
@ -401,9 +401,16 @@ where
|
|||||||
let sampler_resource =
|
let sampler_resource =
|
||||||
render_resources.create_sampler(&sampler_descriptor);
|
render_resources.create_sampler(&sampler_descriptor);
|
||||||
|
|
||||||
render_resources.set_asset_resource(texture_handle, texture_resource, 0);
|
render_resources.set_asset_resource(
|
||||||
render_resources
|
texture_handle,
|
||||||
.set_asset_resource(texture_handle, sampler_resource, 1);
|
texture_resource,
|
||||||
|
0,
|
||||||
|
);
|
||||||
|
render_resources.set_asset_resource(
|
||||||
|
texture_handle,
|
||||||
|
sampler_resource,
|
||||||
|
1,
|
||||||
|
);
|
||||||
(texture_resource, sampler_resource)
|
(texture_resource, sampler_resource)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -50,6 +50,6 @@ pub trait RenderContext {
|
|||||||
&mut self,
|
&mut self,
|
||||||
pass_descriptor: &PassDescriptor,
|
pass_descriptor: &PassDescriptor,
|
||||||
render_resource_assignments: &RenderResourceAssignments,
|
render_resource_assignments: &RenderResourceAssignments,
|
||||||
run_pass: &mut dyn Fn(&mut dyn RenderPass)
|
run_pass: &mut dyn Fn(&mut dyn RenderPass),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@ 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 downcast_rs::{Downcast, impl_downcast};
|
use downcast_rs::{impl_downcast, Downcast};
|
||||||
|
|
||||||
pub struct GlobalRenderResourceContext {
|
pub struct GlobalRenderResourceContext {
|
||||||
pub context: Box<dyn RenderResourceContext>,
|
pub context: Box<dyn RenderResourceContext>,
|
||||||
@ -80,4 +80,4 @@ impl dyn RenderResourceContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl_downcast!(RenderResourceContext);
|
impl_downcast!(RenderResourceContext);
|
||||||
|
|||||||
@ -170,7 +170,9 @@ impl RenderContext for WgpuRenderContext {
|
|||||||
BindType::SampledTexture { .. } => {
|
BindType::SampledTexture { .. } => {
|
||||||
if let Some(ResourceInfo::Texture) = resource_info {
|
if let Some(ResourceInfo::Texture) = resource_info {
|
||||||
let texture = textures.get(&resource).unwrap();
|
let texture = textures.get(&resource).unwrap();
|
||||||
Some(wgpu::BindingResource::TextureView(texture))
|
Some(wgpu::BindingResource::TextureView(
|
||||||
|
texture,
|
||||||
|
))
|
||||||
} else {
|
} else {
|
||||||
panic!("expected a Texture resource");
|
panic!("expected a Texture resource");
|
||||||
}
|
}
|
||||||
@ -268,7 +270,8 @@ impl RenderContext for WgpuRenderContext {
|
|||||||
.bind_group_layouts
|
.bind_group_layouts
|
||||||
.read()
|
.read()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.get(&bind_group.id).is_none()
|
.get(&bind_group.id)
|
||||||
|
.is_none()
|
||||||
{
|
{
|
||||||
let bind_group_layout_binding = bind_group
|
let bind_group_layout_binding = bind_group
|
||||||
.bindings
|
.bindings
|
||||||
|
|||||||
@ -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,8 +25,6 @@ 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
|
||||||
|
|||||||
@ -23,21 +23,13 @@ impl<'a> RenderPass for WgpuRenderPass<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn set_vertex_buffer(&mut self, start_slot: u32, resource: RenderResource, offset: u64) {
|
fn set_vertex_buffer(&mut self, start_slot: u32, resource: RenderResource, offset: u64) {
|
||||||
let buffer = self
|
let buffer = self.render_resources.buffers.get(&resource).unwrap();
|
||||||
.render_resources
|
|
||||||
.buffers
|
|
||||||
.get(&resource)
|
|
||||||
.unwrap();
|
|
||||||
self.render_pass
|
self.render_pass
|
||||||
.set_vertex_buffer(start_slot, &buffer, offset, 0);
|
.set_vertex_buffer(start_slot, &buffer, offset, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_index_buffer(&mut self, resource: RenderResource, offset: u64) {
|
fn set_index_buffer(&mut self, resource: RenderResource, offset: u64) {
|
||||||
let buffer = self
|
let buffer = self.render_resources.buffers.get(&resource).unwrap();
|
||||||
.render_resources
|
|
||||||
.buffers
|
|
||||||
.get(&resource)
|
|
||||||
.unwrap();
|
|
||||||
self.render_pass.set_index_buffer(&buffer, offset, 0);
|
self.render_pass.set_index_buffer(&buffer, offset, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,10 +84,7 @@ impl<'a> RenderPass for WgpuRenderPass<'a> {
|
|||||||
if let Some((render_resource_set_id, dynamic_uniform_indices)) =
|
if let Some((render_resource_set_id, dynamic_uniform_indices)) =
|
||||||
render_resource_assignments.get_render_resource_set_id(bind_group.id)
|
render_resource_assignments.get_render_resource_set_id(bind_group.id)
|
||||||
{
|
{
|
||||||
if let Some(bind_group_info) = self
|
if let Some(bind_group_info) = self.render_resources.bind_groups.get(&bind_group.id)
|
||||||
.render_resources
|
|
||||||
.bind_groups
|
|
||||||
.get(&bind_group.id)
|
|
||||||
{
|
{
|
||||||
if let Some(wgpu_bind_group) =
|
if let Some(wgpu_bind_group) =
|
||||||
bind_group_info.bind_groups.get(render_resource_set_id)
|
bind_group_info.bind_groups.get(render_resource_set_id)
|
||||||
|
|||||||
@ -1,10 +1,8 @@
|
|||||||
use crate::{renderer_2::WgpuRenderResourceContext, wgpu_type_converter::WgpuInto};
|
use crate::{renderer_2::WgpuRenderResourceContext, wgpu_type_converter::WgpuInto};
|
||||||
use bevy_asset::{HandleUntyped, Handle};
|
use bevy_asset::{Handle, HandleUntyped};
|
||||||
use bevy_render::{
|
use bevy_render::{
|
||||||
pipeline::{BindGroupDescriptorId, PipelineDescriptor},
|
pipeline::{BindGroupDescriptorId, PipelineDescriptor},
|
||||||
render_resource::{
|
render_resource::{BufferInfo, RenderResource, RenderResourceSetId, ResourceInfo},
|
||||||
BufferInfo, RenderResource, RenderResourceSetId, ResourceInfo,
|
|
||||||
},
|
|
||||||
renderer_2::RenderResourceContext,
|
renderer_2::RenderResourceContext,
|
||||||
shader::Shader,
|
shader::Shader,
|
||||||
texture::{SamplerDescriptor, TextureDescriptor},
|
texture::{SamplerDescriptor, TextureDescriptor},
|
||||||
@ -20,33 +18,34 @@ pub struct WgpuBindGroupInfo {
|
|||||||
pub bind_groups: HashMap<RenderResourceSetId, wgpu::BindGroup>,
|
pub bind_groups: HashMap<RenderResourceSetId, wgpu::BindGroup>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Grabs a read lock on all wgpu resources. When paired with WgpuResourceRefs, this allows
|
/// Grabs a read lock on all wgpu resources. When paired with WgpuResourceRefs, this allows
|
||||||
/// us to pass in wgpu resources to wgpu::RenderPass<'a> with the appropriate lifetime. This is accomplished by
|
/// us to pass in wgpu resources to wgpu::RenderPass<'a> with the appropriate lifetime. This is accomplished by
|
||||||
/// grabbing a WgpuResourcesReadLock _before_ creating a wgpu::RenderPass, getting a WgpuResourcesRefs, and storing that
|
/// grabbing a WgpuResourcesReadLock _before_ creating a wgpu::RenderPass, getting a WgpuResourcesRefs, and storing that
|
||||||
/// in the pass.
|
/// in the pass.
|
||||||
///
|
///
|
||||||
/// This is only a problem because RwLockReadGuard.read() erases the guard's lifetime and creates a new anonymous lifetime. If
|
/// This is only a problem because RwLockReadGuard.read() erases the guard's lifetime and creates a new anonymous lifetime. If
|
||||||
/// you call RwLockReadGuard.read() during a pass, the reference will have an anonymous lifetime that lives for less than the
|
/// you call RwLockReadGuard.read() during a pass, the reference will have an anonymous lifetime that lives for less than the
|
||||||
/// pass, which violates the lifetime constraints in place.
|
/// pass, which violates the lifetime constraints in place.
|
||||||
///
|
///
|
||||||
/// The biggest implication of this design (other than the additional boilerplate here) is that beginning a render pass
|
/// The biggest implication of this design (other than the additional boilerplate here) is that beginning a render pass
|
||||||
/// blocks writes to these resources. This means that if the pass attempts to write any resource, a deadlock will occur. WgpuResourceRefs
|
/// blocks writes to these resources. This means that if the pass attempts to write any resource, a deadlock will occur. WgpuResourceRefs
|
||||||
/// only has immutable references, so the only way to make a deadlock happen is to access WgpuResources directly in the pass. It also means
|
/// only has immutable references, so the only way to make a deadlock happen is to access WgpuResources directly in the pass. It also means
|
||||||
/// that other threads attempting to write resources will need to wait for pass encoding to finish. Almost all writes should occur before
|
/// that other threads attempting to write resources will need to wait for pass encoding to finish. Almost all writes should occur before
|
||||||
/// passes start, so this hopefully won't be a problem.
|
/// passes start, so this hopefully won't be a problem.
|
||||||
///
|
///
|
||||||
/// It is worth comparing the performance of this to transactional / copy-based approaches. This lock based design guarantees
|
/// It is worth comparing the performance of this to transactional / copy-based approaches. This lock based design guarantees
|
||||||
/// consistency, doesn't perform redundant allocations, and only blocks when a write is occurring. A copy based approach would
|
/// consistency, doesn't perform redundant allocations, and only blocks when a write is occurring. A copy based approach would
|
||||||
/// never block, but would require more allocations / state-synchronization, which I expect will be more expensive. It would also be
|
/// never block, but would require more allocations / state-synchronization, which I expect will be more expensive. It would also be
|
||||||
/// "eventually consistent" instead of "strongly consistent".
|
/// "eventually consistent" instead of "strongly consistent".
|
||||||
///
|
///
|
||||||
/// Single threaded implementations don't need to worry about these lifetimes constraints at all. RenderPasses can use a RenderContext's
|
/// Single threaded implementations don't need to worry about these lifetimes constraints at all. RenderPasses can use a RenderContext's
|
||||||
/// WgpuResources directly. RenderContext already has a lifetime greater than the RenderPass.
|
/// WgpuResources directly. RenderContext already has a lifetime greater than the RenderPass.
|
||||||
pub struct WgpuResourcesReadLock<'a> {
|
pub struct WgpuResourcesReadLock<'a> {
|
||||||
pub buffers: RwLockReadGuard<'a, HashMap<RenderResource, wgpu::Buffer>>,
|
pub buffers: RwLockReadGuard<'a, HashMap<RenderResource, wgpu::Buffer>>,
|
||||||
pub textures: RwLockReadGuard<'a, HashMap<RenderResource, wgpu::TextureView>>,
|
pub textures: RwLockReadGuard<'a, HashMap<RenderResource, wgpu::TextureView>>,
|
||||||
pub swap_chain_outputs: RwLockReadGuard<'a, HashMap<WindowId, wgpu::SwapChainOutput>>,
|
pub swap_chain_outputs: RwLockReadGuard<'a, HashMap<WindowId, wgpu::SwapChainOutput>>,
|
||||||
pub render_pipelines: RwLockReadGuard<'a, HashMap<Handle<PipelineDescriptor>, wgpu::RenderPipeline>>,
|
pub render_pipelines:
|
||||||
|
RwLockReadGuard<'a, HashMap<Handle<PipelineDescriptor>, wgpu::RenderPipeline>>,
|
||||||
pub bind_groups: RwLockReadGuard<'a, HashMap<BindGroupDescriptorId, WgpuBindGroupInfo>>,
|
pub bind_groups: RwLockReadGuard<'a, HashMap<BindGroupDescriptorId, WgpuBindGroupInfo>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,10 +58,10 @@ impl<'a> WgpuResourcesReadLock<'a> {
|
|||||||
render_pipelines: &self.render_pipelines,
|
render_pipelines: &self.render_pipelines,
|
||||||
bind_groups: &self.bind_groups,
|
bind_groups: &self.bind_groups,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Stores read only references to WgpuResource collections. See WgpuResourcesReadLock docs for context on why this exists
|
/// Stores read only references to WgpuResource collections. See WgpuResourcesReadLock docs for context on why this exists
|
||||||
pub struct WgpuResourceRefs<'a> {
|
pub struct WgpuResourceRefs<'a> {
|
||||||
pub buffers: &'a HashMap<RenderResource, wgpu::Buffer>,
|
pub buffers: &'a HashMap<RenderResource, wgpu::Buffer>,
|
||||||
pub textures: &'a HashMap<RenderResource, wgpu::TextureView>,
|
pub textures: &'a HashMap<RenderResource, wgpu::TextureView>,
|
||||||
@ -97,7 +96,7 @@ impl WgpuResources {
|
|||||||
render_pipelines: self.render_pipelines.read().unwrap(),
|
render_pipelines: self.render_pipelines.read().unwrap(),
|
||||||
bind_groups: self.bind_groups.read().unwrap(),
|
bind_groups: self.bind_groups.read().unwrap(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_window_surface(&self, window_id: WindowId, surface: wgpu::Surface) {
|
pub fn set_window_surface(&self, window_id: WindowId, surface: wgpu::Surface) {
|
||||||
self.window_surfaces
|
self.window_surfaces
|
||||||
@ -107,13 +106,8 @@ impl WgpuResources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn next_swap_chain_texture(&self, window_id: WindowId) {
|
pub fn next_swap_chain_texture(&self, window_id: WindowId) {
|
||||||
let mut swap_chain_outputs = self
|
let mut swap_chain_outputs = self.window_swap_chains.write().unwrap();
|
||||||
.window_swap_chains
|
let swap_chain_output = swap_chain_outputs.get_mut(&window_id).unwrap();
|
||||||
.write()
|
|
||||||
.unwrap();
|
|
||||||
let swap_chain_output = swap_chain_outputs
|
|
||||||
.get_mut(&window_id)
|
|
||||||
.unwrap();
|
|
||||||
let next_texture = swap_chain_output.get_next_texture().unwrap();
|
let next_texture = swap_chain_output.get_next_texture().unwrap();
|
||||||
self.swap_chain_outputs
|
self.swap_chain_outputs
|
||||||
.write()
|
.write()
|
||||||
@ -160,7 +154,10 @@ impl WgpuResources {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.get(&bind_group_descriptor_id)
|
.get(&bind_group_descriptor_id)
|
||||||
{
|
{
|
||||||
bind_group_info.bind_groups.get(&render_resource_set_id).is_some()
|
bind_group_info
|
||||||
|
.bind_groups
|
||||||
|
.get(&render_resource_set_id)
|
||||||
|
.is_some()
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
@ -186,10 +183,7 @@ impl WgpuResources {
|
|||||||
render_resource_set_id: RenderResourceSetId,
|
render_resource_set_id: RenderResourceSetId,
|
||||||
bind_group: wgpu::BindGroup,
|
bind_group: wgpu::BindGroup,
|
||||||
) {
|
) {
|
||||||
let mut bind_groups = self
|
let mut bind_groups = self.bind_groups.write().unwrap();
|
||||||
.bind_groups
|
|
||||||
.write()
|
|
||||||
.unwrap();
|
|
||||||
let bind_group_info = bind_groups
|
let bind_group_info = bind_groups
|
||||||
.entry(bind_group_descriptor_id)
|
.entry(bind_group_descriptor_id)
|
||||||
.or_insert_with(|| WgpuBindGroupInfo::default());
|
.or_insert_with(|| WgpuBindGroupInfo::default());
|
||||||
@ -224,7 +218,11 @@ impl WgpuResources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: taking a closure isn't fantastic. is there any way to make this better without exposing the lock in the interface?
|
// TODO: taking a closure isn't fantastic. is there any way to make this better without exposing the lock in the interface?
|
||||||
pub fn get_resource_info(&self, resource: RenderResource, handle_info: &mut dyn FnMut(Option<&ResourceInfo>)) {
|
pub fn get_resource_info(
|
||||||
|
&self,
|
||||||
|
resource: RenderResource,
|
||||||
|
handle_info: &mut dyn FnMut(Option<&ResourceInfo>),
|
||||||
|
) {
|
||||||
let resource_info = self.resource_info.read().unwrap();
|
let resource_info = self.resource_info.read().unwrap();
|
||||||
let info = resource_info.get(&resource);
|
let info = resource_info.get(&resource);
|
||||||
handle_info(info);
|
handle_info(info);
|
||||||
@ -362,21 +360,58 @@ impl WgpuResources {
|
|||||||
self.resource_info.write().unwrap().remove(&resource);
|
self.resource_info.write().unwrap().remove(&resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_asset_resource<T>(&mut self, handle: Handle<T>, render_resource: RenderResource, index: usize) where T: 'static {
|
pub fn set_asset_resource<T>(
|
||||||
self.asset_resources.write().unwrap().insert((handle.into(), index), render_resource);
|
&mut self,
|
||||||
}
|
handle: Handle<T>,
|
||||||
|
render_resource: RenderResource,
|
||||||
|
index: usize,
|
||||||
|
) where
|
||||||
|
T: 'static,
|
||||||
|
{
|
||||||
|
self.asset_resources
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.insert((handle.into(), index), render_resource);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_asset_resource<T>(&mut self, handle: Handle<T>, index: usize) -> Option<RenderResource> where T: 'static {
|
pub fn get_asset_resource<T>(
|
||||||
self.asset_resources.write().unwrap().get(&(handle.into(), index)).cloned()
|
&mut self,
|
||||||
}
|
handle: Handle<T>,
|
||||||
|
index: usize,
|
||||||
|
) -> Option<RenderResource>
|
||||||
|
where
|
||||||
|
T: 'static,
|
||||||
|
{
|
||||||
|
self.asset_resources
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.get(&(handle.into(), index))
|
||||||
|
.cloned()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_asset_resource_untyped(&mut self, handle: HandleUntyped, render_resource: RenderResource, index: usize) {
|
pub fn set_asset_resource_untyped(
|
||||||
self.asset_resources.write().unwrap().insert((handle, index), render_resource);
|
&mut self,
|
||||||
}
|
handle: HandleUntyped,
|
||||||
|
render_resource: RenderResource,
|
||||||
|
index: usize,
|
||||||
|
) {
|
||||||
|
self.asset_resources
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.insert((handle, index), render_resource);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_asset_resource_untyped(&self, handle: HandleUntyped, index: usize) -> Option<RenderResource> {
|
pub fn get_asset_resource_untyped(
|
||||||
self.asset_resources.write().unwrap().get(&(handle, index)).cloned()
|
&self,
|
||||||
}
|
handle: HandleUntyped,
|
||||||
|
index: usize,
|
||||||
|
) -> Option<RenderResource> {
|
||||||
|
self.asset_resources
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.get(&(handle, index))
|
||||||
|
.cloned()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn create_bind_group_layout(
|
pub fn create_bind_group_layout(
|
||||||
&self,
|
&self,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user