Skip to content

Commit 8f0d4cb

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 <[email protected]> Co-authored-by: Joshua Groves <[email protected]>
2 parents 4eecce1 + a661b5b commit 8f0d4cb

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

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

0 commit comments

Comments
 (0)