aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/bindings/trace.rs2
-rw-r--r--components/script/dom/gpu.rs3
-rw-r--r--components/script/dom/identityhub.rs47
-rw-r--r--components/script/dom/mod.rs1
-rw-r--r--components/script/dom/navigator.rs12
5 files changed, 65 insertions, 0 deletions
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index 5f10ad44446..65717bb81bf 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -39,6 +39,7 @@ use crate::dom::bindings::utils::WindowProxyHandler;
use crate::dom::document::PendingRestyle;
use crate::dom::htmlimageelement::SourceSet;
use crate::dom::htmlmediaelement::{HTMLMediaElementFetchContext, MediaFrameRenderer};
+use crate::dom::identityhub::Identities;
use crate::task::TaskBox;
use app_units::Au;
use canvas_traits::canvas::{
@@ -504,6 +505,7 @@ unsafe_no_jsmanaged_fields!(WebGLVertexArrayId);
unsafe_no_jsmanaged_fields!(WebGLVersion);
unsafe_no_jsmanaged_fields!(WebGLSLVersion);
unsafe_no_jsmanaged_fields!(WebGPU);
+unsafe_no_jsmanaged_fields!(RefCell<Identities>);
unsafe_no_jsmanaged_fields!(WebGPUAdapter);
unsafe_no_jsmanaged_fields!(WebXRSwapChainId);
unsafe_no_jsmanaged_fields!(MediaList);
diff --git a/components/script/dom/gpu.rs b/components/script/dom/gpu.rs
index cbde108bc01..4e47620052e 100644
--- a/components/script/dom/gpu.rs
+++ b/components/script/dom/gpu.rs
@@ -5,6 +5,7 @@
use crate::compartments::InCompartment;
use crate::dom::bindings::codegen::Bindings::GPUBinding::GPURequestAdapterOptions;
use crate::dom::bindings::codegen::Bindings::GPUBinding::{self, GPUMethods, GPUPowerPreference};
+use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods;
use crate::dom::bindings::error::Error;
use crate::dom::bindings::refcounted::{Trusted, TrustedPromise};
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
@@ -120,6 +121,7 @@ impl GPUMethods for GPU {
Some(GPUPowerPreference::High_performance) => wgpu::PowerPreference::HighPerformance,
None => wgpu::PowerPreference::Default,
};
+ let id = self.global().as_window().Navigator().create_adapter_id();
match self.wgpu_channel() {
Some(channel) => {
@@ -128,6 +130,7 @@ impl GPUMethods for GPU {
.send(WebGPURequest::RequestAdapter(
sender,
wgpu::RequestAdapterOptions { power_preference },
+ id,
))
.unwrap();
},
diff --git a/components/script/dom/identityhub.rs b/components/script/dom/identityhub.rs
new file mode 100644
index 00000000000..489eaacc78d
--- /dev/null
+++ b/components/script/dom/identityhub.rs
@@ -0,0 +1,47 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+use webgpu::wgpu::{AdapterId, Backend, DeviceId, IdentityManager, SurfaceId};
+
+#[derive(Debug)]
+pub struct IdentityHub {
+ adapters: IdentityManager<AdapterId>,
+ devices: IdentityManager<DeviceId>,
+}
+
+impl IdentityHub {
+ fn new(backend: Backend) -> Self {
+ IdentityHub {
+ adapters: IdentityManager::new(backend),
+ devices: IdentityManager::new(backend),
+ }
+ }
+}
+
+#[derive(Debug)]
+pub struct Identities {
+ surface: IdentityManager<SurfaceId>,
+ hub: IdentityHub,
+}
+
+impl Identities {
+ pub fn new() -> Self {
+ let hub = if cfg!(any(target_os = "linux", target_os = "windows")) {
+ IdentityHub::new(Backend::Vulkan)
+ } else if cfg!(any(target_os = "ios", target_os = "macos")) {
+ IdentityHub::new(Backend::Metal)
+ } else {
+ IdentityHub::new(Backend::Empty)
+ };
+
+ Identities {
+ surface: IdentityManager::new(Backend::Empty),
+ hub,
+ }
+ }
+
+ pub fn create_adapter_id(&mut self) -> AdapterId {
+ self.hub.adapters.alloc()
+ }
+}
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs
index 9fbf2e0cc6e..d348633df88 100644
--- a/components/script/dom/mod.rs
+++ b/components/script/dom/mod.rs
@@ -391,6 +391,7 @@ pub mod htmltrackelement;
pub mod htmlulistelement;
pub mod htmlunknownelement;
pub mod htmlvideoelement;
+pub mod identityhub;
pub mod imagedata;
pub mod inputevent;
pub mod keyboardevent;
diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs
index cb8fb2365cd..9121f7ef54d 100644
--- a/components/script/dom/navigator.rs
+++ b/components/script/dom/navigator.rs
@@ -12,6 +12,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::bluetooth::Bluetooth;
use crate::dom::gamepadlist::GamepadList;
use crate::dom::gpu::GPU;
+use crate::dom::identityhub::Identities;
use crate::dom::mediadevices::MediaDevices;
use crate::dom::mediasession::MediaSession;
use crate::dom::mimetypearray::MimeTypeArray;
@@ -23,7 +24,9 @@ use crate::dom::serviceworkercontainer::ServiceWorkerContainer;
use crate::dom::window::Window;
use crate::dom::xr::XR;
use dom_struct::dom_struct;
+use std::cell::RefCell;
use std::rc::Rc;
+use webgpu::wgpu::AdapterId;
#[dom_struct]
pub struct Navigator {
@@ -38,6 +41,8 @@ pub struct Navigator {
permissions: MutNullableDom<Permissions>,
mediasession: MutNullableDom<MediaSession>,
gpu: MutNullableDom<GPU>,
+ #[ignore_malloc_size_of = "Defined in wgpu"]
+ gpu_id_hub: RefCell<Identities>,
}
impl Navigator {
@@ -54,6 +59,7 @@ impl Navigator {
permissions: Default::default(),
mediasession: Default::default(),
gpu: Default::default(),
+ gpu_id_hub: RefCell::new(Identities::new()),
}
}
@@ -66,6 +72,12 @@ impl Navigator {
}
}
+impl Navigator {
+ pub fn create_adapter_id(&self) -> AdapterId {
+ self.gpu_id_hub.borrow_mut().create_adapter_id()
+ }
+}
+
impl NavigatorMethods for Navigator {
// https://html.spec.whatwg.org/multipage/#dom-navigator-product
fn Product(&self) -> DOMString {