From f9cd55ed59cbecf9da36f8412390e292871c1e86 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Fri, 19 Oct 2018 10:45:11 -0400 Subject: [PATCH] Share use_xxx implementations in the tracker --- wgpu-native/src/command/mod.rs | 2 - wgpu-native/src/command/render.rs | 7 +-- wgpu-native/src/track.rs | 76 +++++++++++++++---------------- 3 files changed, 39 insertions(+), 46 deletions(-) diff --git a/wgpu-native/src/command/mod.rs b/wgpu-native/src/command/mod.rs index 695a102776..d4dd5658be 100644 --- a/wgpu-native/src/command/mod.rs +++ b/wgpu-native/src/command/mod.rs @@ -92,7 +92,6 @@ pub extern "C" fn wgpu_command_buffer_begin_render_pass( let device_guard = HUB.devices.lock(); let device = device_guard.get(cmb.device_id.0); - let transit_comb = cmb.raw.pop().unwrap(); let current_comb = device.com_allocator.extend(cmb); //let render_pass = device.create_render_pass(); @@ -111,7 +110,6 @@ pub extern "C" fn wgpu_command_buffer_begin_render_pass( .lock() .register(RenderPass::new( current_comb, - transit_comb, command_buffer_id, )) } diff --git a/wgpu-native/src/command/render.rs b/wgpu-native/src/command/render.rs index 4c4dd1b450..2c5892738d 100644 --- a/wgpu-native/src/command/render.rs +++ b/wgpu-native/src/command/render.rs @@ -13,7 +13,6 @@ use std::iter; pub struct RenderPass { raw: B::CommandBuffer, - parent: B::CommandBuffer, cmb_id: Stored, tracker: Tracker, } @@ -21,12 +20,10 @@ pub struct RenderPass { impl RenderPass { pub fn new( raw: B::CommandBuffer, - parent: B::CommandBuffer, cmb_id: CommandBufferId, ) -> Self { RenderPass { raw, - parent, cmb_id: Stored(cmb_id), tracker: Tracker::default(), } @@ -42,13 +39,11 @@ pub extern "C" fn wgpu_render_pass_end_pass( .take(pass_id); pass.raw.end_render_pass(); - let combs = iter::once(pass.parent) - .chain(iter::once(pass.raw)); HUB.command_buffers .lock() .get_mut(pass.cmb_id.0) .raw - .extend(combs); + .push(pass.raw); pass.cmb_id.0 } diff --git a/wgpu-native/src/track.rs b/wgpu-native/src/track.rs index 7f72a1f2e0..d3584bb51e 100644 --- a/wgpu-native/src/track.rs +++ b/wgpu-native/src/track.rs @@ -2,7 +2,8 @@ use {Stored, BufferId, TextureId}; use resource::{BufferUsageFlags, TextureUsageFlags}; use std::collections::hash_map::{Entry, HashMap}; -use std::ops::Range; +use std::hash::Hash; +use std::ops::BitOr; use std::sync::Mutex; @@ -22,33 +23,47 @@ bitflags! { } +trait GenericUsage { + fn is_exclusive(&self) -> bool; +} +impl GenericUsage for BufferUsageFlags { + fn is_exclusive(&self) -> bool { + BufferUsageFlags::WRITE_ALL.intersects(*self) + } +} +impl GenericUsage for TextureUsageFlags { + fn is_exclusive(&self) -> bool { + TextureUsageFlags::WRITE_ALL.intersects(*self) + } +} + #[derive(Default)] pub struct Tracker { - buffers: Mutex, Range>>, - textures: Mutex, Range>>, + buffers: Mutex, BufferUsageFlags>>, + textures: Mutex, TextureUsageFlags>>, } impl Tracker { - pub(crate) fn use_buffer( - &self, id: Stored, usage: BufferUsageFlags, permit: UsePermit, - ) -> Result, BufferUsageFlags> { - match self.buffers.lock().unwrap().entry(id) { + fn use_impl( + map: &mut HashMap, id: I, usage: U, permit: UsePermit + ) -> Result, U> + where + I: Hash + Eq, + U: Copy + GenericUsage + BitOr + PartialEq, + { + match map.entry(id) { Entry::Vacant(e) => { - e.insert(usage .. usage); + e.insert(usage); Ok(UseAction::Init) } Entry::Occupied(mut e) => { - let old = e.get().end; + let old = *e.get(); if usage == old { Ok(UseAction::Keep) - } else if permit.contains(UsePermit::EXTEND) && - !BufferUsageFlags::WRITE_ALL.intersects(old | usage) - { - e.get_mut().end |= usage; - Ok(UseAction::Extend { old }) + } else if permit.contains(UsePermit::EXTEND) && !(old | usage).is_exclusive() { + Ok(UseAction::Extend { old: e.insert(old | usage) }) } else if permit.contains(UsePermit::REPLACE) { - e.get_mut().end = usage; - Ok(UseAction::Replace { old }) + Ok(UseAction::Replace { old: e.insert(usage) }) } else { Err(old) } @@ -56,30 +71,15 @@ impl Tracker { } } + pub(crate) fn use_buffer( + &self, id: Stored, usage: BufferUsageFlags, permit: UsePermit, + ) -> Result, BufferUsageFlags> { + Self::use_impl(&mut *self.buffers.lock().unwrap(), id, usage, permit) + } + pub(crate) fn use_texture( &self, id: Stored, usage: TextureUsageFlags, permit: UsePermit, ) -> Result, TextureUsageFlags> { - match self.textures.lock().unwrap().entry(id) { - Entry::Vacant(e) => { - e.insert(usage .. usage); - Ok(UseAction::Init) - } - Entry::Occupied(mut e) => { - let old = e.get().end; - if usage == old { - Ok(UseAction::Keep) - } else if permit.contains(UsePermit::EXTEND) && - !TextureUsageFlags::WRITE_ALL.intersects(old | usage) - { - e.get_mut().end |= usage; - Ok(UseAction::Extend { old }) - } else if permit.contains(UsePermit::REPLACE) { - e.get_mut().end = usage; - Ok(UseAction::Replace { old }) - } else { - Err(old) - } - } - } + Self::use_impl(&mut *self.textures.lock().unwrap(), id, usage, permit) } }