mirror of
https://github.com/servo/servo.git
synced 2025-07-22 14:53:49 +01:00
Auto merge of #24883 - szeged:id_management, r=jdm
Add WebGPU identity management <!-- Please describe your changes on the following line: --> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes addresses a part of #24706 <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> cc @jdm, @kvark, @zakorgy <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
This commit is contained in:
commit
b0012a62b2
6 changed files with 72 additions and 13 deletions
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
},
|
||||
|
|
47
components/script/dom/identityhub.rs
Normal file
47
components/script/dom/identityhub.rs
Normal file
|
@ -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()
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -13,7 +13,6 @@ use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
|
|||
use malloc_size_of::{MallocSizeOf, MallocSizeOfOps};
|
||||
use servo_config::pref;
|
||||
use wgpu::adapter_get_info;
|
||||
use wgpu::TypedId;
|
||||
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
pub enum WebGPUResponse {
|
||||
|
@ -25,7 +24,11 @@ pub type WebGPUResponseResult = Result<WebGPUResponse, String>;
|
|||
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
pub enum WebGPURequest {
|
||||
RequestAdapter(IpcSender<WebGPUResponseResult>, wgpu::RequestAdapterOptions),
|
||||
RequestAdapter(
|
||||
IpcSender<WebGPUResponseResult>,
|
||||
wgpu::RequestAdapterOptions,
|
||||
wgpu::AdapterId,
|
||||
),
|
||||
RequestDevice,
|
||||
Exit(IpcSender<()>),
|
||||
}
|
||||
|
@ -93,17 +96,8 @@ impl WGPU {
|
|||
fn run(mut self) {
|
||||
while let Ok(msg) = self.receiver.recv() {
|
||||
match msg {
|
||||
WebGPURequest::RequestAdapter(sender, options) => {
|
||||
let adapter_id = match wgpu::request_adapter(
|
||||
&self.global,
|
||||
&options,
|
||||
// TODO: The ids we pass here should be generated by the client
|
||||
&[
|
||||
wgpu::Id::zip(0, 0, wgpu::Backend::Vulkan),
|
||||
wgpu::Id::zip(0, 0, wgpu::Backend::Metal),
|
||||
wgpu::Id::zip(0, 0, wgpu::Backend::Dx12),
|
||||
],
|
||||
) {
|
||||
WebGPURequest::RequestAdapter(sender, options, id) => {
|
||||
let adapter_id = match wgpu::request_adapter(&self.global, &options, &[id]) {
|
||||
Some(id) => id,
|
||||
None => {
|
||||
if let Err(e) =
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue