From 40ec1ac4c1266ec3181b2e57179edbeac3f253d3 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Tue, 14 May 2019 11:13:08 -0400 Subject: [PATCH] Fix command buffer and surface locking order --- wgpu-native/src/command/compute.rs | 3 ++- wgpu-native/src/command/mod.rs | 2 +- wgpu-native/src/command/render.rs | 3 +-- wgpu-native/src/device.rs | 4 ++-- wgpu-native/src/hub.rs | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/wgpu-native/src/command/compute.rs b/wgpu-native/src/command/compute.rs index 032b4d2c8e..dfe9fdf132 100644 --- a/wgpu-native/src/command/compute.rs +++ b/wgpu-native/src/command/compute.rs @@ -35,11 +35,12 @@ impl ComputePass { #[no_mangle] pub extern "C" fn wgpu_compute_pass_end_pass(pass_id: ComputePassId) -> CommandBufferId { + let mut command_buffer_guard = HUB.command_buffers.write(); let pass = HUB.compute_passes.unregister(pass_id); //TODO: transitions? - HUB.command_buffers.write()[pass.cmb_id.value] + command_buffer_guard[pass.cmb_id.value] .raw .push(pass.raw); pass.cmb_id.value diff --git a/wgpu-native/src/command/mod.rs b/wgpu-native/src/command/mod.rs index f783a13bfc..9c789bb65f 100644 --- a/wgpu-native/src/command/mod.rs +++ b/wgpu-native/src/command/mod.rs @@ -166,9 +166,9 @@ pub fn command_encoder_begin_render_pass( command_encoder_id: CommandEncoderId, desc: RenderPassDescriptor, ) -> RenderPass { + let device_guard = HUB.devices.read(); let mut cmb_guard = HUB.command_buffers.write(); let cmb = &mut cmb_guard[command_encoder_id]; - let device_guard = HUB.devices.read(); let device = &device_guard[cmb.device_id.value]; let view_guard = HUB.texture_views.read(); diff --git a/wgpu-native/src/command/render.rs b/wgpu-native/src/command/render.rs index 56e1bf37c4..0d4c4d9e51 100644 --- a/wgpu-native/src/command/render.rs +++ b/wgpu-native/src/command/render.rs @@ -89,12 +89,11 @@ impl RenderPass { #[no_mangle] pub extern "C" fn wgpu_render_pass_end_pass(pass_id: RenderPassId) -> CommandBufferId { + let mut cmb_guard = HUB.command_buffers.write(); let mut pass = HUB.render_passes.unregister(pass_id); unsafe { pass.raw.end_render_pass(); } - - let mut cmb_guard = HUB.command_buffers.write(); let cmb = &mut cmb_guard[pass.cmb_id.value]; match cmb.raw.last_mut() { diff --git a/wgpu-native/src/device.rs b/wgpu-native/src/device.rs index 3ed7442f6a..c7db4e739a 100644 --- a/wgpu-native/src/device.rs +++ b/wgpu-native/src/device.rs @@ -1234,6 +1234,7 @@ pub extern "C" fn wgpu_queue_submit( unsafe { slice::from_raw_parts(command_buffer_ptr, command_buffer_count) }; let (submit_index, fence) = { + let surface_guard = HUB.surfaces.read(); let mut device_guard = HUB.devices.write(); let device = &mut device_guard[queue_id]; let mut trackers = device.trackers.lock(); @@ -1310,7 +1311,6 @@ pub extern "C" fn wgpu_queue_submit( let fence = device.raw.create_fence(false).unwrap(); { let command_buffer_guard = HUB.command_buffers.read(); - let surface_guard = HUB.surfaces.read(); let wait_semaphores = swap_chain_links.into_iter().flat_map(|link| { let swap_chain = surface_guard[link.swap_chain_id].swap_chain.as_ref()?; @@ -1655,9 +1655,9 @@ pub fn device_create_swap_chain( ) -> Vec> { info!("creating swap chain {:?}", desc); + let mut surface_guard = HUB.surfaces.write(); let device_guard = HUB.devices.read(); let device = &device_guard[device_id]; - let mut surface_guard = HUB.surfaces.write(); let surface = &mut surface_guard[surface_id]; let (caps, formats, _present_modes) = { diff --git a/wgpu-native/src/hub.rs b/wgpu-native/src/hub.rs index 0d652b0e86..48490d2d60 100644 --- a/wgpu-native/src/hub.rs +++ b/wgpu-native/src/hub.rs @@ -174,6 +174,7 @@ impl Registry { #[derive(Default)] pub struct Hub { pub instances: Arc>, + pub surfaces: Arc>, pub adapters: Arc>, pub devices: Arc>, pub pipeline_layouts: Arc>, @@ -189,7 +190,6 @@ pub struct Hub { pub textures: Arc>, pub texture_views: Arc>, pub samplers: Arc>, - pub surfaces: Arc>, } lazy_static! {