From b15f1ebfb7235db7c5b5f03a5a50e63282e2cd01 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Sat, 3 Jul 2021 00:23:11 -0400 Subject: [PATCH 1/3] halmark: fix the command pool recycling policy --- wgpu-hal/examples/halmark/main.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/wgpu-hal/examples/halmark/main.rs b/wgpu-hal/examples/halmark/main.rs index 79f06ac082..716542e562 100644 --- a/wgpu-hal/examples/halmark/main.rs +++ b/wgpu-hal/examples/halmark/main.rs @@ -10,6 +10,7 @@ const MAX_BUNNIES: usize = 1 << 20; const BUNNY_SIZE: f32 = 0.15 * 256.0; const GRAVITY: f32 = -9.8 * 100.0; const MAX_VELOCITY: f32 = 750.0; +const COMMAND_BUFFER_PER_CONTEXT: usize = 100; #[repr(C)] #[derive(Clone, Copy)] @@ -34,7 +35,7 @@ struct ExecutionContext { fence_value: hal::FenceValue, used_views: Vec, used_cmd_bufs: Vec, - bunnies_recorded: usize, + frames_recorded: usize, } impl ExecutionContext { @@ -44,7 +45,7 @@ impl ExecutionContext { device.destroy_texture_view(view); } self.encoder.reset_all(self.used_cmd_bufs.drain(..)); - self.bunnies_recorded = 0; + self.frames_recorded = 0; } } @@ -466,7 +467,7 @@ impl Example { fence_value: 1, used_views: Vec::new(), used_cmd_bufs: Vec::new(), - bunnies_recorded: 0, + frames_recorded: 0, }], context_index: 0, extent: [window_size.0, window_size.1], @@ -641,8 +642,8 @@ impl Example { } } - ctx.bunnies_recorded += self.bunnies.len(); - let do_fence = ctx.bunnies_recorded > MAX_BUNNIES; + ctx.frames_recorded += 1; + let do_fence = ctx.frames_recorded > COMMAND_BUFFER_PER_CONTEXT; unsafe { ctx.encoder.end_render_pass(); @@ -673,7 +674,7 @@ impl Example { fence_value: 0, used_views: Vec::new(), used_cmd_bufs: Vec::new(), - bunnies_recorded: 0, + frames_recorded: 0, } }); } From 497c6647ee42f26441c6f3ceaeced9736f52de34 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Sat, 3 Jul 2021 01:07:21 -0400 Subject: [PATCH 2/3] hal/vulkan: fix instance destruction logic --- wgpu-hal/examples/halmark/main.rs | 13 +++++++++---- wgpu-hal/src/vulkan/instance.rs | 19 +++++++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/wgpu-hal/examples/halmark/main.rs b/wgpu-hal/examples/halmark/main.rs index 716542e562..e738ea892e 100644 --- a/wgpu-hal/examples/halmark/main.rs +++ b/wgpu-hal/examples/halmark/main.rs @@ -41,10 +41,10 @@ struct ExecutionContext { impl ExecutionContext { unsafe fn wait_and_clear(&mut self, device: &A::Device) { device.wait(&self.fence, self.fence_value, !0).unwrap(); + self.encoder.reset_all(self.used_cmd_bufs.drain(..)); for view in self.used_views.drain(..) { device.destroy_texture_view(view); } - self.encoder.reset_all(self.used_cmd_bufs.drain(..)); self.frames_recorded = 0; } } @@ -431,11 +431,14 @@ impl Example { unsafe { device.create_bind_group(&local_group_desc).unwrap() } }; + let init_fence_value = 1; let fence = unsafe { let mut fence = device.create_fence().unwrap(); let init_cmd = cmd_encoder.end_encoding().unwrap(); - queue.submit(&[&init_cmd], Some((&mut fence, 1))).unwrap(); - device.wait(&fence, 1, !0).unwrap(); + queue + .submit(&[&init_cmd], Some((&mut fence, init_fence_value))) + .unwrap(); + device.wait(&fence, init_fence_value, !0).unwrap(); device.destroy_buffer(staging_buffer); cmd_encoder.reset_all(iter::once(init_cmd)); fence @@ -464,7 +467,7 @@ impl Example { contexts: vec![ExecutionContext { encoder: cmd_encoder, fence, - fence_value: 1, + fence_value: init_fence_value + 1, used_views: Vec::new(), used_cmd_bufs: Vec::new(), frames_recorded: 0, @@ -512,6 +515,8 @@ impl Example { self.surface.unconfigure(&self.device); self.device.exit(); self.instance.destroy_surface(self.surface); + drop(self.adapter); + drop(self.queue); } } diff --git a/wgpu-hal/src/vulkan/instance.rs b/wgpu-hal/src/vulkan/instance.rs index 2e7c38a848..db9879705b 100644 --- a/wgpu-hal/src/vulkan/instance.rs +++ b/wgpu-hal/src/vulkan/instance.rs @@ -287,14 +287,21 @@ impl super::Instance { } } -impl Drop for super::InstanceShared { +impl Drop for super::Instance { fn drop(&mut self) { - unsafe { - if let Some(du) = self.debug_utils.take() { - du.extension - .destroy_debug_utils_messenger(du.messenger, None); + match Arc::get_mut(&mut self.shared) { + Some(shared) => unsafe { + if let Some(du) = shared.debug_utils.take() { + du.extension + .destroy_debug_utils_messenger(du.messenger, None); + } + }, + None => { + log::error!("Unable to drop Instance: something created from it is still alive"); } - self.raw.destroy_instance(None); + } + unsafe { + self.shared.raw.destroy_instance(None); } } } From e2f97ea6596340b4fed79e55a8a7a853e4c8d46e Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Sat, 3 Jul 2021 01:09:39 -0400 Subject: [PATCH 3/3] hal/gles: detect llvmpipe instead of lavapipe --- wgpu-hal/src/gles/adapter.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wgpu-hal/src/gles/adapter.rs b/wgpu-hal/src/gles/adapter.rs index f8d97d9851..658f9b0432 100644 --- a/wgpu-hal/src/gles/adapter.rs +++ b/wgpu-hal/src/gles/adapter.rs @@ -115,7 +115,7 @@ impl super::Adapter { "mali", "intel", ]; - let strings_that_imply_cpu = ["mesa offscreen", "swiftshader", "lavapipe"]; + let strings_that_imply_cpu = ["mesa offscreen", "swiftshader", "llvmpipe"]; //TODO: handle Intel Iris XE as discreet let inferred_device_type = if vendor.contains("qualcomm")