Skip to content

Commit 615e6b7

Browse files
authored
refactor(ext/webgpu): use concrete error type (denoland#26198)
1 parent 6c4ef11 commit 615e6b7

File tree

13 files changed

+351
-177
lines changed

13 files changed

+351
-177
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/webgpu/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ serde = { workspace = true, features = ["derive"] }
2525
tokio = { workspace = true, features = ["full"] }
2626
wgpu-types = { workspace = true, features = ["serde"] }
2727
raw-window-handle = { workspace = true }
28+
thiserror.workspace = true
2829

2930
[target.'cfg(not(target_arch = "wasm32"))'.dependencies.wgpu-core]
3031
workspace = true

ext/webgpu/buffer.rs

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
22

3-
use deno_core::error::type_error;
4-
use deno_core::error::AnyError;
53
use deno_core::op2;
64
use deno_core::OpState;
75
use deno_core::Resource;
@@ -13,9 +11,18 @@ use std::sync::Arc;
1311
use std::sync::Mutex;
1412
use std::time::Duration;
1513

16-
use super::error::DomExceptionOperationError;
1714
use super::error::WebGpuResult;
1815

16+
#[derive(Debug, thiserror::Error)]
17+
pub enum BufferError {
18+
#[error(transparent)]
19+
Resource(deno_core::error::AnyError),
20+
#[error("usage is not valid")]
21+
InvalidUsage,
22+
#[error(transparent)]
23+
Access(wgpu_core::resource::BufferAccessError),
24+
}
25+
1926
pub(crate) struct WebGpuBuffer(
2027
pub(crate) super::Instance,
2128
pub(crate) wgpu_core::id::BufferId,
@@ -46,18 +53,19 @@ pub fn op_webgpu_create_buffer(
4653
#[number] size: u64,
4754
usage: u32,
4855
mapped_at_creation: bool,
49-
) -> Result<WebGpuResult, AnyError> {
56+
) -> Result<WebGpuResult, BufferError> {
5057
let instance = state.borrow::<super::Instance>();
5158
let device_resource = state
5259
.resource_table
53-
.get::<super::WebGpuDevice>(device_rid)?;
60+
.get::<super::WebGpuDevice>(device_rid)
61+
.map_err(BufferError::Resource)?;
5462
let device = device_resource.1;
5563

5664
let descriptor = wgpu_core::resource::BufferDescriptor {
5765
label: Some(label),
5866
size,
5967
usage: wgpu_types::BufferUsages::from_bits(usage)
60-
.ok_or_else(|| type_error("usage is not valid"))?,
68+
.ok_or(BufferError::InvalidUsage)?,
6169
mapped_at_creation,
6270
};
6371

@@ -77,18 +85,21 @@ pub async fn op_webgpu_buffer_get_map_async(
7785
mode: u32,
7886
#[number] offset: u64,
7987
#[number] size: u64,
80-
) -> Result<WebGpuResult, AnyError> {
88+
) -> Result<WebGpuResult, BufferError> {
8189
let device;
8290
let done = Arc::new(Mutex::new(None));
8391
{
8492
let state_ = state.borrow();
8593
let instance = state_.borrow::<super::Instance>();
86-
let buffer_resource =
87-
state_.resource_table.get::<WebGpuBuffer>(buffer_rid)?;
94+
let buffer_resource = state_
95+
.resource_table
96+
.get::<WebGpuBuffer>(buffer_rid)
97+
.map_err(BufferError::Resource)?;
8898
let buffer = buffer_resource.1;
8999
let device_resource = state_
90100
.resource_table
91-
.get::<super::WebGpuDevice>(device_rid)?;
101+
.get::<super::WebGpuDevice>(device_rid)
102+
.map_err(BufferError::Resource)?;
92103
device = device_resource.1;
93104

94105
let done_ = done.clone();
@@ -120,9 +131,7 @@ pub async fn op_webgpu_buffer_get_map_async(
120131
let result = done.lock().unwrap().take();
121132
match result {
122133
Some(Ok(())) => return Ok(WebGpuResult::empty()),
123-
Some(Err(e)) => {
124-
return Err(DomExceptionOperationError::new(&e.to_string()).into())
125-
}
134+
Some(Err(e)) => return Err(BufferError::Access(e)),
126135
None => {
127136
{
128137
let state = state.borrow();
@@ -143,9 +152,12 @@ pub fn op_webgpu_buffer_get_mapped_range(
143152
#[number] offset: u64,
144153
#[number] size: Option<u64>,
145154
#[buffer] buf: &mut [u8],
146-
) -> Result<WebGpuResult, AnyError> {
155+
) -> Result<WebGpuResult, BufferError> {
147156
let instance = state.borrow::<super::Instance>();
148-
let buffer_resource = state.resource_table.get::<WebGpuBuffer>(buffer_rid)?;
157+
let buffer_resource = state
158+
.resource_table
159+
.get::<WebGpuBuffer>(buffer_rid)
160+
.map_err(BufferError::Resource)?;
149161
let buffer = buffer_resource.1;
150162

151163
let (slice_pointer, range_size) =
@@ -154,7 +166,7 @@ pub fn op_webgpu_buffer_get_mapped_range(
154166
offset,
155167
size
156168
))
157-
.map_err(|e| DomExceptionOperationError::new(&e.to_string()))?;
169+
.map_err(BufferError::Access)?;
158170

159171
// SAFETY: guarantee to be safe from wgpu
160172
let slice = unsafe {
@@ -176,12 +188,16 @@ pub fn op_webgpu_buffer_unmap(
176188
#[smi] buffer_rid: ResourceId,
177189
#[smi] mapped_rid: ResourceId,
178190
#[buffer] buf: Option<&[u8]>,
179-
) -> Result<WebGpuResult, AnyError> {
191+
) -> Result<WebGpuResult, BufferError> {
180192
let mapped_resource = state
181193
.resource_table
182-
.take::<WebGpuBufferMapped>(mapped_rid)?;
194+
.take::<WebGpuBufferMapped>(mapped_rid)
195+
.map_err(BufferError::Resource)?;
183196
let instance = state.borrow::<super::Instance>();
184-
let buffer_resource = state.resource_table.get::<WebGpuBuffer>(buffer_rid)?;
197+
let buffer_resource = state
198+
.resource_table
199+
.get::<WebGpuBuffer>(buffer_rid)
200+
.map_err(BufferError::Resource)?;
185201
let buffer = buffer_resource.1;
186202

187203
if let Some(buf) = buf {

ext/webgpu/bundle.rs

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
22

3-
use deno_core::error::type_error;
4-
use deno_core::error::AnyError;
53
use deno_core::op2;
64
use deno_core::OpState;
75
use deno_core::Resource;
@@ -13,6 +11,14 @@ use std::rc::Rc;
1311

1412
use super::error::WebGpuResult;
1513

14+
#[derive(Debug, thiserror::Error)]
15+
pub enum BundleError {
16+
#[error(transparent)]
17+
Resource(deno_core::error::AnyError),
18+
#[error("size must be larger than 0")]
19+
InvalidSize,
20+
}
21+
1622
struct WebGpuRenderBundleEncoder(
1723
RefCell<wgpu_core::command::RenderBundleEncoder>,
1824
);
@@ -53,7 +59,7 @@ pub struct CreateRenderBundleEncoderArgs {
5359
pub fn op_webgpu_create_render_bundle_encoder(
5460
state: &mut OpState,
5561
#[serde] args: CreateRenderBundleEncoderArgs,
56-
) -> Result<WebGpuResult, AnyError> {
62+
) -> Result<WebGpuResult, deno_core::error::AnyError> {
5763
let device_resource = state
5864
.resource_table
5965
.get::<super::WebGpuDevice>(args.device_rid)?;
@@ -100,7 +106,7 @@ pub fn op_webgpu_render_bundle_encoder_finish(
100106
state: &mut OpState,
101107
#[smi] render_bundle_encoder_rid: ResourceId,
102108
#[string] label: Cow<str>,
103-
) -> Result<WebGpuResult, AnyError> {
109+
) -> Result<WebGpuResult, deno_core::error::AnyError> {
104110
let render_bundle_encoder_resource =
105111
state
106112
.resource_table
@@ -131,7 +137,7 @@ pub fn op_webgpu_render_bundle_encoder_set_bind_group(
131137
#[buffer] dynamic_offsets_data: &[u32],
132138
#[number] dynamic_offsets_data_start: usize,
133139
#[number] dynamic_offsets_data_length: usize,
134-
) -> Result<WebGpuResult, AnyError> {
140+
) -> Result<WebGpuResult, deno_core::error::AnyError> {
135141
let bind_group_resource =
136142
state
137143
.resource_table
@@ -171,7 +177,7 @@ pub fn op_webgpu_render_bundle_encoder_push_debug_group(
171177
state: &mut OpState,
172178
#[smi] render_bundle_encoder_rid: ResourceId,
173179
#[string] group_label: &str,
174-
) -> Result<WebGpuResult, AnyError> {
180+
) -> Result<WebGpuResult, deno_core::error::AnyError> {
175181
let render_bundle_encoder_resource =
176182
state
177183
.resource_table
@@ -195,7 +201,7 @@ pub fn op_webgpu_render_bundle_encoder_push_debug_group(
195201
pub fn op_webgpu_render_bundle_encoder_pop_debug_group(
196202
state: &mut OpState,
197203
#[smi] render_bundle_encoder_rid: ResourceId,
198-
) -> Result<WebGpuResult, AnyError> {
204+
) -> Result<WebGpuResult, deno_core::error::AnyError> {
199205
let render_bundle_encoder_resource =
200206
state
201207
.resource_table
@@ -214,7 +220,7 @@ pub fn op_webgpu_render_bundle_encoder_insert_debug_marker(
214220
state: &mut OpState,
215221
#[smi] render_bundle_encoder_rid: ResourceId,
216222
#[string] marker_label: &str,
217-
) -> Result<WebGpuResult, AnyError> {
223+
) -> Result<WebGpuResult, deno_core::error::AnyError> {
218224
let render_bundle_encoder_resource =
219225
state
220226
.resource_table
@@ -239,7 +245,7 @@ pub fn op_webgpu_render_bundle_encoder_set_pipeline(
239245
state: &mut OpState,
240246
#[smi] render_bundle_encoder_rid: ResourceId,
241247
#[smi] pipeline: ResourceId,
242-
) -> Result<WebGpuResult, AnyError> {
248+
) -> Result<WebGpuResult, deno_core::error::AnyError> {
243249
let render_pipeline_resource =
244250
state
245251
.resource_table
@@ -266,18 +272,17 @@ pub fn op_webgpu_render_bundle_encoder_set_index_buffer(
266272
#[serde] index_format: wgpu_types::IndexFormat,
267273
#[number] offset: u64,
268274
#[number] size: u64,
269-
) -> Result<WebGpuResult, AnyError> {
275+
) -> Result<WebGpuResult, BundleError> {
270276
let buffer_resource = state
271277
.resource_table
272-
.get::<super::buffer::WebGpuBuffer>(buffer)?;
273-
let render_bundle_encoder_resource =
274-
state
275-
.resource_table
276-
.get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
277-
let size = Some(
278-
std::num::NonZeroU64::new(size)
279-
.ok_or_else(|| type_error("size must be larger than 0"))?,
280-
);
278+
.get::<super::buffer::WebGpuBuffer>(buffer)
279+
.map_err(BundleError::Resource)?;
280+
let render_bundle_encoder_resource = state
281+
.resource_table
282+
.get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)
283+
.map_err(BundleError::Resource)?;
284+
let size =
285+
Some(std::num::NonZeroU64::new(size).ok_or(BundleError::InvalidSize)?);
281286

282287
render_bundle_encoder_resource
283288
.0
@@ -296,19 +301,17 @@ pub fn op_webgpu_render_bundle_encoder_set_vertex_buffer(
296301
#[smi] buffer: ResourceId,
297302
#[number] offset: u64,
298303
#[number] size: Option<u64>,
299-
) -> Result<WebGpuResult, AnyError> {
304+
) -> Result<WebGpuResult, BundleError> {
300305
let buffer_resource = state
301306
.resource_table
302-
.get::<super::buffer::WebGpuBuffer>(buffer)?;
303-
let render_bundle_encoder_resource =
304-
state
305-
.resource_table
306-
.get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
307+
.get::<super::buffer::WebGpuBuffer>(buffer)
308+
.map_err(BundleError::Resource)?;
309+
let render_bundle_encoder_resource = state
310+
.resource_table
311+
.get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)
312+
.map_err(BundleError::Resource)?;
307313
let size = if let Some(size) = size {
308-
Some(
309-
std::num::NonZeroU64::new(size)
310-
.ok_or_else(|| type_error("size must be larger than 0"))?,
311-
)
314+
Some(std::num::NonZeroU64::new(size).ok_or(BundleError::InvalidSize)?)
312315
} else {
313316
None
314317
};
@@ -333,7 +336,7 @@ pub fn op_webgpu_render_bundle_encoder_draw(
333336
instance_count: u32,
334337
first_vertex: u32,
335338
first_instance: u32,
336-
) -> Result<WebGpuResult, AnyError> {
339+
) -> Result<WebGpuResult, deno_core::error::AnyError> {
337340
let render_bundle_encoder_resource =
338341
state
339342
.resource_table
@@ -360,7 +363,7 @@ pub fn op_webgpu_render_bundle_encoder_draw_indexed(
360363
first_index: u32,
361364
base_vertex: i32,
362365
first_instance: u32,
363-
) -> Result<WebGpuResult, AnyError> {
366+
) -> Result<WebGpuResult, deno_core::error::AnyError> {
364367
let render_bundle_encoder_resource =
365368
state
366369
.resource_table
@@ -385,7 +388,7 @@ pub fn op_webgpu_render_bundle_encoder_draw_indirect(
385388
#[smi] render_bundle_encoder_rid: ResourceId,
386389
#[smi] indirect_buffer: ResourceId,
387390
#[number] indirect_offset: u64,
388-
) -> Result<WebGpuResult, AnyError> {
391+
) -> Result<WebGpuResult, deno_core::error::AnyError> {
389392
let buffer_resource = state
390393
.resource_table
391394
.get::<super::buffer::WebGpuBuffer>(indirect_buffer)?;

0 commit comments

Comments
 (0)