summaryrefslogtreecommitdiff
path: root/ext/webgpu/src/buffer.rs
diff options
context:
space:
mode:
authorDante Issaias <dante@issaias.com>2022-07-20 01:22:26 +0100
committerGitHub <noreply@github.com>2022-07-20 02:22:26 +0200
commit2b1f145c3e51cf9885c073b78bd5882e80d258e3 (patch)
treeface88f9a6d6d109ebf8f659a59bc74e6f6ae8ee /ext/webgpu/src/buffer.rs
parent649536e2669eb496fc2d4dacd92fd1d6dbed50a7 (diff)
chore(ext): update webgpu (#15059)
Diffstat (limited to 'ext/webgpu/src/buffer.rs')
-rw-r--r--ext/webgpu/src/buffer.rs139
1 files changed, 50 insertions, 89 deletions
diff --git a/ext/webgpu/src/buffer.rs b/ext/webgpu/src/buffer.rs
index f8bc213a3..ebe83591c 100644
--- a/ext/webgpu/src/buffer.rs
+++ b/ext/webgpu/src/buffer.rs
@@ -4,14 +4,13 @@ use deno_core::error::type_error;
use deno_core::error::AnyError;
use deno_core::futures::channel::oneshot;
use deno_core::op;
-
use deno_core::OpState;
use deno_core::Resource;
use deno_core::ResourceId;
use deno_core::ZeroCopyBuf;
-use serde::Deserialize;
use std::borrow::Cow;
use std::cell::RefCell;
+use std::convert::TryFrom;
use std::rc::Rc;
use std::time::Duration;
@@ -32,33 +31,27 @@ impl Resource for WebGpuBufferMapped {
}
}
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CreateBufferArgs {
+#[op]
+pub fn op_webgpu_create_buffer(
+ state: &mut OpState,
device_rid: ResourceId,
label: Option<String>,
size: u64,
usage: u32,
mapped_at_creation: bool,
-}
-
-#[op]
-pub fn op_webgpu_create_buffer(
- state: &mut OpState,
- args: CreateBufferArgs,
) -> Result<WebGpuResult, AnyError> {
let instance = state.borrow::<super::Instance>();
let device_resource = state
.resource_table
- .get::<super::WebGpuDevice>(args.device_rid)?;
+ .get::<super::WebGpuDevice>(device_rid)?;
let device = device_resource.0;
let descriptor = wgpu_core::resource::BufferDescriptor {
- label: args.label.map(Cow::from),
- size: args.size,
- usage: wgpu_types::BufferUsages::from_bits(args.usage)
+ label: label.map(Cow::from),
+ size,
+ usage: wgpu_types::BufferUsages::from_bits(usage)
.ok_or_else(|| type_error("usage is not valid"))?,
- mapped_at_creation: args.mapped_at_creation,
+ mapped_at_creation,
};
gfx_put!(device => instance.device_create_buffer(
@@ -68,20 +61,14 @@ pub fn op_webgpu_create_buffer(
) => state, WebGpuBuffer)
}
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct BufferGetMapAsyncArgs {
+#[op]
+pub async fn op_webgpu_buffer_get_map_async(
+ state: Rc<RefCell<OpState>>,
buffer_rid: ResourceId,
device_rid: ResourceId,
mode: u32,
offset: u64,
size: u64,
-}
-
-#[op]
-pub async fn op_webgpu_buffer_get_map_async(
- state: Rc<RefCell<OpState>>,
- args: BufferGetMapAsyncArgs,
) -> Result<WebGpuResult, AnyError> {
let (sender, receiver) = oneshot::channel::<Result<(), AnyError>>();
@@ -90,47 +77,36 @@ pub async fn op_webgpu_buffer_get_map_async(
let state_ = state.borrow();
let instance = state_.borrow::<super::Instance>();
let buffer_resource =
- state_.resource_table.get::<WebGpuBuffer>(args.buffer_rid)?;
+ state_.resource_table.get::<WebGpuBuffer>(buffer_rid)?;
let buffer = buffer_resource.0;
let device_resource = state_
.resource_table
- .get::<super::WebGpuDevice>(args.device_rid)?;
+ .get::<super::WebGpuDevice>(device_rid)?;
device = device_resource.0;
- let boxed_sender = Box::new(sender);
- let sender_ptr = Box::into_raw(boxed_sender) as *mut u8;
-
- extern "C" fn buffer_map_future_wrapper(
- status: wgpu_core::resource::BufferMapAsyncStatus,
- user_data: *mut u8,
- ) {
- let sender_ptr = user_data as *mut oneshot::Sender<Result<(), AnyError>>;
- // TODO(bartlomieju):
- #[allow(clippy::undocumented_unsafe_blocks)]
- let boxed_sender = unsafe { Box::from_raw(sender_ptr) };
- boxed_sender
+ let callback = Box::new(move |status| {
+ sender
.send(match status {
wgpu_core::resource::BufferMapAsyncStatus::Success => Ok(()),
_ => unreachable!(), // TODO
})
.unwrap();
- }
+ });
// TODO(lucacasonato): error handling
let maybe_err = gfx_select!(buffer => instance.buffer_map_async(
- buffer,
- args.offset..(args.offset + args.size),
- wgpu_core::resource::BufferMapOperation {
- host: match args.mode {
- 1 => wgpu_core::device::HostMap::Read,
- 2 => wgpu_core::device::HostMap::Write,
- _ => unreachable!(),
- },
- callback: buffer_map_future_wrapper,
- user_data: sender_ptr,
- }
- ))
- .err();
+ buffer,
+ offset..(offset + size),
+ wgpu_core::resource::BufferMapOperation {
+ host: match mode {
+ 1 => wgpu_core::device::HostMap::Read,
+ 2 => wgpu_core::device::HostMap::Write,
+ _ => unreachable!(),
+ },
+ callback: wgpu_core::resource::BufferMapCallback::from_rust(callback),
+ }
+ ))
+ .err();
if maybe_err.is_some() {
return Ok(WebGpuResult::maybe_err(maybe_err));
@@ -144,7 +120,7 @@ pub async fn op_webgpu_buffer_get_map_async(
{
let state = state.borrow();
let instance = state.borrow::<super::Instance>();
- gfx_select!(device => instance.device_poll(device, false)).unwrap()
+ gfx_select!(device => instance.device_poll(device, wgpu_types::Maintain::Wait)).unwrap();
}
tokio::time::sleep(Duration::from_millis(10)).await;
}
@@ -163,39 +139,32 @@ pub async fn op_webgpu_buffer_get_map_async(
Ok(WebGpuResult::empty())
}
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct BufferGetMappedRangeArgs {
- buffer_rid: ResourceId,
- offset: u64,
- size: Option<u64>,
-}
-
#[op]
pub fn op_webgpu_buffer_get_mapped_range(
state: &mut OpState,
- args: BufferGetMappedRangeArgs,
- mut zero_copy: ZeroCopyBuf,
+ buffer_rid: ResourceId,
+ offset: u64,
+ size: Option<u64>,
+ mut buf: ZeroCopyBuf,
) -> Result<WebGpuResult, AnyError> {
let instance = state.borrow::<super::Instance>();
- let buffer_resource =
- state.resource_table.get::<WebGpuBuffer>(args.buffer_rid)?;
+ let buffer_resource = state.resource_table.get::<WebGpuBuffer>(buffer_rid)?;
let buffer = buffer_resource.0;
let (slice_pointer, range_size) =
gfx_select!(buffer => instance.buffer_get_mapped_range(
buffer,
- args.offset,
- args.size
+ offset,
+ size
))
.map_err(|e| DomExceptionOperationError::new(&e.to_string()))?;
- // TODO(bartlomieju):
+ // TODO(crowlKats):
#[allow(clippy::undocumented_unsafe_blocks)]
let slice = unsafe {
std::slice::from_raw_parts_mut(slice_pointer, range_size as usize)
};
- zero_copy.copy_from_slice(slice);
+ buf.copy_from_slice(slice);
let rid = state
.resource_table
@@ -204,35 +173,27 @@ pub fn op_webgpu_buffer_get_mapped_range(
Ok(WebGpuResult::rid(rid))
}
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct BufferUnmapArgs {
- buffer_rid: ResourceId,
- mapped_rid: ResourceId,
-}
-
#[op]
pub fn op_webgpu_buffer_unmap(
state: &mut OpState,
- args: BufferUnmapArgs,
- zero_copy: Option<ZeroCopyBuf>,
+ buffer_rid: ResourceId,
+ mapped_rid: ResourceId,
+ buf: Option<ZeroCopyBuf>,
) -> Result<WebGpuResult, AnyError> {
let mapped_resource = state
.resource_table
- .take::<WebGpuBufferMapped>(args.mapped_rid)?;
+ .take::<WebGpuBufferMapped>(mapped_rid)?;
let instance = state.borrow::<super::Instance>();
- let buffer_resource =
- state.resource_table.get::<WebGpuBuffer>(args.buffer_rid)?;
+ let buffer_resource = state.resource_table.get::<WebGpuBuffer>(buffer_rid)?;
let buffer = buffer_resource.0;
- let slice_pointer = mapped_resource.0;
- let size = mapped_resource.1;
-
- if let Some(buffer) = zero_copy {
- // TODO(bartlomieju):
+ if let Some(buf) = buf {
+ // TODO(crowlKats):
#[allow(clippy::undocumented_unsafe_blocks)]
- let slice = unsafe { std::slice::from_raw_parts_mut(slice_pointer, size) };
- slice.copy_from_slice(&buffer);
+ let slice = unsafe {
+ std::slice::from_raw_parts_mut(mapped_resource.0, mapped_resource.1)
+ };
+ slice.copy_from_slice(&buf);
}
gfx_ok!(buffer => instance.buffer_unmap(buffer))