Skip to content

Commit 152fad4

Browse files
bors[bot]swiftcodergrovesNL
committed
Merge #84 #85
84: Create buffer mapped r=kvark a=swiftcoder I haven't really taken a swing at error handling here, posting it up early for feedback on the API. 85: Unpin nightly date for bindings generation r=kvark a=grovesNL rust-lang/rust#57915 allows us to run bindings generation with nightly again, so we shouldn't have to pin to an older nightly date anymore (assuming everyone has a recent nightly). Co-authored-by: Tristam MacDonald <tristam@trist.am> Co-authored-by: Joshua Groves <josh@joshgroves.com>
3 parents 7f9ab97 + d179b5a + af58884 commit 152fad4

File tree

4 files changed

+76
-48
lines changed

4 files changed

+76
-48
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ lib-rust: Cargo.lock wgpu-rs/Cargo.toml $(wildcard wgpu-rs/**/*.rs)
5454
cargo build --manifest-path wgpu-rs/Cargo.toml --features $(FEATURE_RUST)
5555

5656
wgpu-bindings/*.h: Cargo.lock wgpu-bindings/src/*.rs lib-native
57-
cargo +nightly-2018-12-27 run --manifest-path wgpu-bindings/Cargo.toml
57+
cargo +nightly run --manifest-path wgpu-bindings/Cargo.toml
5858

5959
examples-native: lib-native wgpu-bindings/wgpu.h $(wildcard wgpu-native/**/*.c)
6060
#$(MAKE) -C examples

gfx-examples/src/cube.rs

+32-45
Original file line numberDiff line numberDiff line change
@@ -117,32 +117,25 @@ impl framework::Example for Example {
117117
let (vertex_data, index_data) = create_vertices();
118118
let vertex_buffer_length = vertex_data.len() * vertex_size;
119119
let index_buffer_length = index_data.len() * mem::size_of::<u16>();
120-
let vertex_buf = device.create_buffer(&wgpu::BufferDescriptor {
121-
size: vertex_buffer_length as u32,
122-
usage: wgpu::BufferUsageFlags::VERTEX | wgpu::BufferUsageFlags::TRANSFER_DST | wgpu::BufferUsageFlags::MAP_WRITE,
123-
});
124-
125-
//vertex_buf.set_sub_data(0, framework::cast_slice(&vertex_data));
126-
vertex_buf.map_write_async(0, vertex_buffer_length as u32, |result: wgpu::BufferMapAsyncResult<&mut [Vertex]>| {
127-
if let wgpu::BufferMapAsyncResult::Success(data) = result {
128-
data.copy_from_slice(&vertex_data);
129-
}
130-
120+
let vertex_buf = {
121+
let (vertex_buf, vertex_buf_data) = device.create_buffer_mapped(&wgpu::BufferDescriptor {
122+
size: vertex_buffer_length as u32,
123+
usage: wgpu::BufferUsageFlags::VERTEX | wgpu::BufferUsageFlags::TRANSFER_DST | wgpu::BufferUsageFlags::MAP_WRITE,
124+
});
125+
vertex_buf_data.copy_from_slice(&vertex_data);
131126
vertex_buf.unmap();
132-
});
133-
134-
let index_buf = device.create_buffer(&wgpu::BufferDescriptor {
135-
size: index_buffer_length as u32,
136-
usage: wgpu::BufferUsageFlags::INDEX | wgpu::BufferUsageFlags::TRANSFER_DST | wgpu::BufferUsageFlags::MAP_WRITE,
137-
});
138-
// index_buf.set_sub_data(0, framework::cast_slice(&index_data));
139-
index_buf.map_write_async(0, index_buffer_length as u32, |result: wgpu::BufferMapAsyncResult<&mut [u16]>| {
140-
if let wgpu::BufferMapAsyncResult::Success(data) = result {
141-
data.copy_from_slice(&index_data);
142-
}
127+
vertex_buf
128+
};
143129

130+
let index_buf = {
131+
let (index_buf, index_buf_data) = device.create_buffer_mapped(&wgpu::BufferDescriptor {
132+
size: index_buffer_length as u32,
133+
usage: wgpu::BufferUsageFlags::INDEX | wgpu::BufferUsageFlags::TRANSFER_DST | wgpu::BufferUsageFlags::MAP_WRITE,
134+
});
135+
index_buf_data.copy_from_slice(&index_data);
144136
index_buf.unmap();
145-
});
137+
index_buf
138+
};
146139

147140
// Create pipeline layout
148141
let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
@@ -184,18 +177,15 @@ impl framework::Example for Example {
184177
usage: wgpu::TextureUsageFlags::SAMPLED | wgpu::TextureUsageFlags::TRANSFER_DST,
185178
});
186179
let texture_view = texture.create_default_view();
187-
let temp_buf = device.create_buffer(&wgpu::BufferDescriptor {
188-
size: texels.len() as u32,
189-
usage: wgpu::BufferUsageFlags::TRANSFER_SRC | wgpu::BufferUsageFlags::TRANSFER_DST | wgpu::BufferUsageFlags::MAP_WRITE,
190-
});
191-
// temp_buf.set_sub_data(0, &texels);
192-
temp_buf.map_write_async(0, texels.len() as u32, |result: wgpu::BufferMapAsyncResult<&mut [u8]>| {
193-
if let wgpu::BufferMapAsyncResult::Success(data) = result {
194-
data.copy_from_slice(&texels);
195-
}
196-
180+
let temp_buf = {
181+
let (temp_buf, temp_buf_data) = device.create_buffer_mapped(&wgpu::BufferDescriptor {
182+
size: texels.len() as u32,
183+
usage: wgpu::BufferUsageFlags::TRANSFER_SRC | wgpu::BufferUsageFlags::TRANSFER_DST | wgpu::BufferUsageFlags::MAP_WRITE,
184+
});
185+
temp_buf_data.copy_from_slice(&texels);
197186
temp_buf.unmap();
198-
});
187+
temp_buf
188+
};
199189
init_encoder.copy_buffer_to_texture(
200190
wgpu::BufferCopyView {
201191
buffer: &temp_buf,
@@ -230,20 +220,17 @@ impl framework::Example for Example {
230220
compare_function: wgpu::CompareFunction::Always,
231221
border_color: wgpu::BorderColor::TransparentBlack,
232222
});
233-
let uniform_buf = device.create_buffer(&wgpu::BufferDescriptor {
234-
size: 64,
235-
usage: wgpu::BufferUsageFlags::UNIFORM | wgpu::BufferUsageFlags::TRANSFER_DST | wgpu::BufferUsageFlags::MAP_WRITE,
236-
});
237223
let mx_total = Self::generate_matrix(sc_desc.width as f32 / sc_desc.height as f32);
238224
let mx_ref: &[f32; 16] = mx_total.as_ref();
239-
// uniform_buf.set_sub_data(0, framework::cast_slice(&mx_ref[..]));
240-
uniform_buf.map_write_async(0, 64, |result: wgpu::BufferMapAsyncResult<&mut [f32]>| {
241-
if let wgpu::BufferMapAsyncResult::Success(data) = result {
242-
data.copy_from_slice(mx_ref);
243-
}
244-
225+
let uniform_buf = {
226+
let (uniform_buf, uniform_buf_data) = device.create_buffer_mapped(&wgpu::BufferDescriptor {
227+
size: 64,
228+
usage: wgpu::BufferUsageFlags::UNIFORM | wgpu::BufferUsageFlags::TRANSFER_DST | wgpu::BufferUsageFlags::MAP_WRITE,
229+
});
230+
uniform_buf_data.copy_from_slice(mx_ref);
245231
uniform_buf.unmap();
246-
});
232+
uniform_buf
233+
};
247234

248235
// Create bind group
249236
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {

wgpu-native/src/device.rs

+26-2
Original file line numberDiff line numberDiff line change
@@ -469,13 +469,14 @@ pub fn device_track_buffer(
469469
device_id: DeviceId,
470470
buffer_id: BufferId,
471471
ref_count: RefCount,
472+
flags: resource::BufferUsageFlags,
472473
) {
473474
let query = HUB.devices
474475
.read()
475476
[device_id].trackers
476477
.lock()
477478
.buffers
478-
.query(buffer_id, &ref_count, resource::BufferUsageFlags::empty());
479+
.query(buffer_id, &ref_count, flags);
479480
assert!(query.initialized);
480481
}
481482

@@ -488,7 +489,30 @@ pub extern "C" fn wgpu_device_create_buffer(
488489
let buffer = device_create_buffer(device_id, desc);
489490
let ref_count = buffer.life_guard.ref_count.clone();
490491
let id = HUB.buffers.register_local(buffer);
491-
device_track_buffer(device_id, id, ref_count);
492+
device_track_buffer(device_id, id, ref_count, resource::BufferUsageFlags::empty());
493+
id
494+
}
495+
496+
#[cfg(feature = "local")]
497+
#[no_mangle]
498+
pub extern "C" fn wgpu_device_create_buffer_mapped(
499+
device_id: DeviceId,
500+
desc: &resource::BufferDescriptor,
501+
mapped_ptr_out: *mut *mut u8
502+
) -> BufferId {
503+
let buffer = device_create_buffer(device_id, desc);
504+
505+
let device_guard = HUB.devices.read();
506+
let device = &device_guard[device_id];
507+
508+
if let Ok(ptr) = unsafe { device.raw.map_memory(&buffer.memory, 0..(desc.size as u64)) } {
509+
unsafe{ *mapped_ptr_out = ptr; }
510+
}
511+
512+
let ref_count = buffer.life_guard.ref_count.clone();
513+
let id = HUB.buffers.register_local(buffer);
514+
device_track_buffer(device_id, id, ref_count, resource::BufferUsageFlags::MAP_WRITE);
515+
492516
id
493517
}
494518

wgpu-rs/src/lib.rs

+17
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,23 @@ impl Device {
432432
}
433433
}
434434

435+
pub fn create_buffer_mapped<T>(&self, desc: &BufferDescriptor) -> (Buffer, &mut [T])
436+
where T: 'static + Copy {
437+
let type_size = std::mem::size_of::<T>() as u32;
438+
assert_ne!(type_size, 0);
439+
assert_eq!(desc.size % type_size, 0);
440+
441+
let mut ptr : *mut u8 = std::ptr::null_mut();
442+
443+
let buffer = Buffer {
444+
id: wgn::wgpu_device_create_buffer_mapped(self.id, desc, &mut ptr as *mut *mut u8),
445+
};
446+
447+
let data = unsafe { std::slice::from_raw_parts_mut(ptr as *mut T, desc.size as usize / std::mem::size_of::<T>()) };
448+
449+
(buffer, data)
450+
}
451+
435452
pub fn create_texture(&self, desc: &TextureDescriptor) -> Texture {
436453
Texture {
437454
id: wgn::wgpu_device_create_texture(self.id, desc),

0 commit comments

Comments
 (0)