From a4afa4e7f3e572803bded6409fa5871e1a39fe03 Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Fri, 26 Jun 2020 14:27:22 -0700 Subject: [PATCH] render: only attempt to create camera bind group when the camera bind group descriptor exists this fixes panics in empty scenes --- .../src/render_graph/nodes/pass_node.rs | 14 +++++++++----- .../renderer/headless_render_resource_context.rs | 4 ++++ .../src/renderer/render_resource_context.rs | 2 ++ .../src/renderer/wgpu_render_resource_context.rs | 8 ++++++++ 4 files changed, 23 insertions(+), 5 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 763a38249a..42d2c89684 100644 --- a/crates/bevy_render/src/render_graph/nodes/pass_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/pass_node.rs @@ -135,12 +135,16 @@ impl Node for PassNode { } else { continue; }; - - let camera_bind_group = BindGroup::build().add_binding(0, camera_binding).finish(); - render_context + if render_context .resources() - .create_bind_group(self.camera_bind_group_descriptor.id, &camera_bind_group); - camera_info.bind_group_id = Some(camera_bind_group.id); + .bind_group_descriptor_exists(self.camera_bind_group_descriptor.id) + { + let camera_bind_group = BindGroup::build().add_binding(0, camera_binding).finish(); + render_context + .resources() + .create_bind_group(self.camera_bind_group_descriptor.id, &camera_bind_group); + camera_info.bind_group_id = Some(camera_bind_group.id); + } } render_context.begin_pass( diff --git a/crates/bevy_render/src/renderer/headless_render_resource_context.rs b/crates/bevy_render/src/renderer/headless_render_resource_context.rs index 6f7e566a32..8e72dbe27f 100644 --- a/crates/bevy_render/src/renderer/headless_render_resource_context.rs +++ b/crates/bevy_render/src/renderer/headless_render_resource_context.rs @@ -120,4 +120,8 @@ impl RenderResourceContext for HeadlessRenderResourceContext { fn get_buffer_info(&self, buffer: BufferId) -> Option { self.buffer_info.read().unwrap().get(&buffer).cloned() } + fn bind_group_descriptor_exists(&self, _bind_group_descriptor_id: BindGroupDescriptorId) + -> bool { + false + } } diff --git a/crates/bevy_render/src/renderer/render_resource_context.rs b/crates/bevy_render/src/renderer/render_resource_context.rs index 4edc6730be..d4521e3124 100644 --- a/crates/bevy_render/src/renderer/render_resource_context.rs +++ b/crates/bevy_render/src/renderer/render_resource_context.rs @@ -48,6 +48,8 @@ pub trait RenderResourceContext: Downcast + Send + Sync + 'static { pipeline_descriptor: &PipelineDescriptor, shaders: &Assets, ); + fn bind_group_descriptor_exists(&self, bind_group_descriptor_id: BindGroupDescriptorId) + -> bool; fn create_bind_group( &self, bind_group_descriptor_id: BindGroupDescriptorId, diff --git a/crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs b/crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs index a7bbe18aac..77045ff1ef 100644 --- a/crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs +++ b/crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs @@ -433,6 +433,14 @@ impl RenderResourceContext for WgpuRenderResourceContext { render_pipelines.insert(pipeline_handle, render_pipeline); } + fn bind_group_descriptor_exists( + &self, + bind_group_descriptor_id: BindGroupDescriptorId, + ) -> bool { + let bind_group_layouts = self.resources.bind_group_layouts.read().unwrap(); + bind_group_layouts.get(&bind_group_descriptor_id).is_some() + } + fn create_bind_group( &self, bind_group_descriptor_id: BindGroupDescriptorId,