|
1 | | -use alloc::{format, string::String, sync::Arc, vec::Vec}; |
| 1 | +use alloc::{format, string::String, sync::Arc, vec, vec::Vec}; |
2 | 2 |
|
3 | 3 | use arrayvec::ArrayVec; |
4 | 4 | use thiserror::Error; |
@@ -922,19 +922,40 @@ impl Global { |
922 | 922 | ), |
923 | 923 | ); |
924 | 924 |
|
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![ |
931 | 927 | 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(), |
934 | 933 | 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 | + }; |
938 | 959 |
|
939 | 960 | let cmd_buf_raw = cmd_buf_data.encoder.open()?; |
940 | 961 | unsafe { |
@@ -1278,19 +1299,40 @@ impl Global { |
1278 | 1299 | height: src_copy_size.height.min(dst_copy_size.height), |
1279 | 1300 | depth: src_copy_size.depth.min(dst_copy_size.depth), |
1280 | 1301 | }; |
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![ |
1287 | 1304 | 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 | + }, |
1290 | 1310 | 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 | + }; |
1294 | 1336 | let cmd_buf_raw = cmd_buf_data.encoder.open()?; |
1295 | 1337 | unsafe { |
1296 | 1338 | cmd_buf_raw.transition_textures(&barriers); |
|
0 commit comments