Skip to content

Commit 0b8f788

Browse files
committed
Maybe fix dx12 depth-stencil issue?
1 parent 9c2847b commit 0b8f788

File tree

1 file changed

+65
-23
lines changed

1 file changed

+65
-23
lines changed

wgpu-core/src/command/transfer.rs

Lines changed: 65 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use alloc::{format, string::String, sync::Arc, vec::Vec};
1+
use alloc::{format, string::String, sync::Arc, vec, vec::Vec};
22

33
use arrayvec::ArrayVec;
44
use thiserror::Error;
@@ -922,19 +922,40 @@ impl Global {
922922
),
923923
);
924924

925-
let regions = (0..array_layer_count)
926-
.map(|rel_array_layer| {
927-
let mut texture_base = dst_base.clone();
928-
texture_base.array_layer += rel_array_layer;
929-
let mut buffer_layout = source.layout;
930-
buffer_layout.offset += rel_array_layer as u64 * bytes_per_array_layer;
925+
let regions = if dst_base.aspect == hal::FormatAspects::DEPTH_STENCIL {
926+
vec![
931927
hal::BufferTextureCopy {
932-
buffer_layout,
933-
texture_base,
928+
texture_base: hal::TextureCopyBase {
929+
aspect: hal::FormatAspects::DEPTH,
930+
..dst_base
931+
},
932+
buffer_layout: source.layout.clone(),
934933
size: hal_copy_size,
935-
}
936-
})
937-
.collect::<Vec<_>>();
934+
},
935+
hal::BufferTextureCopy {
936+
texture_base: hal::TextureCopyBase {
937+
aspect: hal::FormatAspects::STENCIL,
938+
..dst_base
939+
},
940+
buffer_layout: source.layout.clone(),
941+
size: hal_copy_size,
942+
},
943+
]
944+
} else {
945+
(0..array_layer_count)
946+
.map(|rel_array_layer| {
947+
let mut texture_base = dst_base.clone();
948+
texture_base.array_layer += rel_array_layer;
949+
let mut buffer_layout = source.layout.clone();
950+
buffer_layout.offset += rel_array_layer as u64 * bytes_per_array_layer;
951+
hal::BufferTextureCopy {
952+
buffer_layout,
953+
texture_base,
954+
size: hal_copy_size,
955+
}
956+
})
957+
.collect()
958+
};
938959

939960
let cmd_buf_raw = cmd_buf_data.encoder.open()?;
940961
unsafe {
@@ -1278,19 +1299,40 @@ impl Global {
12781299
height: src_copy_size.height.min(dst_copy_size.height),
12791300
depth: src_copy_size.depth.min(dst_copy_size.depth),
12801301
};
1281-
let regions = (0..array_layer_count)
1282-
.map(|rel_array_layer| {
1283-
let mut src_base = src_tex_base.clone();
1284-
let mut dst_base = dst_tex_base.clone();
1285-
src_base.array_layer += rel_array_layer;
1286-
dst_base.array_layer += rel_array_layer;
1302+
let regions = if dst_tex_base.aspect == hal::FormatAspects::DEPTH_STENCIL {
1303+
vec![
12871304
hal::TextureCopy {
1288-
src_base,
1289-
dst_base,
1305+
src_base: src_tex_base.clone(),
1306+
dst_base: hal::TextureCopyBase {
1307+
aspect: hal::FormatAspects::DEPTH,
1308+
..dst_tex_base
1309+
},
12901310
size: hal_copy_size,
1291-
}
1292-
})
1293-
.collect::<Vec<_>>();
1311+
},
1312+
hal::TextureCopy {
1313+
src_base: src_tex_base.clone(),
1314+
dst_base: hal::TextureCopyBase {
1315+
aspect: hal::FormatAspects::STENCIL,
1316+
..dst_tex_base
1317+
},
1318+
size: hal_copy_size,
1319+
},
1320+
]
1321+
} else {
1322+
(0..array_layer_count)
1323+
.map(|rel_array_layer| {
1324+
let mut src_base = src_tex_base.clone();
1325+
let mut dst_base = dst_tex_base.clone();
1326+
src_base.array_layer += rel_array_layer;
1327+
dst_base.array_layer += rel_array_layer;
1328+
hal::TextureCopy {
1329+
src_base,
1330+
dst_base,
1331+
size: hal_copy_size,
1332+
}
1333+
})
1334+
.collect()
1335+
};
12941336
let cmd_buf_raw = cmd_buf_data.encoder.open()?;
12951337
unsafe {
12961338
cmd_buf_raw.transition_textures(&barriers);

0 commit comments

Comments
 (0)