Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion crates/bevy_pbr/src/render_graph/lights_node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,9 @@ impl Node for LightsNode {
render_context: &mut dyn RenderContext,
_input: &ResourceSlots,
_output: &mut ResourceSlots,
) {
) -> Result<(), ()> {
self.command_queue.execute(render_context);
Ok(())
}
}

Expand Down
6 changes: 4 additions & 2 deletions crates/bevy_render/src/render_graph/graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,8 @@ mod tests {
_: &mut dyn RenderContext,
_: &ResourceSlots,
_: &mut ResourceSlots,
) {
) -> Result<(), ()> {
Ok(())
}
}

Expand Down Expand Up @@ -417,7 +418,8 @@ mod tests {
_: &mut dyn RenderContext,
_: &ResourceSlots,
_: &mut ResourceSlots,
) {
) -> Result<(), ()> {
Ok(())
}
}

Expand Down
2 changes: 1 addition & 1 deletion crates/bevy_render/src/render_graph/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ pub trait Node: Downcast + Send + Sync + 'static {
render_context: &mut dyn RenderContext,
input: &ResourceSlots,
output: &mut ResourceSlots,
);
) -> Result<(), ()>;
}

impl_downcast!(Node);
Expand Down
3 changes: 2 additions & 1 deletion crates/bevy_render/src/render_graph/nodes/camera_node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ impl Node for CameraNode {
render_context: &mut dyn RenderContext,
_input: &ResourceSlots,
_output: &mut ResourceSlots,
) {
) -> Result<(), ()> {
self.command_queue.execute(render_context);
Ok(())
}
}

Expand Down
11 changes: 8 additions & 3 deletions crates/bevy_render/src/render_graph/nodes/pass_node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ where
render_context: &mut dyn RenderContext,
input: &ResourceSlots,
_output: &mut ResourceSlots,
) {
) -> Result<(), ()> {
let render_resource_bindings = resources.get::<RenderResourceBindings>().unwrap();
let pipelines = resources.get::<Assets<PipelineDescriptor>>().unwrap();
let active_cameras = resources.get::<ActiveCameras>().unwrap();
Expand All @@ -168,8 +168,12 @@ where
}
}
if let Some(input_index) = self.color_attachment_input_indices[i] {
color_attachment.attachment =
TextureAttachment::Id(input.get(input_index).unwrap().get_texture().unwrap());
if let Some(resource_id) = input.get(input_index) {
color_attachment.attachment =
TextureAttachment::Id(resource_id.get_texture().unwrap());
} else {
return Err(());
}
}
if let Some(input_index) = self.color_resolve_target_indices[i] {
color_attachment.resolve_target = Some(TextureAttachment::Id(
Expand Down Expand Up @@ -335,6 +339,7 @@ where
}
},
);
Ok(())
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -392,8 +392,9 @@ where
render_context: &mut dyn RenderContext,
_input: &ResourceSlots,
_output: &mut ResourceSlots,
) {
) -> Result<(), ()> {
self.command_queue.execute(render_context);
Ok(())
}
}

Expand Down Expand Up @@ -575,8 +576,9 @@ where
render_context: &mut dyn RenderContext,
_input: &ResourceSlots,
_output: &mut ResourceSlots,
) {
) -> Result<(), ()> {
self.command_queue.execute(render_context);
Ok(())
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ impl Node for SharedBuffersNode {
render_context: &mut dyn RenderContext,
_input: &ResourceSlots,
_output: &mut ResourceSlots,
) {
) -> Result<(), ()> {
let mut shared_buffers = resources.get_mut::<SharedBuffers>().unwrap();
shared_buffers.apply(render_context);
Ok(())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ impl Node for TextureCopyNode {
render_context: &mut dyn RenderContext,
_input: &ResourceSlots,
_output: &mut ResourceSlots,
) {
) -> Result<(), ()> {
let texture_events = resources.get::<Events<AssetEvent<Texture>>>().unwrap();
let textures = resources.get::<Assets<Texture>>().unwrap();
let mut copied_textures = HashSet::new();
Expand Down Expand Up @@ -84,5 +84,6 @@ impl Node for TextureCopyNode {
AssetEvent::Removed { .. } => {}
}
}
Ok(())
}
}
45 changes: 23 additions & 22 deletions crates/bevy_render/src/render_graph/nodes/window_swapchain_node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,35 +41,36 @@ impl Node for WindowSwapChainNode {
render_context: &mut dyn RenderContext,
_input: &ResourceSlots,
output: &mut ResourceSlots,
) {
) -> Result<(), ()> {
const WINDOW_TEXTURE: usize = 0;
let window_created_events = resources.get::<Events<WindowCreated>>().unwrap();
let window_resized_events = resources.get::<Events<WindowResized>>().unwrap();
let windows = resources.get::<Windows>().unwrap();

let window = windows
.get(self.window_id)
.expect("Received window resized event for non-existent window.");
if let Some(window) = windows.get(self.window_id) {
let render_resource_context = render_context.resources_mut();

let render_resource_context = render_context.resources_mut();

// create window swapchain when window is resized or created
if self
.window_created_event_reader
.find_latest(&window_created_events, |e| e.id == window.id())
.is_some()
|| self
.window_resized_event_reader
.find_latest(&window_resized_events, |e| e.id == window.id())
// create window swapchain when window is resized or created
if self
.window_created_event_reader
.find_latest(&window_created_events, |e| e.id == window.id())
.is_some()
{
render_resource_context.create_swap_chain(window);
}
|| self
.window_resized_event_reader
.find_latest(&window_resized_events, |e| e.id == window.id())
.is_some()
{
render_resource_context.create_swap_chain(window);
}

let swap_chain_texture = render_resource_context.next_swap_chain_texture(&window);
output.set(
WINDOW_TEXTURE,
RenderResourceId::Texture(swap_chain_texture),
);
let swap_chain_texture = render_resource_context.next_swap_chain_texture(&window);
output.set(
WINDOW_TEXTURE,
RenderResourceId::Texture(swap_chain_texture),
);
Ok(())
} else {
Err(())
}
}
}
43 changes: 22 additions & 21 deletions crates/bevy_render/src/render_graph/nodes/window_texture_node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,34 +44,35 @@ impl Node for WindowTextureNode {
render_context: &mut dyn RenderContext,
_input: &ResourceSlots,
output: &mut ResourceSlots,
) {
) -> Result<(), ()> {
const WINDOW_TEXTURE: usize = 0;
let window_created_events = resources.get::<Events<WindowCreated>>().unwrap();
let window_resized_events = resources.get::<Events<WindowResized>>().unwrap();
let windows = resources.get::<Windows>().unwrap();

let window = windows
.get(self.window_id)
.expect("Received window resized event for non-existent window.");

if self
.window_created_event_reader
.find_latest(&window_created_events, |e| e.id == window.id())
.is_some()
|| self
.window_resized_event_reader
.find_latest(&window_resized_events, |e| e.id == window.id())
if let Some(window) = windows.get(self.window_id) {
if self
.window_created_event_reader
.find_latest(&window_created_events, |e| e.id == window.id())
.is_some()
{
let render_resource_context = render_context.resources_mut();
if let Some(RenderResourceId::Texture(old_texture)) = output.get(WINDOW_TEXTURE) {
render_resource_context.remove_texture(old_texture);
}
|| self
.window_resized_event_reader
.find_latest(&window_resized_events, |e| e.id == window.id())
.is_some()
{
let render_resource_context = render_context.resources_mut();
if let Some(RenderResourceId::Texture(old_texture)) = output.get(WINDOW_TEXTURE) {
render_resource_context.remove_texture(old_texture);
}

self.descriptor.size.width = window.physical_width();
self.descriptor.size.height = window.physical_height();
let texture_resource = render_resource_context.create_texture(self.descriptor);
output.set(WINDOW_TEXTURE, RenderResourceId::Texture(texture_resource));
self.descriptor.size.width = window.physical_width();
self.descriptor.size.height = window.physical_height();
let texture_resource = render_resource_context.create_texture(self.descriptor);
output.set(WINDOW_TEXTURE, RenderResourceId::Texture(texture_resource));
}
Ok(())
} else {
Err(())
}
}
}
3 changes: 2 additions & 1 deletion crates/bevy_render/src/render_graph/schedule.rs
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,8 @@ mod tests {
_: &mut dyn RenderContext,
_: &ResourceSlots,
_: &mut ResourceSlots,
) {
) -> Result<(), ()> {
Ok(())
}
}

Expand Down
1 change: 1 addition & 0 deletions crates/bevy_wgpu/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ bevy_asset = { path = "../bevy_asset", version = "0.4.0" }
bevy_core = { path = "../bevy_core", version = "0.4.0" }
bevy_diagnostic = { path = "../bevy_diagnostic", version = "0.4.0" }
bevy_ecs = { path = "../bevy_ecs", version = "0.4.0" }
bevy_log = { path = "../bevy_log", version = "0.4.0" }
bevy_render = { path = "../bevy_render", version = "0.4.0" }
bevy_window = { path = "../bevy_window", version = "0.4.0" }
bevy_winit = { path = "../bevy_winit", optional = true, version = "0.4.0" }
Expand Down
26 changes: 19 additions & 7 deletions crates/bevy_wgpu/src/renderer/wgpu_render_graph_executor.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use super::{WgpuRenderContext, WgpuRenderResourceContext};
use bevy_ecs::{Resources, World};
use bevy_log::warn;
use bevy_render::{
render_graph::{Edge, NodeId, ResourceSlots, StageBorrow},
renderer::RenderResourceContext,
Expand Down Expand Up @@ -60,23 +61,34 @@ impl WgpuRenderGraphExecutor {
let outputs = if let Some(outputs) = node_outputs.get(output_node) {
outputs
} else {
panic!("Node inputs not set.")
warn!("Node inputs not set.");
break;
};

let output_resource =
outputs.get(*output_index).expect("Output should be set.");
input_slot.resource = Some(output_resource);
if let Some(output_resource) = outputs.get(*output_index) {
input_slot.resource = Some(output_resource);
} else {
warn!(
"Output should be set for node {:?}-{:?}",
output_node, output_index
);
break;
}
} else {
panic!("No edge connected to input.")
warn!("No edge connected to input.");
break;
}
}
node_state.node.update(
if let Err(_) = node_state.node.update(
world,
resources,
&mut render_context,
&node_state.input_slots,
&mut node_state.output_slots,
);
) {
warn!("Error from node {:?}", node_state.id);
break;
}

node_outputs
.write()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ impl WgpuRenderResourceContext {
let mut window_swap_chains = self.resources.window_swap_chains.write();
let mut swap_chain_outputs = self.resources.swap_chain_frames.write();

let window_swap_chain = window_swap_chains.get_mut(&window_id).unwrap();
let window_swap_chain = window_swap_chains.get_mut(&window_id)?;
let next_texture = window_swap_chain.get_current_frame().ok()?;
let id = TextureId::new();
swap_chain_outputs.insert(id, next_texture);
Expand Down