aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webgpu/gpubuffer.rs
diff options
context:
space:
mode:
authorwebbeef <me@webbeef.org>2025-03-23 11:52:46 -0700
committerGitHub <noreply@github.com>2025-03-23 18:52:46 +0000
commit1c9f486f88b23b575317ee0b2462e26fba07c5f4 (patch)
tree17274d9605e8ea494623bafe6755ce5cccaaf245 /components/script/dom/webgpu/gpubuffer.rs
parent4814cbdb1f09e97be70f7c72defee19e67fff473 (diff)
downloadservo-1c9f486f88b23b575317ee0b2462e26fba07c5f4.tar.gz
servo-1c9f486f88b23b575317ee0b2462e26fba07c5f4.zip
webgpu: leverage routed_promise in calls returning promises (#35859)
Using the RoutedPromiseListener let us define a different response type for each promise. This removes unreachable branches that used to exist when they all shared the same WebGPUResponse. Signed-off-by: webbeef <me@webbeef.org>
Diffstat (limited to 'components/script/dom/webgpu/gpubuffer.rs')
-rw-r--r--components/script/dom/webgpu/gpubuffer.rs24
1 files changed, 13 insertions, 11 deletions
diff --git a/components/script/dom/webgpu/gpubuffer.rs b/components/script/dom/webgpu/gpubuffer.rs
index b28b3d8c184..b6c5d6c4977 100644
--- a/components/script/dom/webgpu/gpubuffer.rs
+++ b/components/script/dom/webgpu/gpubuffer.rs
@@ -10,7 +10,8 @@ use dom_struct::dom_struct;
use ipc_channel::ipc::IpcSharedMemory;
use js::typedarray::ArrayBuffer;
use webgpu::wgc::device::HostMap;
-use webgpu::{Mapping, WebGPU, WebGPUBuffer, WebGPURequest, WebGPUResponse, wgt};
+use webgpu::{Mapping, WebGPU, WebGPUBuffer, WebGPURequest, wgc, wgt};
+use wgc::resource::BufferAccessError;
use crate::conversions::Convert;
use crate::dom::bindings::buffer_source::DataBlock;
@@ -25,9 +26,9 @@ use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::str::USVString;
use crate::dom::globalscope::GlobalScope;
use crate::dom::promise::Promise;
-use crate::dom::webgpu::gpu::{AsyncWGPUListener, response_async};
use crate::dom::webgpu::gpudevice::GPUDevice;
use crate::realms::InRealm;
+use crate::routed_promise::{RoutedPromiseListener, route_promise};
use crate::script_runtime::{CanGc, JSContext};
#[derive(JSTraceable, MallocSizeOf)]
@@ -270,7 +271,7 @@ impl GPUBufferMethods<crate::DomTypeHolder> for GPUBuffer {
},
};
- let sender = response_async(&promise, self);
+ let sender = route_promise(&promise, self);
if let Err(e) = self.channel.0.send(WebGPURequest::BufferMapAsync {
sender,
buffer_id: self.buffer.0,
@@ -419,15 +420,16 @@ impl GPUBuffer {
}
}
-impl AsyncWGPUListener for GPUBuffer {
- #[allow(unsafe_code)]
- fn handle_response(&self, response: WebGPUResponse, promise: &Rc<Promise>, can_gc: CanGc) {
+impl RoutedPromiseListener<Result<Mapping, BufferAccessError>> for GPUBuffer {
+ fn handle_response(
+ &self,
+ response: Result<Mapping, BufferAccessError>,
+ promise: &Rc<Promise>,
+ can_gc: CanGc,
+ ) {
match response {
- WebGPUResponse::BufferMapAsync(Ok(mapping)) => {
- self.map_success(promise, mapping, can_gc)
- },
- WebGPUResponse::BufferMapAsync(Err(_)) => self.map_failure(promise, can_gc),
- _ => unreachable!("Wrong response received on AsyncWGPUListener for GPUBuffer"),
+ Ok(mapping) => self.map_success(promise, mapping, can_gc),
+ Err(_) => self.map_failure(promise, can_gc),
}
}
}