From 93c05f609ca603de8fb5b443b59f1679d636ed93 Mon Sep 17 00:00:00 2001 From: lwansbrough Date: Wed, 10 Mar 2021 22:29:54 +0100 Subject: [PATCH 01/10] Update the camera uniform to include the view matrix --- .../bevy_render/src/render_graph/nodes/camera_node.rs | 11 +++++++---- .../bevy_render/src/render_graph/nodes/pass_node.rs | 5 ++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/crates/bevy_render/src/render_graph/nodes/camera_node.rs b/crates/bevy_render/src/render_graph/nodes/camera_node.rs index ed62fdd395197..bf703e5a99113 100644 --- a/crates/bevy_render/src/render_graph/nodes/camera_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/camera_node.rs @@ -87,7 +87,7 @@ pub fn camera_node_system( render_resource_context.map_buffer(staging_buffer, BufferMapMode::Write); staging_buffer } else { - let size = std::mem::size_of::<[[f32; 4]; 4]>(); + let size = std::mem::size_of::<[[[f32; 4]; 4]; 2]>(); let buffer = render_resource_context.create_buffer(BufferInfo { size, buffer_usage: BufferUsage::COPY_DST | BufferUsage::UNIFORM, @@ -113,9 +113,12 @@ pub fn camera_node_system( staging_buffer }; - let matrix_size = std::mem::size_of::<[[f32; 4]; 4]>(); - let camera_matrix: [f32; 16] = - (camera.projection_matrix * global_transform.compute_matrix().inverse()).to_cols_array(); + let matrix_size = std::mem::size_of::<[[[f32; 4]; 4]; 2]>(); + let view_matrix = global_transform.compute_matrix().inverse(); + let camera_matrix: [[f32; 16]; 2] = [ + (camera.projection_matrix * view_matrix).to_cols_array(), + view_matrix.to_cols_array() + ]; render_resource_context.write_mapped_buffer( staging_buffer, diff --git a/crates/bevy_render/src/render_graph/nodes/pass_node.rs b/crates/bevy_render/src/render_graph/nodes/pass_node.rs index e105f9bc900b5..4470c60559b5e 100644 --- a/crates/bevy_render/src/render_graph/nodes/pass_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/pass_node.rs @@ -113,7 +113,10 @@ impl PassNode { index: 0, bind_type: BindType::Uniform { has_dynamic_offset: false, - property: UniformProperty::Struct(vec![UniformProperty::Mat4]), + property: UniformProperty::Struct(vec![ + UniformProperty::Mat4, + UniformProperty::Mat4, + ]), }, shader_stage: BindingShaderStage::VERTEX | BindingShaderStage::FRAGMENT, }], From 8962b8ccd9b98fa9b4b319e93f4842b1bd42d40d Mon Sep 17 00:00:00 2001 From: lwansbrough Date: Sun, 3 Jan 2021 13:19:05 -0800 Subject: [PATCH 02/10] Update shaders to include new uniform data --- assets/shaders/hot.vert | 1 + crates/bevy_pbr/src/render_graph/forward_pipeline/forward.frag | 1 + crates/bevy_pbr/src/render_graph/forward_pipeline/forward.vert | 1 + crates/bevy_render/src/shader/shader_reflect.rs | 1 + crates/bevy_sprite/src/render/sprite.vert | 1 + crates/bevy_sprite/src/render/sprite_sheet.vert | 1 + crates/bevy_ui/src/render/ui.vert | 1 + examples/shader/array_texture.rs | 1 + examples/shader/mesh_custom_attribute.rs | 1 + examples/shader/shader_custom_material.rs | 1 + examples/shader/shader_defs.rs | 1 + 11 files changed, 11 insertions(+) diff --git a/assets/shaders/hot.vert b/assets/shaders/hot.vert index 71a610e6e8463..11fa9321d3669 100644 --- a/assets/shaders/hot.vert +++ b/assets/shaders/hot.vert @@ -4,6 +4,7 @@ layout(location = 0) in vec3 Vertex_Position; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; + mat4 View; }; layout(set = 1, binding = 0) uniform Transform { diff --git a/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.frag b/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.frag index fc043c0db59c9..4313c6cae6132 100644 --- a/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.frag +++ b/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.frag @@ -16,6 +16,7 @@ layout(location = 0) out vec4 o_Target; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; + mat4 View; }; layout(set = 1, binding = 0) uniform Lights { diff --git a/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.vert b/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.vert index 028a86389c012..cb06377109313 100644 --- a/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.vert +++ b/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.vert @@ -10,6 +10,7 @@ layout(location = 2) out vec2 v_Uv; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; + mat4 View; }; layout(set = 2, binding = 0) uniform Transform { diff --git a/crates/bevy_render/src/shader/shader_reflect.rs b/crates/bevy_render/src/shader/shader_reflect.rs index fe1ff7167ff76..56662eccaf446 100644 --- a/crates/bevy_render/src/shader/shader_reflect.rs +++ b/crates/bevy_render/src/shader/shader_reflect.rs @@ -327,6 +327,7 @@ mod tests { layout(location = 0) out vec4 v_Position; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; + mat4 View; }; layout(set = 1, binding = 0) uniform texture2D Texture; diff --git a/crates/bevy_sprite/src/render/sprite.vert b/crates/bevy_sprite/src/render/sprite.vert index 23c77d38c7d72..9ddbfe8fca5e5 100644 --- a/crates/bevy_sprite/src/render/sprite.vert +++ b/crates/bevy_sprite/src/render/sprite.vert @@ -8,6 +8,7 @@ layout(location = 0) out vec2 v_Uv; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; + mat4 View; }; layout(set = 2, binding = 0) uniform Transform { diff --git a/crates/bevy_sprite/src/render/sprite_sheet.vert b/crates/bevy_sprite/src/render/sprite_sheet.vert index d4ddabad7df5e..9d66ce85e5505 100644 --- a/crates/bevy_sprite/src/render/sprite_sheet.vert +++ b/crates/bevy_sprite/src/render/sprite_sheet.vert @@ -9,6 +9,7 @@ layout(location = 1) out vec4 v_Color; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; + mat4 View; }; // TODO: merge dimensions into "sprites" buffer when that is supported in the Uniforms derive abstraction diff --git a/crates/bevy_ui/src/render/ui.vert b/crates/bevy_ui/src/render/ui.vert index 2268af642b305..fe876b5c0c6ca 100644 --- a/crates/bevy_ui/src/render/ui.vert +++ b/crates/bevy_ui/src/render/ui.vert @@ -8,6 +8,7 @@ layout(location = 0) out vec2 v_Uv; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; + mat4 View; }; layout(set = 1, binding = 0) uniform Transform { diff --git a/examples/shader/array_texture.rs b/examples/shader/array_texture.rs index 3dbbe9ed81a41..e0c76d6564d34 100644 --- a/examples/shader/array_texture.rs +++ b/examples/shader/array_texture.rs @@ -34,6 +34,7 @@ layout(location = 0) out vec4 v_Position; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; + mat4 View; }; layout(set = 1, binding = 0) uniform Transform { mat4 Model; diff --git a/examples/shader/mesh_custom_attribute.rs b/examples/shader/mesh_custom_attribute.rs index 42bac14cf63fd..94a83b962f350 100644 --- a/examples/shader/mesh_custom_attribute.rs +++ b/examples/shader/mesh_custom_attribute.rs @@ -31,6 +31,7 @@ layout(location = 0) out vec3 v_color; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; + mat4 View; }; layout(set = 1, binding = 0) uniform Transform { mat4 Model; diff --git a/examples/shader/shader_custom_material.rs b/examples/shader/shader_custom_material.rs index b5d2323c90da6..619080fa0b6af 100644 --- a/examples/shader/shader_custom_material.rs +++ b/examples/shader/shader_custom_material.rs @@ -30,6 +30,7 @@ const VERTEX_SHADER: &str = r#" layout(location = 0) in vec3 Vertex_Position; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; + mat4 View; }; layout(set = 1, binding = 0) uniform Transform { mat4 Model; diff --git a/examples/shader/shader_defs.rs b/examples/shader/shader_defs.rs index f14241f3c4264..5e653fbef909b 100644 --- a/examples/shader/shader_defs.rs +++ b/examples/shader/shader_defs.rs @@ -38,6 +38,7 @@ const VERTEX_SHADER: &str = r#" layout(location = 0) in vec3 Vertex_Position; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; + mat4 View; }; layout(set = 1, binding = 0) uniform Transform { mat4 Model; From a7e84f2d41548381cfc8fae9c6373d986576190a Mon Sep 17 00:00:00 2001 From: lwansbrough Date: Wed, 10 Mar 2021 22:32:39 +0100 Subject: [PATCH 03/10] Clean up --- crates/bevy_render/src/render_graph/nodes/pass_node.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bevy_render/src/render_graph/nodes/pass_node.rs b/crates/bevy_render/src/render_graph/nodes/pass_node.rs index 4470c60559b5e..6e34b852ae501 100644 --- a/crates/bevy_render/src/render_graph/nodes/pass_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/pass_node.rs @@ -114,8 +114,8 @@ impl PassNode { bind_type: BindType::Uniform { has_dynamic_offset: false, property: UniformProperty::Struct(vec![ - UniformProperty::Mat4, - UniformProperty::Mat4, + UniformProperty::Mat4, // View Projection + UniformProperty::Mat4, // View ]), }, shader_stage: BindingShaderStage::VERTEX | BindingShaderStage::FRAGMENT, From 26654c78aae59c1b30d58fc42163c9525d62372b Mon Sep 17 00:00:00 2001 From: Jonas Matser Date: Wed, 10 Mar 2021 22:37:30 +0100 Subject: [PATCH 04/10] Start on splitting camera bindings --- .../forward_pipeline/forward.frag | 4 +- .../forward_pipeline/forward.vert | 4 +- .../src/render_graph/nodes/camera_node.rs | 40 ++++++----- .../src/render_graph/nodes/pass_node.rs | 66 ++++++++++++++----- 4 files changed, 78 insertions(+), 36 deletions(-) diff --git a/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.frag b/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.frag index 4313c6cae6132..36e95ac27a0d8 100644 --- a/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.frag +++ b/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.frag @@ -14,8 +14,10 @@ layout(location = 2) in vec2 v_Uv; layout(location = 0) out vec4 o_Target; -layout(set = 0, binding = 0) uniform Camera { +layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; +}; +layout(set = 0, binding = 1) uniform CameraView { mat4 View; }; diff --git a/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.vert b/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.vert index cb06377109313..50e60c4d410f9 100644 --- a/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.vert +++ b/crates/bevy_pbr/src/render_graph/forward_pipeline/forward.vert @@ -8,8 +8,10 @@ layout(location = 0) out vec3 v_Position; layout(location = 1) out vec3 v_Normal; layout(location = 2) out vec2 v_Uv; -layout(set = 0, binding = 0) uniform Camera { +layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; +}; +layout(set = 0, binding = 1) uniform CameraView { mat4 View; }; diff --git a/crates/bevy_render/src/render_graph/nodes/camera_node.rs b/crates/bevy_render/src/render_graph/nodes/camera_node.rs index bf703e5a99113..9a4061ec2ab14 100644 --- a/crates/bevy_render/src/render_graph/nodes/camera_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/camera_node.rs @@ -6,11 +6,12 @@ use crate::{ RenderResourceBindings, RenderResourceContext, }, }; -use bevy_core::AsBytes; +use bevy_core::{AsBytes, Bytes}; use bevy_ecs::{ system::{BoxedSystem, IntoSystem, Local, Query, Res, ResMut}, world::World, }; + use bevy_transform::prelude::*; use std::borrow::Cow; @@ -83,28 +84,42 @@ pub fn camera_node_system( return; }; + let view_matrix = global_transform.compute_matrix().inverse(); + let camera_matrix = [ + (camera.projection_matrix * view_matrix).to_cols_array(), + view_matrix.to_cols_array(), + ]; + let buffer_size = camera_matrix.byte_len(); + let staging_buffer = if let Some(staging_buffer) = state.staging_buffer { render_resource_context.map_buffer(staging_buffer, BufferMapMode::Write); staging_buffer } else { - let size = std::mem::size_of::<[[[f32; 4]; 4]; 2]>(); let buffer = render_resource_context.create_buffer(BufferInfo { - size, + size: buffer_size, buffer_usage: BufferUsage::COPY_DST | BufferUsage::UNIFORM, ..Default::default() }); render_resource_bindings.set( - &state.camera_name, + &format!("{}ViewProj", &state.camera_name), RenderResourceBinding::Buffer { buffer, - range: 0..size as u64, + range: 0..view_matrix.byte_len() as u64, + dynamic_index: None, + }, + ); + render_resource_bindings.set( + &format!("{}View", &state.camera_name), + RenderResourceBinding::Buffer { + buffer, + range: view_matrix.byte_len() as u64..buffer_size as u64, dynamic_index: None, }, ); state.camera_buffer = Some(buffer); let staging_buffer = render_resource_context.create_buffer(BufferInfo { - size, + size: buffer_size, buffer_usage: BufferUsage::COPY_SRC | BufferUsage::MAP_WRITE, mapped_at_creation: true, }); @@ -113,18 +128,11 @@ pub fn camera_node_system( staging_buffer }; - let matrix_size = std::mem::size_of::<[[[f32; 4]; 4]; 2]>(); - let view_matrix = global_transform.compute_matrix().inverse(); - let camera_matrix: [[f32; 16]; 2] = [ - (camera.projection_matrix * view_matrix).to_cols_array(), - view_matrix.to_cols_array() - ]; - render_resource_context.write_mapped_buffer( staging_buffer, - 0..matrix_size as u64, + 0..buffer_size as u64, &mut |data, _renderer| { - data[0..matrix_size].copy_from_slice(camera_matrix.as_bytes()); + data[0..buffer_size].copy_from_slice(camera_matrix.as_bytes()); }, ); render_resource_context.unmap_buffer(staging_buffer); @@ -135,6 +143,6 @@ pub fn camera_node_system( 0, camera_buffer, 0, - matrix_size as u64, + buffer_size as u64, ); } diff --git a/crates/bevy_render/src/render_graph/nodes/pass_node.rs b/crates/bevy_render/src/render_graph/nodes/pass_node.rs index 6e34b852ae501..b308b0c8e2a01 100644 --- a/crates/bevy_render/src/render_graph/nodes/pass_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/pass_node.rs @@ -108,18 +108,30 @@ impl PassNode { let camera_bind_group_descriptor = BindGroupDescriptor::new( 0, - vec![BindingDescriptor { - name: "Camera".to_string(), - index: 0, - bind_type: BindType::Uniform { - has_dynamic_offset: false, - property: UniformProperty::Struct(vec![ - UniformProperty::Mat4, // View Projection - UniformProperty::Mat4, // View - ]), + vec![ + BindingDescriptor { + name: "CameraViewProj".to_string(), + index: 0, + bind_type: BindType::Uniform { + has_dynamic_offset: false, + property: UniformProperty::Struct(vec![ + UniformProperty::Mat4, // View Projection + ]), + }, + shader_stage: BindingShaderStage::VERTEX | BindingShaderStage::FRAGMENT, }, - shader_stage: BindingShaderStage::VERTEX | BindingShaderStage::FRAGMENT, - }], + BindingDescriptor { + name: "CameraView".to_string(), + index: 1, + bind_type: BindType::Uniform { + has_dynamic_offset: false, + property: UniformProperty::Struct(vec![ + UniformProperty::Mat4, // View + ]), + }, + shader_stage: BindingShaderStage::VERTEX | BindingShaderStage::FRAGMENT, + }, + ], ); PassNode { @@ -195,18 +207,36 @@ where .attachment = TextureAttachment::Id(input.get(input_index).unwrap().get_texture().unwrap()); } + for camera_info in self.cameras.iter_mut() { - let camera_binding = - if let Some(camera_binding) = render_resource_bindings.get(&camera_info.name) { - camera_binding.clone() - } else { - continue; - }; + let camera_name = &camera_info.name; + if render_context .resources() .bind_group_descriptor_exists(self.camera_bind_group_descriptor.id) { - let camera_bind_group = BindGroup::build().add_binding(0, camera_binding).finish(); + let mut camera_bind_group_builder = BindGroup::build(); + + for binding_name in self + .camera_bind_group_descriptor + .bindings + .iter() + .map(|binding| &binding.name) + { + let camera_binding = if let Some(camera_binding) = render_resource_bindings.get( + &format!("{}{}", &camera_name, binding_name.replace("Camera", "")), + ) { + camera_binding.clone() + } else { + continue; + }; + + camera_bind_group_builder = + camera_bind_group_builder.add_binding(0, camera_binding); + } + + let camera_bind_group = camera_bind_group_builder.finish(); + render_context .resources() .create_bind_group(self.camera_bind_group_descriptor.id, &camera_bind_group); From 8a22500eb0469887bb3593565a063625e3437a53 Mon Sep 17 00:00:00 2001 From: Jonas Matser Date: Wed, 10 Mar 2021 22:41:33 +0100 Subject: [PATCH 05/10] Finish splitting camera bindings --- .../src/render_graph/nodes/camera_node.rs | 131 ++++++++++-------- .../src/render_graph/nodes/pass_node.rs | 9 +- 2 files changed, 77 insertions(+), 63 deletions(-) diff --git a/crates/bevy_render/src/render_graph/nodes/camera_node.rs b/crates/bevy_render/src/render_graph/nodes/camera_node.rs index 9a4061ec2ab14..19ca6fb936978 100644 --- a/crates/bevy_render/src/render_graph/nodes/camera_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/camera_node.rs @@ -6,13 +6,14 @@ use crate::{ RenderResourceBindings, RenderResourceContext, }, }; -use bevy_core::{AsBytes, Bytes}; +use bevy_core::{AsBytes, Byteable, Bytes}; use bevy_ecs::{ system::{BoxedSystem, IntoSystem, Local, Query, Res, ResMut}, world::World, }; use bevy_transform::prelude::*; +use bevy_utils::HashMap; use std::borrow::Cow; #[derive(Debug)] @@ -51,9 +52,9 @@ impl SystemNode for CameraNode { config.0 = Some(CameraNodeState { camera_name: self.camera_name.clone(), command_queue: self.command_queue.clone(), - camera_buffer: None, - staging_buffer: None, - }) + buffers: HashMap::default(), + // staging_buffer: None, + }); }); Box::new(system) } @@ -63,8 +64,8 @@ impl SystemNode for CameraNode { pub struct CameraNodeState { command_queue: CommandQueue, camera_name: Cow<'static, str>, - camera_buffer: Option, - staging_buffer: Option, + buffers: HashMap, + // staging_buffer: Option, } pub fn camera_node_system( @@ -76,73 +77,85 @@ pub fn camera_node_system( mut render_resource_bindings: ResMut, query: Query<(&Camera, &GlobalTransform)>, ) { - let render_resource_context = &**render_resource_context; + let camera_name = state.camera_name.clone(); - let (camera, global_transform) = if let Some(entity) = active_cameras.get(&state.camera_name) { + let (camera, global_transform) = if let Some(entity) = active_cameras.get(&camera_name) { query.get(entity).unwrap() } else { return; }; let view_matrix = global_transform.compute_matrix().inverse(); - let camera_matrix = [ - (camera.projection_matrix * view_matrix).to_cols_array(), + let view_proj_matrix = camera.projection_matrix * view_matrix; + + make_binding( + &mut *state, + &**render_resource_context, + &mut *render_resource_bindings, + &format!("{}ViewProj", camera_name), + view_proj_matrix.to_cols_array(), + ); + + make_binding( + &mut *state, + &**render_resource_context, + &mut *render_resource_bindings, + &format!("{}View", camera_name), view_matrix.to_cols_array(), - ]; - let buffer_size = camera_matrix.byte_len(); + ); +} - let staging_buffer = if let Some(staging_buffer) = state.staging_buffer { - render_resource_context.map_buffer(staging_buffer, BufferMapMode::Write); - staging_buffer - } else { - let buffer = render_resource_context.create_buffer(BufferInfo { - size: buffer_size, - buffer_usage: BufferUsage::COPY_DST | BufferUsage::UNIFORM, - ..Default::default() - }); - render_resource_bindings.set( - &format!("{}ViewProj", &state.camera_name), - RenderResourceBinding::Buffer { - buffer, - range: 0..view_matrix.byte_len() as u64, - dynamic_index: None, - }, - ); - render_resource_bindings.set( - &format!("{}View", &state.camera_name), - RenderResourceBinding::Buffer { - buffer, - range: view_matrix.byte_len() as u64..buffer_size as u64, - dynamic_index: None, - }, - ); - state.camera_buffer = Some(buffer); - - let staging_buffer = render_resource_context.create_buffer(BufferInfo { - size: buffer_size, - buffer_usage: BufferUsage::COPY_SRC | BufferUsage::MAP_WRITE, - mapped_at_creation: true, - }); +fn make_binding( + state: &mut CameraNodeState, + render_resource_context: &dyn RenderResourceContext, + render_resource_bindings: &mut RenderResourceBindings, + binding_name: &str, + bytes: B, +) where + B: Bytes + Byteable, +{ + let buffer_size = bytes.byte_len(); - state.staging_buffer = Some(staging_buffer); - staging_buffer - }; + let buffers_entry = state.buffers.entry(binding_name.to_owned()); + + let (staging_buffer, buffer) = buffers_entry + .and_modify(|(staging_buffer, _)| { + render_resource_context.map_buffer(*staging_buffer, BufferMapMode::Write); + }) + .or_insert_with(|| { + let buffer = render_resource_context.create_buffer(BufferInfo { + size: buffer_size, + buffer_usage: BufferUsage::COPY_DST | BufferUsage::UNIFORM, + ..Default::default() + }); + + render_resource_bindings.set( + &binding_name, + RenderResourceBinding::Buffer { + buffer, + range: 0..buffer_size as u64, + dynamic_index: None, + }, + ); + + let staging_buffer = render_resource_context.create_buffer(BufferInfo { + size: buffer_size, + buffer_usage: BufferUsage::COPY_SRC | BufferUsage::MAP_WRITE, + mapped_at_creation: true, + }); + (staging_buffer, buffer) + }); render_resource_context.write_mapped_buffer( - staging_buffer, + *staging_buffer, 0..buffer_size as u64, &mut |data, _renderer| { - data[0..buffer_size].copy_from_slice(camera_matrix.as_bytes()); + data[0..buffer_size].copy_from_slice(bytes.as_bytes()); }, ); - render_resource_context.unmap_buffer(staging_buffer); - - let camera_buffer = state.camera_buffer.unwrap(); - state.command_queue.copy_buffer_to_buffer( - staging_buffer, - 0, - camera_buffer, - 0, - buffer_size as u64, - ); + render_resource_context.unmap_buffer(*staging_buffer); + + state + .command_queue + .copy_buffer_to_buffer(*staging_buffer, 0, *buffer, 0, buffer_size as u64); } diff --git a/crates/bevy_render/src/render_graph/nodes/pass_node.rs b/crates/bevy_render/src/render_graph/nodes/pass_node.rs index b308b0c8e2a01..b5cf71cb6ce71 100644 --- a/crates/bevy_render/src/render_graph/nodes/pass_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/pass_node.rs @@ -208,7 +208,7 @@ where TextureAttachment::Id(input.get(input_index).unwrap().get_texture().unwrap()); } - for camera_info in self.cameras.iter_mut() { + 'outer: for camera_info in self.cameras.iter_mut() { let camera_name = &camera_info.name; if render_context @@ -217,22 +217,23 @@ where { let mut camera_bind_group_builder = BindGroup::build(); - for binding_name in self + for (index, binding_name) in self .camera_bind_group_descriptor .bindings .iter() .map(|binding| &binding.name) + .enumerate() { let camera_binding = if let Some(camera_binding) = render_resource_bindings.get( &format!("{}{}", &camera_name, binding_name.replace("Camera", "")), ) { camera_binding.clone() } else { - continue; + continue 'outer; }; camera_bind_group_builder = - camera_bind_group_builder.add_binding(0, camera_binding); + camera_bind_group_builder.add_binding(index as u32, camera_binding); } let camera_bind_group = camera_bind_group_builder.finish(); From 1e8c67a2489567dd29dfbbf42ac844644e213c59 Mon Sep 17 00:00:00 2001 From: Jonas Matser Date: Wed, 10 Mar 2021 22:52:41 +0100 Subject: [PATCH 06/10] Fix hot.vert --- assets/shaders/hot.vert | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/assets/shaders/hot.vert b/assets/shaders/hot.vert index 11fa9321d3669..1809b220dfd90 100644 --- a/assets/shaders/hot.vert +++ b/assets/shaders/hot.vert @@ -2,9 +2,8 @@ layout(location = 0) in vec3 Vertex_Position; -layout(set = 0, binding = 0) uniform Camera { +layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; - mat4 View; }; layout(set = 1, binding = 0) uniform Transform { From 55910d37147aef81ccf524564e5d677a95637581 Mon Sep 17 00:00:00 2001 From: Jonas Matser Date: Wed, 10 Mar 2021 22:52:57 +0100 Subject: [PATCH 07/10] Fix all other shaders --- crates/bevy_render/src/shader/shader_reflect.rs | 2 +- crates/bevy_render/src/wireframe/wireframe.vert | 2 +- crates/bevy_sprite/src/render/sprite.vert | 6 +++--- crates/bevy_sprite/src/render/sprite_sheet.vert | 8 +++----- crates/bevy_ui/src/render/ui.vert | 4 ++-- examples/shader/array_texture.rs | 2 +- examples/shader/mesh_custom_attribute.rs | 2 +- examples/shader/shader_custom_material.rs | 2 +- examples/shader/shader_defs.rs | 2 +- 9 files changed, 14 insertions(+), 16 deletions(-) diff --git a/crates/bevy_render/src/shader/shader_reflect.rs b/crates/bevy_render/src/shader/shader_reflect.rs index 56662eccaf446..9c9696780dc26 100644 --- a/crates/bevy_render/src/shader/shader_reflect.rs +++ b/crates/bevy_render/src/shader/shader_reflect.rs @@ -325,7 +325,7 @@ mod tests { layout(location = 2) in uvec4 I_TestInstancing_Property; layout(location = 0) out vec4 v_Position; - layout(set = 0, binding = 0) uniform Camera { + layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; mat4 View; }; diff --git a/crates/bevy_render/src/wireframe/wireframe.vert b/crates/bevy_render/src/wireframe/wireframe.vert index 47828402121a0..87b32a667a1cc 100644 --- a/crates/bevy_render/src/wireframe/wireframe.vert +++ b/crates/bevy_render/src/wireframe/wireframe.vert @@ -2,7 +2,7 @@ layout(location = 0) in vec3 Vertex_Position; -layout(set = 0, binding = 0) uniform Camera { +layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; }; diff --git a/crates/bevy_sprite/src/render/sprite.vert b/crates/bevy_sprite/src/render/sprite.vert index 9ddbfe8fca5e5..f1fdd9283a744 100644 --- a/crates/bevy_sprite/src/render/sprite.vert +++ b/crates/bevy_sprite/src/render/sprite.vert @@ -6,7 +6,7 @@ layout(location = 2) in vec2 Vertex_Uv; layout(location = 0) out vec2 v_Uv; -layout(set = 0, binding = 0) uniform Camera { +layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; mat4 View; }; @@ -26,7 +26,7 @@ void main() { uint x_flip_bit = 1; // The X flip bit uint y_flip_bit = 2; // The Y flip bit - + // Note: Here we subtract f32::EPSILON from the flipped UV coord. This is due to reasons unknown // to me (@zicklag ) that causes the uv's to be slightly offset and causes over/under running of // the sprite UV sampling which is visible when resizing the screen. @@ -42,4 +42,4 @@ void main() { vec3 position = Vertex_Position * vec3(size, 1.0); gl_Position = ViewProj * Model * vec4(position, 1.0); -} \ No newline at end of file +} diff --git a/crates/bevy_sprite/src/render/sprite_sheet.vert b/crates/bevy_sprite/src/render/sprite_sheet.vert index 9d66ce85e5505..4a22ee01c5c72 100644 --- a/crates/bevy_sprite/src/render/sprite_sheet.vert +++ b/crates/bevy_sprite/src/render/sprite_sheet.vert @@ -7,7 +7,7 @@ layout(location = 2) in vec2 Vertex_Uv; layout(location = 0) out vec2 v_Uv; layout(location = 1) out vec4 v_Color; -layout(set = 0, binding = 0) uniform Camera { +layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; mat4 View; }; @@ -26,7 +26,6 @@ layout(set = 1, binding = 1) buffer TextureAtlas_textures { Rect[] Textures; }; - layout(set = 2, binding = 0) uniform Transform { mat4 SpriteTransform; }; @@ -76,11 +75,10 @@ void main() { bottom_left, top_left, top_right, - bottom_right - ); + bottom_right); v_Uv = (atlas_positions[gl_VertexIndex]) / AtlasSize; v_Color = color; gl_Position = ViewProj * SpriteTransform * vec4(vertex_position, 1.0); -} \ No newline at end of file +} diff --git a/crates/bevy_ui/src/render/ui.vert b/crates/bevy_ui/src/render/ui.vert index fe876b5c0c6ca..3cf3971e97965 100644 --- a/crates/bevy_ui/src/render/ui.vert +++ b/crates/bevy_ui/src/render/ui.vert @@ -6,7 +6,7 @@ layout(location = 2) in vec2 Vertex_Uv; layout(location = 0) out vec2 v_Uv; -layout(set = 0, binding = 0) uniform Camera { +layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; mat4 View; }; @@ -22,4 +22,4 @@ void main() { v_Uv = Vertex_Uv; vec3 position = Vertex_Position * vec3(NodeSize, 0.0); gl_Position = ViewProj * Object * vec4(position, 1.0); -} \ No newline at end of file +} diff --git a/examples/shader/array_texture.rs b/examples/shader/array_texture.rs index e0c76d6564d34..f788e842edcfc 100644 --- a/examples/shader/array_texture.rs +++ b/examples/shader/array_texture.rs @@ -32,7 +32,7 @@ const VERTEX_SHADER: &str = r#" layout(location = 0) in vec3 Vertex_Position; layout(location = 0) out vec4 v_Position; -layout(set = 0, binding = 0) uniform Camera { +layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; mat4 View; }; diff --git a/examples/shader/mesh_custom_attribute.rs b/examples/shader/mesh_custom_attribute.rs index 94a83b962f350..a1366e72a6d14 100644 --- a/examples/shader/mesh_custom_attribute.rs +++ b/examples/shader/mesh_custom_attribute.rs @@ -29,7 +29,7 @@ layout(location = 0) in vec3 Vertex_Position; layout(location = 1) in vec3 Vertex_Color; layout(location = 0) out vec3 v_color; -layout(set = 0, binding = 0) uniform Camera { +layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; mat4 View; }; diff --git a/examples/shader/shader_custom_material.rs b/examples/shader/shader_custom_material.rs index 619080fa0b6af..4a6f037b359fd 100644 --- a/examples/shader/shader_custom_material.rs +++ b/examples/shader/shader_custom_material.rs @@ -28,7 +28,7 @@ struct MyMaterial { const VERTEX_SHADER: &str = r#" #version 450 layout(location = 0) in vec3 Vertex_Position; -layout(set = 0, binding = 0) uniform Camera { +layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; mat4 View; }; diff --git a/examples/shader/shader_defs.rs b/examples/shader/shader_defs.rs index 5e653fbef909b..b99cf6b1c450d 100644 --- a/examples/shader/shader_defs.rs +++ b/examples/shader/shader_defs.rs @@ -36,7 +36,7 @@ struct MyMaterial { const VERTEX_SHADER: &str = r#" #version 450 layout(location = 0) in vec3 Vertex_Position; -layout(set = 0, binding = 0) uniform Camera { +layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; mat4 View; }; From 550161380bab71c7361dac09593316a0dda6c340 Mon Sep 17 00:00:00 2001 From: Jonas Matser Date: Wed, 10 Mar 2021 23:26:02 +0100 Subject: [PATCH 08/10] Fix test_reflection --- crates/bevy_render/src/shader/shader_reflect.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/bevy_render/src/shader/shader_reflect.rs b/crates/bevy_render/src/shader/shader_reflect.rs index 9c9696780dc26..47d9ac0299275 100644 --- a/crates/bevy_render/src/shader/shader_reflect.rs +++ b/crates/bevy_render/src/shader/shader_reflect.rs @@ -162,7 +162,7 @@ fn reflect_binding( let name = name.to_string(); - if name == "Camera" { + if let Some(0usize) = name.find("Camera") { shader_stage = BindingShaderStage::VERTEX | BindingShaderStage::FRAGMENT; } @@ -327,7 +327,6 @@ mod tests { layout(location = 0) out vec4 v_Position; layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; - mat4 View; }; layout(set = 1, binding = 0) uniform texture2D Texture; @@ -382,7 +381,7 @@ mod tests { 0, vec![BindingDescriptor { index: 0, - name: "Camera".into(), + name: "CameraViewProj".into(), bind_type: BindType::Uniform { has_dynamic_offset: false, property: UniformProperty::Struct(vec![UniformProperty::Mat4]), From 081e0fd45b4c22a314a485bc3f898ce6b513da6b Mon Sep 17 00:00:00 2001 From: Jonas Matser Date: Thu, 11 Mar 2021 13:26:48 +0100 Subject: [PATCH 09/10] Remove commented code --- crates/bevy_render/src/render_graph/nodes/camera_node.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/bevy_render/src/render_graph/nodes/camera_node.rs b/crates/bevy_render/src/render_graph/nodes/camera_node.rs index 19ca6fb936978..e1ab8d97907b2 100644 --- a/crates/bevy_render/src/render_graph/nodes/camera_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/camera_node.rs @@ -53,7 +53,6 @@ impl SystemNode for CameraNode { camera_name: self.camera_name.clone(), command_queue: self.command_queue.clone(), buffers: HashMap::default(), - // staging_buffer: None, }); }); Box::new(system) @@ -65,7 +64,6 @@ pub struct CameraNodeState { command_queue: CommandQueue, camera_name: Cow<'static, str>, buffers: HashMap, - // staging_buffer: Option, } pub fn camera_node_system( From dde60796f243b6b9c2a3f67038a4fe4b0285785f Mon Sep 17 00:00:00 2001 From: Jonas Matser Date: Thu, 11 Mar 2021 13:27:05 +0100 Subject: [PATCH 10/10] Add comment describing buffers HashMap --- crates/bevy_render/src/render_graph/nodes/camera_node.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_render/src/render_graph/nodes/camera_node.rs b/crates/bevy_render/src/render_graph/nodes/camera_node.rs index e1ab8d97907b2..d882dad85cc78 100644 --- a/crates/bevy_render/src/render_graph/nodes/camera_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/camera_node.rs @@ -63,6 +63,7 @@ impl SystemNode for CameraNode { pub struct CameraNodeState { command_queue: CommandQueue, camera_name: Cow<'static, str>, + /// This mas from `binding_name` -> `(staging_buffer_id, buffer_id)` buffers: HashMap, }