Skip to content

Commit

Permalink
range magic
Browse files Browse the repository at this point in the history
  • Loading branch information
sagudev committed Oct 7, 2023
1 parent 717a272 commit 8b10429
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 13 deletions.
15 changes: 8 additions & 7 deletions components/script/dom/gpubuffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ impl GPUBufferMethods for GPUBuffer {
} else {
self.size - offset
};
let m_end = offset + range_size;
let range = offset..offset + range_size;
let mut info = self.map_info.borrow_mut();
let m_info = info.as_mut().unwrap();

Expand All @@ -306,31 +306,32 @@ impl GPUBufferMethods for GPUBuffer {
};
valid &= offset % RANGE_OFFSET_ALIGN_MASK == 0 &&
range_size % RANGE_SIZE_ALIGN_MASK == 0 &&
offset >= m_info.mapping_range.start &&
m_end <= m_info.mapping_range.end;
range.start >= m_info.mapping_range.start &&
range.end <= m_info.mapping_range.end;
valid &= m_info
.mapped_ranges
.iter()
.all(|range| range.start >= m_end || range.end <= offset);
.all(|m_range| m_range.start >= range.end || m_range.end <= range.start);
if !valid {
return Err(Error::Operation);
}

unsafe extern "C" fn free_func(_contents: *mut c_void, free_user_data: *mut c_void) {
let _ = Rc::from_raw(free_user_data as _);
drop(Rc::from_raw(free_user_data as _));
}

let array_buffer = unsafe {
NewExternalArrayBuffer(
*cx,
range_size as usize,
m_info.mapping.borrow_mut()[offset as usize..m_end as usize].as_mut_ptr() as _,
m_info.mapping.borrow_mut()[range.start as usize..range.end as usize].as_mut_ptr()
as _,
Some(free_func),
Rc::into_raw(m_info.mapping.clone()) as _,
)
};

m_info.mapped_ranges.push(offset..m_end);
m_info.mapped_ranges.push(range);
m_info.js_buffers.push(Heap::boxed(array_buffer));

Ok(NonNull::new(array_buffer).unwrap())
Expand Down
15 changes: 9 additions & 6 deletions components/webgpu/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ use std::borrow::Cow;
use std::cell::RefCell;
use std::collections::HashMap;
use std::num::NonZeroU64;
use std::ops::Range;
use std::rc::Rc;
use std::slice;
use std::sync::{Arc, Mutex};
Expand Down Expand Up @@ -81,7 +82,7 @@ pub enum WebGPURequest {
buffer_id: id::BufferId,
device_id: id::DeviceId,
host_map: HostMap,
map_range: std::ops::Range<u64>,
map_range: Range<wgt::BufferAddress>,
},
BufferMapComplete(id::BufferId),
CommandEncoderFinish {
Expand Down Expand Up @@ -268,7 +269,7 @@ struct BufferMapInfo<'a, T> {
buffer_id: id::BufferId,
sender: IpcSender<T>,
global: &'a wgpu::global::Global<IdentityRecyclerFactory>,
size: usize,
range: Range<wgt::BufferAddress>,
external_id: Option<u64>,
}

Expand Down Expand Up @@ -421,7 +422,7 @@ impl<'a> WGPU<'a> {
buffer_id,
sender: sender.clone(),
global: &self.global,
size: (map_range.end - map_range.start) as usize,
range: map_range.clone(),
external_id: None,
};
self.buffer_maps.insert(buffer_id, Rc::new(map_info));
Expand All @@ -436,8 +437,9 @@ impl<'a> WGPU<'a> {
let msg = match status {
BufferMapAsyncStatus::Success => {
let global = &info.global;
let size = info.range.end - info.range.start;
let (slice_pointer, range_size) = gfx_select!(info.buffer_id =>
global.buffer_get_mapped_range(info.buffer_id, 0, None))
global.buffer_get_mapped_range(info.buffer_id, info.range.start, Some(size)))
.unwrap();
let data =
slice::from_raw_parts(slice_pointer, range_size as usize);
Expand Down Expand Up @@ -1117,7 +1119,7 @@ impl<'a> WGPU<'a> {
buffer_id,
sender: self.sender.clone(),
global: &self.global,
size: buffer_size as usize,
range: 0..buffer_size,
external_id: Some(external_id),
};
self.present_buffer_maps
Expand All @@ -1137,7 +1139,8 @@ impl<'a> WGPU<'a> {
None,
WebGPURequest::UpdateWebRenderData {
buffer_id: info.buffer_id,
buffer_size: info.size,
buffer_size: (info.range.end - info.range.start)
as usize,
external_id: info.external_id.unwrap(),
},
)) {
Expand Down

0 comments on commit 8b10429

Please sign in to comment.