Skip to content

Commit 55725d6

Browse files
authored
Destroy texture views in clear_mode when destroying texture (#7705)
1 parent 45b3d66 commit 55725d6

File tree

3 files changed

+29
-7
lines changed

3 files changed

+29
-7
lines changed

wgpu-core/src/command/clear.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ pub(crate) fn clear_texture<T: TextureTrackerSetSingle>(
272272
let dst_raw = dst_texture.try_raw(snatch_guard)?;
273273

274274
// Issue the right barrier.
275-
let clear_usage = match dst_texture.clear_mode {
275+
let clear_usage = match *dst_texture.clear_mode.read() {
276276
TextureClearMode::BufferCopy => wgt::TextureUses::COPY_DST,
277277
TextureClearMode::RenderPass {
278278
is_color: false, ..
@@ -314,7 +314,8 @@ pub(crate) fn clear_texture<T: TextureTrackerSetSingle>(
314314
}
315315

316316
// Record actual clearing
317-
match dst_texture.clear_mode {
317+
let clear_mode = dst_texture.clear_mode.read();
318+
match *clear_mode {
318319
TextureClearMode::BufferCopy => clear_texture_via_buffer_copies(
319320
&dst_texture.desc,
320321
alignments,
@@ -324,9 +325,11 @@ pub(crate) fn clear_texture<T: TextureTrackerSetSingle>(
324325
dst_raw,
325326
),
326327
TextureClearMode::Surface { .. } => {
328+
drop(clear_mode);
327329
clear_texture_via_render_passes(dst_texture, range, true, encoder)?
328330
}
329331
TextureClearMode::RenderPass { is_color, .. } => {
332+
drop(clear_mode);
330333
clear_texture_via_render_passes(dst_texture, range, is_color, encoder)?
331334
}
332335
TextureClearMode::None => {
@@ -446,6 +449,8 @@ fn clear_texture_via_render_passes(
446449
depth_or_array_layers: 1, // Only one layer is cleared at a time.
447450
};
448451

452+
let clear_mode = dst_texture.clear_mode.read();
453+
449454
for mip_level in range.mip_range {
450455
let extent = extent_base.mip_level_size(mip_level, dst_texture.desc.dimension);
451456
for depth_or_layer in range.layer_range.clone() {
@@ -454,7 +459,7 @@ fn clear_texture_via_render_passes(
454459
color_attachments_tmp = [Some(hal::ColorAttachment {
455460
target: hal::Attachment {
456461
view: Texture::get_clear_view(
457-
&dst_texture.clear_mode,
462+
&clear_mode,
458463
&dst_texture.desc,
459464
mip_level,
460465
depth_or_layer,
@@ -473,7 +478,7 @@ fn clear_texture_via_render_passes(
473478
Some(hal::DepthStencilAttachment {
474479
target: hal::Attachment {
475480
view: Texture::get_clear_view(
476-
&dst_texture.clear_mode,
481+
&clear_mode,
477482
&dst_texture.desc,
478483
mip_level,
479484
depth_or_layer,

wgpu-core/src/lock/rank.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ define_lock_ranks! {
145145
rank SURFACE_PRESENTATION "Surface::presentation" followed by { }
146146
rank TEXTURE_BIND_GROUPS "Texture::bind_groups" followed by { }
147147
rank TEXTURE_INITIALIZATION_STATUS "Texture::initialization_status" followed by { }
148+
rank TEXTURE_CLEAR_MODE "Texture::clear_mode" followed by { }
148149
rank TEXTURE_VIEWS "Texture::views" followed by { }
149150
rank BLAS_BUILT_INDEX "Blas::built_index" followed by { }
150151
rank TLAS_BUILT_INDEX "Tlas::built_index" followed by { }

wgpu-core/src/resource.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,7 +1029,7 @@ pub struct Texture {
10291029
/// The `label` from the descriptor used to create the resource.
10301030
pub(crate) label: String,
10311031
pub(crate) tracking_data: TrackingData,
1032-
pub(crate) clear_mode: TextureClearMode,
1032+
pub(crate) clear_mode: RwLock<TextureClearMode>,
10331033
pub(crate) views: Mutex<WeakVec<TextureView>>,
10341034
pub(crate) bind_groups: Mutex<WeakVec<BindGroup>>,
10351035
}
@@ -1064,7 +1064,7 @@ impl Texture {
10641064
},
10651065
label: desc.label.to_string(),
10661066
tracking_data: TrackingData::new(device.tracker_indices.textures.clone()),
1067-
clear_mode,
1067+
clear_mode: RwLock::new(rank::TEXTURE_CLEAR_MODE, clear_mode),
10681068
views: Mutex::new(rank::TEXTURE_VIEWS, WeakVec::new()),
10691069
bind_groups: Mutex::new(rank::TEXTURE_BIND_GROUPS, WeakVec::new()),
10701070
}
@@ -1090,7 +1090,7 @@ impl Texture {
10901090

10911091
impl Drop for Texture {
10921092
fn drop(&mut self) {
1093-
match self.clear_mode {
1093+
match *self.clear_mode.write() {
10941094
TextureClearMode::Surface {
10951095
ref mut clear_view, ..
10961096
} => {
@@ -1208,6 +1208,7 @@ impl Texture {
12081208
queue::TempResource::DestroyedTexture(DestroyedTexture {
12091209
raw: ManuallyDrop::new(raw),
12101210
views,
1211+
clear_mode: mem::replace(&mut *self.clear_mode.write(), TextureClearMode::None),
12111212
bind_groups,
12121213
device: Arc::clone(&self.device),
12131214
label: self.label().to_owned(),
@@ -1471,6 +1472,7 @@ impl Global {
14711472
pub struct DestroyedTexture {
14721473
raw: ManuallyDrop<Box<dyn hal::DynTexture>>,
14731474
views: WeakVec<TextureView>,
1475+
clear_mode: TextureClearMode,
14741476
bind_groups: WeakVec<BindGroup>,
14751477
device: Arc<Device>,
14761478
label: String,
@@ -1493,6 +1495,20 @@ impl Drop for DestroyedTexture {
14931495
)));
14941496
drop(deferred);
14951497

1498+
match mem::replace(&mut self.clear_mode, TextureClearMode::None) {
1499+
TextureClearMode::RenderPass { clear_views, .. } => {
1500+
for clear_view in clear_views {
1501+
let raw = ManuallyDrop::into_inner(clear_view);
1502+
unsafe { self.device.raw().destroy_texture_view(raw) };
1503+
}
1504+
}
1505+
TextureClearMode::Surface { clear_view } => {
1506+
let raw = ManuallyDrop::into_inner(clear_view);
1507+
unsafe { self.device.raw().destroy_texture_view(raw) };
1508+
}
1509+
_ => (),
1510+
}
1511+
14961512
resource_log!("Destroy raw Texture (destroyed) {:?}", self.label());
14971513
// SAFETY: We are in the Drop impl and we don't use self.raw anymore after this point.
14981514
let raw = unsafe { ManuallyDrop::take(&mut self.raw) };

0 commit comments

Comments
 (0)