| 
3720 | 3720 | <a href="#3719" id="3719">3719</a>  | 
3721 | 3721 | <a href="#3720" id="3720">3720</a>  | 
3722 | 3722 | <a href="#3721" id="3721">3721</a>  | 
3723 |  | -<a href="#3722" id="3722">3722</a>  | 
3724 |  | -<a href="#3723" id="3723">3723</a>  | 
3725 |  | -<a href="#3724" id="3724">3724</a>  | 
3726 |  | -<a href="#3725" id="3725">3725</a>  | 
3727 |  | -<a href="#3726" id="3726">3726</a>  | 
3728 | 3723 | </pre></div><pre class="rust"><code><span class="attr">#[cfg(feature = <span class="string">"trace"</span>)]  | 
3729 | 3724 | </span><span class="kw">use </span><span class="kw">crate</span>::device::trace;  | 
3730 | 3725 | <span class="kw">use crate</span>::{  | 
 | 
3758 | 3753 |         UsageScopePool,  | 
3759 | 3754 |     },  | 
3760 | 3755 |     validation::{<span class="self">self</span>, validate_color_attachment_bytes_per_sample},  | 
 | 3756 | +    weak_vec::WeakVec,  | 
3761 | 3757 |     FastHashMap, LabelHelpers, PreHashedKey, PreHashedMap,  | 
3762 | 3758 | };  | 
3763 | 3759 | 
 
  | 
 | 
3769 | 3765 | 
 
  | 
3770 | 3766 | <span class="kw">use </span>std::{  | 
3771 | 3767 |     borrow::Cow,  | 
3772 |  | -    mem::ManuallyDrop,  | 
 | 3768 | +    mem::{<span class="self">self</span>, ManuallyDrop},  | 
3773 | 3769 |     num::NonZeroU32,  | 
3774 | 3770 |     sync::{  | 
3775 | 3771 |         atomic::{AtomicBool, AtomicU64, Ordering},  | 
 | 
3877 | 3873 | }  | 
3878 | 3874 | 
 
  | 
3879 | 3875 | <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">enum </span>DeferredDestroy {  | 
3880 |  | -    TextureView(Weak<TextureView>),  | 
3881 |  | -    BindGroup(Weak<BindGroup>),  | 
 | 3876 | +    TextureViews(WeakVec<TextureView>),  | 
 | 3877 | +    BindGroups(WeakVec<BindGroup>),  | 
3882 | 3878 | }  | 
3883 | 3879 | 
 
  | 
3884 | 3880 | <span class="kw">impl </span>std::fmt::Debug <span class="kw">for </span>Device {  | 
 | 
4111 | 4107 |     /// implementation of a reference-counted structure).  | 
4112 | 4108 |     /// The snatch lock must not be held while this function is called.  | 
4113 | 4109 |     </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>deferred_resource_destruction(<span class="kw-2">&</span><span class="self">self</span>) {  | 
4114 |  | -        <span class="kw">while let </span><span class="prelude-val">Some</span>(item) = <span class="self">self</span>.deferred_destroy.lock().pop() {  | 
 | 4110 | +        <span class="kw">let </span>deferred_destroy = mem::take(<span class="kw-2">&mut *</span><span class="self">self</span>.deferred_destroy.lock());  | 
 | 4111 | +        <span class="kw">for </span>item <span class="kw">in </span>deferred_destroy {  | 
4115 | 4112 |             <span class="kw">match </span>item {  | 
4116 |  | -                DeferredDestroy::TextureView(view) => {  | 
4117 |  | -                    <span class="kw">let </span><span class="prelude-val">Some</span>(view) = view.upgrade() <span class="kw">else </span>{  | 
4118 |  | -                        <span class="kw">continue</span>;  | 
4119 |  | -                    };  | 
4120 |  | -                    <span class="kw">let </span><span class="prelude-val">Some</span>(raw_view) = view.raw.snatch(<span class="kw-2">&mut </span><span class="self">self</span>.snatchable_lock.write()) <span class="kw">else </span>{  | 
4121 |  | -                        <span class="kw">continue</span>;  | 
4122 |  | -                    };  | 
4123 |  | - | 
4124 |  | -                    <span class="macro">resource_log!</span>(<span class="string">"Destroy raw {}"</span>, view.error_ident());  | 
4125 |  | - | 
4126 |  | -                    <span class="kw">unsafe </span>{  | 
4127 |  | -                        <span class="self">self</span>.raw().destroy_texture_view(raw_view);  | 
 | 4113 | +                DeferredDestroy::TextureViews(views) => {  | 
 | 4114 | +                    <span class="kw">for </span>view <span class="kw">in </span>views {  | 
 | 4115 | +                        <span class="kw">let </span><span class="prelude-val">Some</span>(view) = view.upgrade() <span class="kw">else </span>{  | 
 | 4116 | +                            <span class="kw">continue</span>;  | 
 | 4117 | +                        };  | 
 | 4118 | +                        <span class="kw">let </span><span class="prelude-val">Some</span>(raw_view) = view.raw.snatch(<span class="kw-2">&mut </span><span class="self">self</span>.snatchable_lock.write())  | 
 | 4119 | +                        <span class="kw">else </span>{  | 
 | 4120 | +                            <span class="kw">continue</span>;  | 
 | 4121 | +                        };  | 
 | 4122 | + | 
 | 4123 | +                        <span class="macro">resource_log!</span>(<span class="string">"Destroy raw {}"</span>, view.error_ident());  | 
 | 4124 | + | 
 | 4125 | +                        <span class="kw">unsafe </span>{  | 
 | 4126 | +                            <span class="self">self</span>.raw().destroy_texture_view(raw_view);  | 
 | 4127 | +                        }  | 
4128 | 4128 |                     }  | 
4129 | 4129 |                 }  | 
4130 |  | -                DeferredDestroy::BindGroup(bind_group) => {  | 
4131 |  | -                    <span class="kw">let </span><span class="prelude-val">Some</span>(bind_group) = bind_group.upgrade() <span class="kw">else </span>{  | 
4132 |  | -                        <span class="kw">continue</span>;  | 
4133 |  | -                    };  | 
4134 |  | -                    <span class="kw">let </span><span class="prelude-val">Some</span>(raw_bind_group) =  | 
4135 |  | -                        bind_group.raw.snatch(<span class="kw-2">&mut </span><span class="self">self</span>.snatchable_lock.write())  | 
4136 |  | -                    <span class="kw">else </span>{  | 
4137 |  | -                        <span class="kw">continue</span>;  | 
4138 |  | -                    };  | 
4139 |  | - | 
4140 |  | -                    <span class="macro">resource_log!</span>(<span class="string">"Destroy raw {}"</span>, bind_group.error_ident());  | 
4141 |  | - | 
4142 |  | -                    <span class="kw">unsafe </span>{  | 
4143 |  | -                        <span class="self">self</span>.raw().destroy_bind_group(raw_bind_group);  | 
 | 4130 | +                DeferredDestroy::BindGroups(bind_groups) => {  | 
 | 4131 | +                    <span class="kw">for </span>bind_group <span class="kw">in </span>bind_groups {  | 
 | 4132 | +                        <span class="kw">let </span><span class="prelude-val">Some</span>(bind_group) = bind_group.upgrade() <span class="kw">else </span>{  | 
 | 4133 | +                            <span class="kw">continue</span>;  | 
 | 4134 | +                        };  | 
 | 4135 | +                        <span class="kw">let </span><span class="prelude-val">Some</span>(raw_bind_group) =  | 
 | 4136 | +                            bind_group.raw.snatch(<span class="kw-2">&mut </span><span class="self">self</span>.snatchable_lock.write())  | 
 | 4137 | +                        <span class="kw">else </span>{  | 
 | 4138 | +                            <span class="kw">continue</span>;  | 
 | 4139 | +                        };  | 
 | 4140 | + | 
 | 4141 | +                        <span class="macro">resource_log!</span>(<span class="string">"Destroy raw {}"</span>, bind_group.error_ident());  | 
 | 4142 | + | 
 | 4143 | +                        <span class="kw">unsafe </span>{  | 
 | 4144 | +                            <span class="self">self</span>.raw().destroy_bind_group(raw_bind_group);  | 
 | 4145 | +                        }  | 
4144 | 4146 |                     }  | 
4145 | 4147 |                 }  | 
4146 | 4148 |             }  | 
 | 
4365 | 4367 |             map_state: Mutex::new(rank::BUFFER_MAP_STATE, resource::BufferMapState::Idle),  | 
4366 | 4368 |             label: desc.label.to_string(),  | 
4367 | 4369 |             tracking_data: TrackingData::new(<span class="self">self</span>.tracker_indices.buffers.clone()),  | 
4368 |  | -            bind_groups: Mutex::new(rank::BUFFER_BIND_GROUPS, Vec::new()),  | 
 | 4370 | +            bind_groups: Mutex::new(rank::BUFFER_BIND_GROUPS, WeakVec::new()),  | 
4369 | 4371 |             <span class="attr">#[cfg(feature = <span class="string">"indirect-validation"</span>)]  | 
4370 | 4372 |             </span>raw_indirect_validation_bind_group,  | 
4371 | 4373 |         };  | 
 | 
4480 | 4482 |             map_state: Mutex::new(rank::BUFFER_MAP_STATE, resource::BufferMapState::Idle),  | 
4481 | 4483 |             label: desc.label.to_string(),  | 
4482 | 4484 |             tracking_data: TrackingData::new(<span class="self">self</span>.tracker_indices.buffers.clone()),  | 
4483 |  | -            bind_groups: Mutex::new(rank::BUFFER_BIND_GROUPS, Vec::new()),  | 
 | 4485 | +            bind_groups: Mutex::new(rank::BUFFER_BIND_GROUPS, WeakVec::new()),  | 
4484 | 4486 |             <span class="attr">#[cfg(feature = <span class="string">"indirect-validation"</span>)]  | 
4485 | 4487 |             </span>raw_indirect_validation_bind_group,  | 
4486 | 4488 |         };  | 
 | 
5113 | 5115 | 
 
  | 
5114 | 5116 |         {  | 
5115 | 5117 |             <span class="kw">let </span><span class="kw-2">mut </span>views = texture.views.lock();  | 
5116 |  | - | 
5117 |  | -            <span class="comment">// Remove stale weak references  | 
5118 |  | -            </span>views.retain(|view| view.strong_count() > <span class="number">0</span>);  | 
5119 |  | - | 
5120 | 5118 |             views.push(Arc::downgrade(<span class="kw-2">&</span>view));  | 
5121 | 5119 |         }  | 
5122 | 5120 | 
 
  | 
 | 
6106 | 6104 |         <span class="kw">let </span>weak_ref = Arc::downgrade(<span class="kw-2">&</span>bind_group);  | 
6107 | 6105 |         <span class="kw">for </span>range <span class="kw">in </span><span class="kw-2">&</span>bind_group.used_texture_ranges {  | 
6108 | 6106 |             <span class="kw">let </span><span class="kw-2">mut </span>bind_groups = range.texture.bind_groups.lock();  | 
6109 |  | - | 
6110 |  | -            <span class="comment">// Remove stale weak references  | 
6111 |  | -            </span>bind_groups.retain(|bg| bg.strong_count() > <span class="number">0</span>);  | 
6112 |  | - | 
6113 | 6107 |             bind_groups.push(weak_ref.clone());  | 
6114 | 6108 |         }  | 
6115 | 6109 |         <span class="kw">for </span>range <span class="kw">in </span><span class="kw-2">&</span>bind_group.used_buffer_ranges {  | 
6116 | 6110 |             <span class="kw">let </span><span class="kw-2">mut </span>bind_groups = range.buffer.bind_groups.lock();  | 
6117 |  | - | 
6118 |  | -            <span class="comment">// Remove stale weak references  | 
6119 |  | -            </span>bind_groups.retain(|bg| bg.strong_count() > <span class="number">0</span>);  | 
6120 |  | - | 
6121 | 6111 |             bind_groups.push(weak_ref.clone());  | 
6122 | 6112 |         }  | 
6123 | 6113 | 
 
  | 
 | 
0 commit comments