1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// use std::sync::{Arc, RwLock};
//
// pub struct DepthStencilTextureViewer {
// read_buffer: Option<wgpu::Buffer>,
// buffer_size: wgpu::BufferAddress,
// texture_size: (u32, u32),
// texture_data: Arc<RwLock<Vec<[u8; 4]>>>,
// }
//
// impl DepthStencilTextureViewer {
// pub fn new(device: &wgpu::Device, texture_size: (u32, u32)) -> Self {
// let buffer_size = (texture_size.0 * texture_size.1 * 4) as wgpu::BufferAddress;
// let read_buffer = device.create_buffer(&wgpu::BufferDescriptor {
// label: Some("Read Buffer"),
// size: buffer_size,
// usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ,
// mapped_at_creation: false,
// });
// let pixel = [0u8; 4];
// let texture_data = Arc::new(RwLock::new(vec![pixel; buffer_size as usize]));
// Self {
// read_buffer: Some(read_buffer),
// buffer_size,
// texture_size,
// texture_data,
// }
// }
//
// /// Called before submitting the frame
// pub fn copy_depth_stencil_texture_to_buffer(
// &mut self,
// encoder: &mut wgpu::CommandEncoder,
// depth_stencil_texture: &wgpu::Texture,
// ) {
// let texture_extent = wgpu::Extent3d {
// width: self.texture_size.0,
// height: self.texture_size.1,
// depth_or_array_layers: 1,
// };
//
// let buffer = self.read_buffer.as_ref().unwrap();
//
// encoder.copy_texture_to_buffer(
// wgpu::ImageCopyTexture {
// texture: depth_stencil_texture,
// mip_level: 0,
// origin: wgpu::Origin3d::ZERO,
// aspect: wgpu::TextureAspect::DepthOnly,
// },
// wgpu::ImageCopyBuffer {
// buffer,
// layout: wgpu::ImageDataLayout {
// offset: 0,
// bytes_per_row: Some(self.texture_size.0 * 4),
// rows_per_image: Some(self.texture_size.1),
// },
// },
// texture_extent,
// );
// }
//
// /// Before you can view the depth stencil texture, you need to call this method
// /// to copy texture data to memory
// pub fn save_depth_stencil_texture(&mut self, device: &wgpu::Device) {
// let read_buffer = Arc::new(self.read_buffer.take().unwrap());
// self.read_buffer = Some(device.create_buffer(&wgpu::BufferDescriptor {
// label: Some("Read Buffer"),
// size: self.buffer_size,
// usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ,
// mapped_at_creation: false,
// }));
//
// let read_buffer_2 = read_buffer.clone();
// let texture_data = self.texture_data.clone();
//
// read_buffer_2
// .slice(..)
// .map_async(wgpu::MapMode::Read, move |result| {
// if let Ok(()) = result {
// let data = read_buffer.slice(..).get_mapped_range();
// let mut data_guard = texture_data.write().unwrap();
// data.chunks(4).enumerate().for_each(|(i, chunk)| {
// data_guard[i] = [chunk[0], chunk[1], chunk[2], chunk[3]];
// });
// }
// });
// }
//
// pub fn print_texture_data_at_pixel(&self, x: u32, y: u32) {
// let data = self.texture_data.read().unwrap();
// let index = (y * self.texture_size.0 + x) as usize;
//
// let pixel_data = data[index];
// let depth_bits =
// u32::from_le_bytes([pixel_data[0], pixel_data[1], pixel_data[2], pixel_data[3]]);
// let depth_value = f32::from_bits(depth_bits);
//
// println!("{:?}", depth_value);
// }
// }