diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/bindings/trace.rs | 2 | ||||
-rw-r--r-- | components/script/dom/gpu.rs | 3 | ||||
-rw-r--r-- | components/script/dom/identityhub.rs | 47 | ||||
-rw-r--r-- | components/script/dom/mod.rs | 1 | ||||
-rw-r--r-- | components/script/dom/navigator.rs | 12 |
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 { |