summaryrefslogtreecommitdiff
path: root/ext/webgpu/surface.rs
diff options
context:
space:
mode:
authorhaturau <135221985+haturatu@users.noreply.github.com>2024-11-20 01:20:47 +0900
committerGitHub <noreply@github.com>2024-11-20 01:20:47 +0900
commit85719a67e59c7aa45bead26e4942d7df8b1b42d4 (patch)
treeface0aecaac53e93ce2f23b53c48859bcf1a36ec /ext/webgpu/surface.rs
parent67697bc2e4a62a9670699fd18ad0dd8efc5bd955 (diff)
parent186b52731c6bb326c4d32905c5e732d082e83465 (diff)
Merge branch 'denoland:main' into main
Diffstat (limited to 'ext/webgpu/surface.rs')
-rw-r--r--ext/webgpu/surface.rs43
1 files changed, 30 insertions, 13 deletions
diff --git a/ext/webgpu/surface.rs b/ext/webgpu/surface.rs
index 1f6d2c87d..297eaeb00 100644
--- a/ext/webgpu/surface.rs
+++ b/ext/webgpu/surface.rs
@@ -1,7 +1,6 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
use super::WebGpuResult;
-use deno_core::error::AnyError;
use deno_core::op2;
use deno_core::OpState;
use deno_core::Resource;
@@ -11,6 +10,16 @@ use std::borrow::Cow;
use std::rc::Rc;
use wgpu_types::SurfaceStatus;
+#[derive(Debug, thiserror::Error)]
+pub enum SurfaceError {
+ #[error(transparent)]
+ Resource(deno_core::error::AnyError),
+ #[error("Invalid Surface Status")]
+ InvalidStatus,
+ #[error(transparent)]
+ Surface(wgpu_core::present::SurfaceError),
+}
+
pub struct WebGpuSurface(pub crate::Instance, pub wgpu_core::id::SurfaceId);
impl Resource for WebGpuSurface {
fn name(&self) -> Cow<str> {
@@ -41,7 +50,7 @@ pub struct SurfaceConfigureArgs {
pub fn op_webgpu_surface_configure(
state: &mut OpState,
#[serde] args: SurfaceConfigureArgs,
-) -> Result<WebGpuResult, AnyError> {
+) -> Result<WebGpuResult, deno_core::error::AnyError> {
let instance = state.borrow::<super::Instance>();
let device_resource = state
.resource_table
@@ -75,18 +84,22 @@ pub fn op_webgpu_surface_get_current_texture(
state: &mut OpState,
#[smi] device_rid: ResourceId,
#[smi] surface_rid: ResourceId,
-) -> Result<WebGpuResult, AnyError> {
+) -> Result<WebGpuResult, SurfaceError> {
let instance = state.borrow::<super::Instance>();
let device_resource = state
.resource_table
- .get::<super::WebGpuDevice>(device_rid)?;
+ .get::<super::WebGpuDevice>(device_rid)
+ .map_err(SurfaceError::Resource)?;
let device = device_resource.1;
- let surface_resource =
- state.resource_table.get::<WebGpuSurface>(surface_rid)?;
+ let surface_resource = state
+ .resource_table
+ .get::<WebGpuSurface>(surface_rid)
+ .map_err(SurfaceError::Resource)?;
let surface = surface_resource.1;
let output =
- gfx_select!(device => instance.surface_get_current_texture(surface, None))?;
+ gfx_select!(device => instance.surface_get_current_texture(surface, None))
+ .map_err(SurfaceError::Surface)?;
match output.status {
SurfaceStatus::Good | SurfaceStatus::Suboptimal => {
@@ -98,7 +111,7 @@ pub fn op_webgpu_surface_get_current_texture(
});
Ok(WebGpuResult::rid(rid))
}
- _ => Err(AnyError::msg("Invalid Surface Status")),
+ _ => Err(SurfaceError::InvalidStatus),
}
}
@@ -107,17 +120,21 @@ pub fn op_webgpu_surface_present(
state: &mut OpState,
#[smi] device_rid: ResourceId,
#[smi] surface_rid: ResourceId,
-) -> Result<(), AnyError> {
+) -> Result<(), SurfaceError> {
let instance = state.borrow::<super::Instance>();
let device_resource = state
.resource_table
- .get::<super::WebGpuDevice>(device_rid)?;
+ .get::<super::WebGpuDevice>(device_rid)
+ .map_err(SurfaceError::Resource)?;
let device = device_resource.1;
- let surface_resource =
- state.resource_table.get::<WebGpuSurface>(surface_rid)?;
+ let surface_resource = state
+ .resource_table
+ .get::<WebGpuSurface>(surface_rid)
+ .map_err(SurfaceError::Resource)?;
let surface = surface_resource.1;
- let _ = gfx_select!(device => instance.surface_present(surface))?;
+ let _ = gfx_select!(device => instance.surface_present(surface))
+ .map_err(SurfaceError::Surface)?;
Ok(())
}