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); } } }