From 96bdaa2a9f978b27381ffbade03f53c3bbe5a9bf Mon Sep 17 00:00:00 2001 From: David Peicho Date: Tue, 5 May 2020 12:23:03 +0100 Subject: [PATCH] storage: add attribute to pretty-print invalid resource usage --- wgpu-core/src/device/mod.rs | 3 ++ wgpu-core/src/hub.rs | 59 ++++++++++++++++++++++++------------- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/wgpu-core/src/device/mod.rs b/wgpu-core/src/device/mod.rs index 968c4abeba..b40ec2ca61 100644 --- a/wgpu-core/src/device/mod.rs +++ b/wgpu-core/src/device/mod.rs @@ -1318,6 +1318,7 @@ impl Global { panic!("Mismatched buffer binding type for {:?}. Expected a type of UniformBuffer, StorageBuffer or ReadonlyStorageBuffer", decl) } }; + assert_eq!( bb.offset % alignment, 0, @@ -1325,6 +1326,7 @@ impl Global { bb.offset, alignment ); + let buffer = used .buffers .use_extend(&*buffer_guard, bb.buffer, (), internal_use) @@ -1359,6 +1361,7 @@ impl Global { | binding_model::BindingType::ComparisonSampler => {} _ => panic!("Mismatched sampler binding type in {:?}. Expected a type of Sampler or ComparisonSampler", decl.ty), } + let sampler = used .samplers .use_extend(&*sampler_guard, id, (), ()) diff --git a/wgpu-core/src/hub.rs b/wgpu-core/src/hub.rs index 4ee7cf9957..1e71733e22 100644 --- a/wgpu-core/src/hub.rs +++ b/wgpu-core/src/hub.rs @@ -80,6 +80,7 @@ impl IdentityManager { pub struct Storage { //TODO: consider concurrent hashmap? map: VecMap<(T, Epoch)>, + kind: &'static str, _phantom: PhantomData, } @@ -87,8 +88,15 @@ impl ops::Index for Storage { type Output = T; fn index(&self, id: I) -> &T { let (index, epoch, _) = id.unzip(); - let (ref value, storage_epoch) = self.map[index as usize]; - assert_eq!(epoch, storage_epoch); + let (ref value, storage_epoch) = match self.map.get(index as usize) { + Some(v) => v, + None => panic!("{}[{}] does not exist", self.kind, index), + }; + assert_eq!( + epoch, *storage_epoch, + "{}[{}] is no longer alive", + self.kind, index + ); value } } @@ -96,8 +104,15 @@ impl ops::Index for Storage { impl ops::IndexMut for Storage { fn index_mut(&mut self, id: I) -> &mut T { let (index, epoch, _) = id.unzip(); - let (ref mut value, storage_epoch) = self.map[index as usize]; - assert_eq!(epoch, storage_epoch); + let (ref mut value, storage_epoch) = match self.map.get_mut(index as usize) { + Some(v) => v, + None => panic!("{}[{}] does not exist", self.kind, index), + }; + assert_eq!( + epoch, *storage_epoch, + "{}[{}] is no longer alive", + self.kind, index + ); value } } @@ -304,22 +319,24 @@ pub struct Registry> { } impl> Registry { - fn new(backend: Backend, factory: &F) -> Self { + fn new(backend: Backend, factory: &F, kind: &'static str) -> Self { Registry { identity: factory.spawn(0), data: RwLock::new(Storage { map: VecMap::new(), + kind, _phantom: PhantomData, }), backend, } } - fn without_backend(factory: &F) -> Self { + fn without_backend(factory: &F, kind: &'static str) -> Self { Registry { identity: factory.spawn(1), data: RwLock::new(Storage { map: VecMap::new(), + kind, _phantom: PhantomData, }), backend: Backend::Empty, @@ -398,20 +415,20 @@ pub struct Hub { impl Hub { fn new(factory: &F) -> Self { Hub { - adapters: Registry::new(B::VARIANT, factory), - devices: Registry::new(B::VARIANT, factory), - swap_chains: Registry::new(B::VARIANT, factory), - pipeline_layouts: Registry::new(B::VARIANT, factory), - shader_modules: Registry::new(B::VARIANT, factory), - bind_group_layouts: Registry::new(B::VARIANT, factory), - bind_groups: Registry::new(B::VARIANT, factory), - command_buffers: Registry::new(B::VARIANT, factory), - render_pipelines: Registry::new(B::VARIANT, factory), - compute_pipelines: Registry::new(B::VARIANT, factory), - buffers: Registry::new(B::VARIANT, factory), - textures: Registry::new(B::VARIANT, factory), - texture_views: Registry::new(B::VARIANT, factory), - samplers: Registry::new(B::VARIANT, factory), + adapters: Registry::new(B::VARIANT, factory, "Adapter"), + devices: Registry::new(B::VARIANT, factory, "Device"), + swap_chains: Registry::new(B::VARIANT, factory, "SwapChain"), + pipeline_layouts: Registry::new(B::VARIANT, factory, "PipelineLayout"), + shader_modules: Registry::new(B::VARIANT, factory, "ShaderModule"), + bind_group_layouts: Registry::new(B::VARIANT, factory, "BindGroupLayout"), + bind_groups: Registry::new(B::VARIANT, factory, "BindGroup"), + command_buffers: Registry::new(B::VARIANT, factory, "CommandBuffer"), + render_pipelines: Registry::new(B::VARIANT, factory, "RenderPipeline"), + compute_pipelines: Registry::new(B::VARIANT, factory, "ComputePipeline"), + buffers: Registry::new(B::VARIANT, factory, "Buffer"), + textures: Registry::new(B::VARIANT, factory, "Texture"), + texture_views: Registry::new(B::VARIANT, factory, "TextureView"), + samplers: Registry::new(B::VARIANT, factory, "Sampler"), } } } @@ -556,7 +573,7 @@ impl Global { pub fn new(name: &str, factory: G) -> Self { Global { instance: Instance::new(name, 1), - surfaces: Registry::without_backend(&factory), + surfaces: Registry::without_backend(&factory, "Surface"), hubs: Hubs::new(&factory), } }