From f4acbdddad90c288d6ca7aa55115bdb8004bebcc Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Tue, 16 Jun 2020 22:23:33 -0700 Subject: [PATCH] SharedBuffersNode --- crates/bevy_asset/src/handle.rs | 4 +++ .../bevy_render/src/base_render_graph/mod.rs | 8 ++++- .../render_graph/nodes/shared_buffers_node.rs | 24 +++++++++++++ crates/bevy_render/src/render_resource/mod.rs | 4 +-- .../{shared_buffer.rs => shared_buffers.rs} | 36 ++++++++++++++++--- 5 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 crates/bevy_render/src/render_graph/nodes/shared_buffers_node.rs rename crates/bevy_render/src/render_resource/{shared_buffer.rs => shared_buffers.rs} (60%) diff --git a/crates/bevy_asset/src/handle.rs b/crates/bevy_asset/src/handle.rs index ce28a6d8aa..a29e84f73d 100644 --- a/crates/bevy_asset/src/handle.rs +++ b/crates/bevy_asset/src/handle.rs @@ -37,6 +37,10 @@ impl Handle { } } + pub fn as_handle(&self) -> Handle { + Handle::from_id(self.id) + } + pub const fn from_id(id: HandleId) -> Self { Handle { id, diff --git a/crates/bevy_render/src/base_render_graph/mod.rs b/crates/bevy_render/src/base_render_graph/mod.rs index 19c102d215..7add9c11c5 100644 --- a/crates/bevy_render/src/base_render_graph/mod.rs +++ b/crates/bevy_render/src/base_render_graph/mod.rs @@ -5,7 +5,8 @@ use crate::{ }, render_graph::{ nodes::{ - CameraNode, MainPassNode, TextureCopyNode, WindowSwapChainNode, WindowTextureNode, + CameraNode, MainPassNode, SharedBuffersNode, TextureCopyNode, WindowSwapChainNode, + WindowTextureNode, }, RenderGraph, }, @@ -30,6 +31,7 @@ pub mod node { pub const TEXTURE_COPY: &str = "texture_copy"; pub const MAIN_DEPTH_TEXTURE: &str = "main_pass_depth_texture"; pub const MAIN_PASS: &str = "main_pass"; + pub const SHARED_BUFFERS: &str = "shared_buffers"; } pub mod uniform { @@ -67,6 +69,7 @@ impl BaseRenderGraphBuilder for RenderGraph { self.add_system_node(node::CAMERA2D, CameraNode::new(uniform::CAMERA2D)); } + self.add_node(node::SHARED_BUFFERS, SharedBuffersNode::default()); if config.add_main_depth_texture { self.add_node( node::MAIN_DEPTH_TEXTURE, @@ -116,6 +119,9 @@ impl BaseRenderGraphBuilder for RenderGraph { self.add_node_edge(node::TEXTURE_COPY, node::MAIN_PASS) .unwrap(); + self.add_node_edge(node::SHARED_BUFFERS, node::MAIN_PASS) + .unwrap(); + if config.add_3d_camera { self.add_node_edge(node::CAMERA, node::MAIN_PASS).unwrap(); } diff --git a/crates/bevy_render/src/render_graph/nodes/shared_buffers_node.rs b/crates/bevy_render/src/render_graph/nodes/shared_buffers_node.rs new file mode 100644 index 0000000000..b651acb1b5 --- /dev/null +++ b/crates/bevy_render/src/render_graph/nodes/shared_buffers_node.rs @@ -0,0 +1,24 @@ +use crate::{ + render_graph::{Node, ResourceSlots}, + render_resource::SharedBuffers, + renderer::RenderContext, +}; +use legion::prelude::*; + +#[derive(Default)] +pub struct SharedBuffersNode; + +impl Node for SharedBuffersNode { + fn update( + &mut self, + _world: &World, + resources: &Resources, + render_context: &mut dyn RenderContext, + _input: &ResourceSlots, + _output: &mut ResourceSlots, + ) { + let shared_buffers = resources.get::().unwrap(); + let mut command_queue = shared_buffers.reset_command_queue(); + // command_queue.execute(render_context); + } +} diff --git a/crates/bevy_render/src/render_resource/mod.rs b/crates/bevy_render/src/render_resource/mod.rs index 7ddad70c99..a2a295423f 100644 --- a/crates/bevy_render/src/render_resource/mod.rs +++ b/crates/bevy_render/src/render_resource/mod.rs @@ -2,7 +2,7 @@ mod bind_group; mod buffer; mod render_resource; mod render_resource_bindings; -mod shared_buffer; +mod shared_buffers; mod systems; mod texture; @@ -10,6 +10,6 @@ pub use bind_group::*; pub use buffer::*; pub use render_resource::*; pub use render_resource_bindings::*; -pub use shared_buffer::*; +pub use shared_buffers::*; pub use systems::*; pub use texture::*; diff --git a/crates/bevy_render/src/render_resource/shared_buffer.rs b/crates/bevy_render/src/render_resource/shared_buffers.rs similarity index 60% rename from crates/bevy_render/src/render_resource/shared_buffer.rs rename to crates/bevy_render/src/render_resource/shared_buffers.rs index 67fd2102c4..899d43e2f9 100644 --- a/crates/bevy_render/src/render_resource/shared_buffer.rs +++ b/crates/bevy_render/src/render_resource/shared_buffers.rs @@ -1,5 +1,7 @@ use super::{BufferId, BufferInfo, RenderResource, RenderResourceBinding}; -use crate::{render_resource::BufferUsage, renderer::RenderResourceContext}; +use crate::{ + render_graph::CommandQueue, render_resource::BufferUsage, renderer::RenderResourceContext, +}; use legion::systems::Res; use std::sync::{Arc, RwLock}; @@ -9,6 +11,7 @@ use std::sync::{Arc, RwLock}; pub struct SharedBuffers { render_resource_context: Box, buffers: Arc>>, + command_queue: Arc>, } impl SharedBuffers { @@ -16,6 +19,7 @@ impl SharedBuffers { Self { render_resource_context, buffers: Default::default(), + command_queue: Default::default(), } } @@ -26,18 +30,35 @@ impl SharedBuffers { ) -> Option { if let Some(size) = render_resource.buffer_byte_len() { // PERF: this buffer will be slow - let buffer = self.render_resource_context.create_buffer_mapped( + let staging_buffer = self.render_resource_context.create_buffer_mapped( BufferInfo { size, - buffer_usage: buffer_usage | BufferUsage::COPY_SRC | BufferUsage::COPY_DST, + buffer_usage: BufferUsage::COPY_SRC, }, &mut |data, _renderer| { render_resource.write_buffer_bytes(data); }, ); - self.buffers.write().unwrap().push(buffer); + + let destination_buffer = self.render_resource_context.create_buffer(BufferInfo { + size, + buffer_usage: BufferUsage::COPY_DST | buffer_usage, + }); + + let mut command_queue = self.command_queue.write().unwrap(); + command_queue.copy_buffer_to_buffer( + staging_buffer, + 0, + destination_buffer, + 0, + size as u64, + ); + + let mut buffers = self.buffers.write().unwrap(); + buffers.push(staging_buffer); + buffers.push(destination_buffer); Some(RenderResourceBinding::Buffer { - buffer, + buffer: destination_buffer, range: 0..size as u64, dynamic_index: None, }) @@ -53,6 +74,11 @@ impl SharedBuffers { self.render_resource_context.remove_buffer(buffer) } } + + pub fn reset_command_queue(&self) -> CommandQueue { + let mut command_queue = self.command_queue.write().unwrap(); + std::mem::replace(&mut *command_queue, CommandQueue::default()) + } } // TODO: remove this when this actually uses shared buffers