Skip to content
This repository was archived by the owner on Jun 18, 2021. It is now read-only.

Commit e82ac7a

Browse files
bors[bot]Coder-256
andauthored
Merge #127
127: Use u8 for buffer mapping r=kvark a=Coder-256 cc @kvark @grovesNL This is a temporary solution for #119, and a follow-up for #126. Co-authored-by: Jacob Greenfield <[email protected]>
2 parents a18b43b + 0227c08 commit e82ac7a

File tree

13 files changed

+441
-372
lines changed

13 files changed

+441
-372
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ rev = "73b33ea76e2f91b3114aa7640b1d60518d39f915"
3737
[dependencies]
3838
arrayvec = "0.5"
3939
raw-window-handle = "0.3"
40-
zerocopy = "0.2"
4140

4241
[dev-dependencies]
4342
cgmath = "0.17"
@@ -46,3 +45,4 @@ glsl-to-spirv = "0.1"
4645
log = "0.4"
4746
png = "0.15"
4847
winit = "0.20.0-alpha4"
48+
zerocopy = "0.2"

examples/capture/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ fn main() {
1212
power_preference: wgpu::PowerPreference::Default,
1313
},
1414
wgpu::BackendBit::PRIMARY,
15-
).unwrap();
15+
)
16+
.unwrap();
1617

1718
let (device, mut queue) = adapter.request_device(&wgpu::DeviceDescriptor {
1819
extensions: wgpu::Extensions {

examples/cube/main.rs

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
#[path = "../framework.rs"]
22
mod framework;
33

4+
use zerocopy::{AsBytes, FromBytes};
5+
46
#[repr(C)]
5-
#[derive(Clone, Copy, zerocopy::AsBytes, zerocopy::FromBytes)]
7+
#[derive(Clone, Copy, AsBytes, FromBytes)]
68
struct Vertex {
79
_pos: [f32; 4],
810
_tex_coord: [f32; 2],
@@ -107,7 +109,10 @@ impl Example {
107109
}
108110

109111
impl framework::Example for Example {
110-
fn init(sc_desc: &wgpu::SwapChainDescriptor, device: &wgpu::Device) -> (Self, Option<wgpu::CommandBuffer>) {
112+
fn init(
113+
sc_desc: &wgpu::SwapChainDescriptor,
114+
device: &wgpu::Device,
115+
) -> (Self, Option<wgpu::CommandBuffer>) {
111116
use std::mem;
112117

113118
let mut init_encoder =
@@ -116,23 +121,20 @@ impl framework::Example for Example {
116121
// Create the vertex and index buffers
117122
let vertex_size = mem::size_of::<Vertex>();
118123
let (vertex_data, index_data) = create_vertices();
119-
let vertex_buf = device
120-
.create_buffer_mapped(vertex_data.len(), wgpu::BufferUsage::VERTEX)
121-
.fill_from_slice(&vertex_data);
122124

123-
let index_buf = device
124-
.create_buffer_mapped(index_data.len(), wgpu::BufferUsage::INDEX)
125-
.fill_from_slice(&index_data);
125+
let vertex_buf =
126+
device.create_buffer_with_data(vertex_data.as_bytes(), wgpu::BufferUsage::VERTEX);
127+
128+
let index_buf =
129+
device.create_buffer_with_data(index_data.as_bytes(), wgpu::BufferUsage::INDEX);
126130

127131
// Create pipeline layout
128132
let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
129133
bindings: &[
130134
wgpu::BindGroupLayoutBinding {
131135
binding: 0,
132136
visibility: wgpu::ShaderStage::VERTEX,
133-
ty: wgpu::BindingType::UniformBuffer {
134-
dynamic: false,
135-
},
137+
ty: wgpu::BindingType::UniformBuffer { dynamic: false },
136138
},
137139
wgpu::BindGroupLayoutBinding {
138140
binding: 1,
@@ -171,9 +173,8 @@ impl framework::Example for Example {
171173
usage: wgpu::TextureUsage::SAMPLED | wgpu::TextureUsage::COPY_DST,
172174
});
173175
let texture_view = texture.create_default_view();
174-
let temp_buf = device
175-
.create_buffer_mapped(texels.len(), wgpu::BufferUsage::COPY_SRC)
176-
.fill_from_slice(&texels);
176+
let temp_buf =
177+
device.create_buffer_with_data(texels.as_slice(), wgpu::BufferUsage::COPY_SRC);
177178
init_encoder.copy_buffer_to_texture(
178179
wgpu::BufferCopyView {
179180
buffer: &temp_buf,
@@ -208,12 +209,10 @@ impl framework::Example for Example {
208209
});
209210
let mx_total = Self::generate_matrix(sc_desc.width as f32 / sc_desc.height as f32);
210211
let mx_ref: &[f32; 16] = mx_total.as_ref();
211-
let uniform_buf = device
212-
.create_buffer_mapped(
213-
16,
214-
wgpu::BufferUsage::UNIFORM | wgpu::BufferUsage::COPY_DST,
215-
)
216-
.fill_from_slice(mx_ref);
212+
let uniform_buf = device.create_buffer_with_data(
213+
mx_ref.as_bytes(),
214+
wgpu::BufferUsage::UNIFORM | wgpu::BufferUsage::COPY_DST,
215+
);
217216

218217
// Create bind group
219218
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
@@ -310,21 +309,28 @@ impl framework::Example for Example {
310309
//empty
311310
}
312311

313-
fn resize(&mut self, sc_desc: &wgpu::SwapChainDescriptor, device: &wgpu::Device) -> Option<wgpu::CommandBuffer> {
312+
fn resize(
313+
&mut self,
314+
sc_desc: &wgpu::SwapChainDescriptor,
315+
device: &wgpu::Device,
316+
) -> Option<wgpu::CommandBuffer> {
314317
let mx_total = Self::generate_matrix(sc_desc.width as f32 / sc_desc.height as f32);
315318
let mx_ref: &[f32; 16] = mx_total.as_ref();
316319

317-
let temp_buf = device
318-
.create_buffer_mapped(16, wgpu::BufferUsage::COPY_SRC)
319-
.fill_from_slice(mx_ref);
320+
let temp_buf =
321+
device.create_buffer_with_data(mx_ref.as_bytes(), wgpu::BufferUsage::COPY_SRC);
320322

321323
let mut encoder =
322324
device.create_command_encoder(&wgpu::CommandEncoderDescriptor { todo: 0 });
323325
encoder.copy_buffer_to_buffer(&temp_buf, 0, &self.uniform_buf, 0, 64);
324326
Some(encoder.finish())
325327
}
326328

327-
fn render(&mut self, frame: &wgpu::SwapChainOutput, device: &wgpu::Device) -> wgpu::CommandBuffer {
329+
fn render(
330+
&mut self,
331+
frame: &wgpu::SwapChainOutput,
332+
device: &wgpu::Device,
333+
) -> wgpu::CommandBuffer {
328334
let mut encoder =
329335
device.create_command_encoder(&wgpu::CommandEncoderDescriptor { todo: 0 });
330336
{

examples/describe/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ fn main() {
77
power_preference: wgpu::PowerPreference::Default,
88
},
99
wgpu::BackendBit::PRIMARY,
10-
).unwrap();
10+
)
11+
.unwrap();
1112

1213
println!("{:?}", adapter.get_info())
1314
}

examples/framework.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ pub fn run<E: Example>(title: &str) {
9999
power_preference: wgpu::PowerPreference::Default,
100100
},
101101
wgpu::BackendBit::PRIMARY,
102-
).unwrap();
102+
)
103+
.unwrap();
103104

104105
let (device, mut queue) = adapter.request_device(&wgpu::DeviceDescriptor {
105106
extensions: wgpu::Extensions {
@@ -163,7 +164,8 @@ pub fn run<E: Example>(title: &str) {
163164
}
164165
},
165166
event::Event::EventsCleared => {
166-
let frame = swap_chain.get_next_texture()
167+
let frame = swap_chain
168+
.get_next_texture()
167169
.expect("Timeout when acquiring next swap chain texture");
168170
let command_buf = example.render(&frame, &device);
169171
queue.submit(&[command_buf]);

examples/hello-compute/main.rs

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use std::str::FromStr;
1+
use std::{convert::TryInto as _, str::FromStr};
2+
use zerocopy::AsBytes as _;
23

34
fn main() {
45
env_logger::init();
@@ -12,14 +13,16 @@ fn main() {
1213
.map(|s| u32::from_str(&s).expect("You must pass a list of positive integers!"))
1314
.collect();
1415

15-
let size = (numbers.len() * std::mem::size_of::<u32>()) as wgpu::BufferAddress;
16+
let slice_size = numbers.len() * std::mem::size_of::<u32>();
17+
let size = slice_size as wgpu::BufferAddress;
1618

1719
let adapter = wgpu::Adapter::request(
1820
&wgpu::RequestAdapterOptions {
1921
power_preference: wgpu::PowerPreference::Default,
2022
},
2123
wgpu::BackendBit::PRIMARY,
22-
).unwrap();
24+
)
25+
.unwrap();
2326

2427
let (device, mut queue) = adapter.request_device(&wgpu::DeviceDescriptor {
2528
extensions: wgpu::Extensions {
@@ -29,16 +32,13 @@ fn main() {
2932
});
3033

3134
let cs = include_bytes!("shader.comp.spv");
32-
let cs_module = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(&cs[..])).unwrap());
35+
let cs_module =
36+
device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(&cs[..])).unwrap());
3337

34-
let staging_buffer = device
35-
.create_buffer_mapped(
36-
numbers.len(),
37-
wgpu::BufferUsage::MAP_READ
38-
| wgpu::BufferUsage::COPY_DST
39-
| wgpu::BufferUsage::COPY_SRC,
40-
)
41-
.fill_from_slice(&numbers);
38+
let staging_buffer = device.create_buffer_with_data(
39+
numbers.as_slice().as_bytes(),
40+
wgpu::BufferUsage::MAP_READ | wgpu::BufferUsage::COPY_DST | wgpu::BufferUsage::COPY_SRC,
41+
);
4242

4343
let storage_buffer = device.create_buffer(&wgpu::BufferDescriptor {
4444
size,
@@ -48,13 +48,14 @@ fn main() {
4848
});
4949

5050
let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
51-
bindings: &[
52-
wgpu::BindGroupLayoutBinding {
53-
binding: 0,
54-
visibility: wgpu::ShaderStage::COMPUTE,
55-
ty: wgpu::BindingType::StorageBuffer { dynamic: false, readonly: false },
51+
bindings: &[wgpu::BindGroupLayoutBinding {
52+
binding: 0,
53+
visibility: wgpu::ShaderStage::COMPUTE,
54+
ty: wgpu::BindingType::StorageBuffer {
55+
dynamic: false,
56+
readonly: false,
5657
},
57-
],
58+
}],
5859
});
5960

6061
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
@@ -92,9 +93,15 @@ fn main() {
9293

9394
queue.submit(&[encoder.finish()]);
9495

95-
staging_buffer.map_read_async(0, numbers.len(), |result: wgpu::BufferMapAsyncResult<&[u32]>| {
96+
// FIXME: Align and use `LayoutVerified`
97+
staging_buffer.map_read_async(0, slice_size, |result| {
9698
if let Ok(mapping) = result {
97-
println!("Times: {:?}", mapping.data);
99+
let times: Box<[u32]> = mapping
100+
.data
101+
.chunks_exact(4)
102+
.map(|b| u32::from_ne_bytes(b.try_into().unwrap()))
103+
.collect();
104+
println!("Times: {:?}", times);
98105
}
99106
});
100107
}

examples/hello-triangle/main.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
fn main() {
22
use winit::{
3-
event_loop::{ControlFlow, EventLoop},
43
event,
4+
event_loop::{ControlFlow, EventLoop},
55
};
66

77
env_logger::init();
@@ -10,9 +10,7 @@ fn main() {
1010
#[cfg(not(feature = "gl"))]
1111
let (_window, size, surface) = {
1212
let window = winit::window::Window::new(&event_loop).unwrap();
13-
let size = window
14-
.inner_size()
15-
.to_physical(window.hidpi_factor());
13+
let size = window.inner_size().to_physical(window.hidpi_factor());
1614

1715
let surface = wgpu::Surface::create(&window);
1816
(window, size, surface)
@@ -43,7 +41,8 @@ fn main() {
4341
power_preference: wgpu::PowerPreference::Default,
4442
},
4543
wgpu::BackendBit::PRIMARY,
46-
).unwrap();
44+
)
45+
.unwrap();
4746

4847
let (device, mut queue) = adapter.request_device(&wgpu::DeviceDescriptor {
4948
extensions: wgpu::Extensions {
@@ -53,14 +52,15 @@ fn main() {
5352
});
5453

5554
let vs = include_bytes!("shader.vert.spv");
56-
let vs_module = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(&vs[..])).unwrap());
55+
let vs_module =
56+
device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(&vs[..])).unwrap());
5757

5858
let fs = include_bytes!("shader.frag.spv");
59-
let fs_module = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(&fs[..])).unwrap());
59+
let fs_module =
60+
device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(&fs[..])).unwrap());
6061

61-
let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
62-
bindings: &[],
63-
});
62+
let bind_group_layout =
63+
device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { bindings: &[] });
6464
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
6565
layout: &bind_group_layout,
6666
bindings: &[],
@@ -135,7 +135,8 @@ fn main() {
135135
_ => {}
136136
},
137137
event::Event::EventsCleared => {
138-
let frame = swap_chain.get_next_texture()
138+
let frame = swap_chain
139+
.get_next_texture()
139140
.expect("Timeout when acquiring next swap chain texture");
140141
let mut encoder =
141142
device.create_command_encoder(&wgpu::CommandEncoderDescriptor { todo: 0 });

0 commit comments

Comments
 (0)