|
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