Auto merge of #25035 - szeged:wgpu-core, r=jdm

Replace wgpu-native with wgpu-core

<!-- Please describe your changes on the following line: -->
This addresses `1` form https://github.com/servo/servo/issues/24706#issuecomment-557891841.
cc @jdm @kvark @imiklos

---
<!-- 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
- [ ] These changes fix #___ (GitHub issue number if applicable)

<!-- 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.-->

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/25035)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2019-12-08 14:38:40 -05:00 committed by GitHub
commit 013bb662cb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 130 additions and 59 deletions

9
Cargo.lock generated
View file

@ -6270,7 +6270,8 @@ dependencies = [
"malloc_size_of", "malloc_size_of",
"serde", "serde",
"servo_config", "servo_config",
"wgpu-native", "smallvec",
"wgpu-core",
] ]
[[package]] [[package]]
@ -6413,9 +6414,9 @@ dependencies = [
] ]
[[package]] [[package]]
name = "wgpu-native" name = "wgpu-core"
version = "0.4.0" version = "0.1.0"
source = "git+https://github.com/zakorgy/wgpu?branch=v0.4#128a16b9887a60a087a9d41ff68b20ce07cf6265" source = "git+https://github.com/gfx-rs/wgpu#4fdb54d33a38632ee111465e4c8282dc95994aa8"
dependencies = [ dependencies = [
"arrayvec 0.5.1", "arrayvec 0.5.1",
"bitflags", "bitflags",

View file

@ -31,4 +31,3 @@ mio = { git = "https://github.com/servo/mio.git", branch = "servo" }
# https://github.com/retep998/winapi-rs/pull/816 # https://github.com/retep998/winapi-rs/pull/816
winapi = { git = "https://github.com/servo/winapi-rs", branch = "patch-1" } winapi = { git = "https://github.com/servo/winapi-rs", branch = "patch-1" }
spirv_cross = { git = "https://github.com/kvark/spirv_cross", branch = "wgpu" } spirv_cross = { git = "https://github.com/kvark/spirv_cross", branch = "wgpu" }
wgpu-native = { git = "https://github.com/zakorgy/wgpu", branch = "v0.4" }

View file

@ -117,11 +117,13 @@ impl GPUMethods for GPU {
let promise = Promise::new_in_current_compartment(&self.global(), comp); let promise = Promise::new_in_current_compartment(&self.global(), comp);
let sender = response_async(&promise, self); let sender = response_async(&promise, self);
let power_preference = match options.powerPreference { let power_preference = match options.powerPreference {
Some(GPUPowerPreference::Low_power) => wgpu::PowerPreference::LowPower, Some(GPUPowerPreference::Low_power) => wgpu::instance::PowerPreference::LowPower,
Some(GPUPowerPreference::High_performance) => wgpu::PowerPreference::HighPerformance, Some(GPUPowerPreference::High_performance) => {
None => wgpu::PowerPreference::Default, wgpu::instance::PowerPreference::HighPerformance
},
None => wgpu::instance::PowerPreference::Default,
}; };
let id = self.global().as_window().Navigator().create_adapter_id(); let ids = self.global().as_window().Navigator().create_adapter_ids();
match self.wgpu_channel() { match self.wgpu_channel() {
Some(channel) => { Some(channel) => {
@ -129,8 +131,8 @@ impl GPUMethods for GPU {
.0 .0
.send(WebGPURequest::RequestAdapter( .send(WebGPURequest::RequestAdapter(
sender, sender,
wgpu::RequestAdapterOptions { power_preference }, wgpu::instance::RequestAdapterOptions { power_preference },
id, ids,
)) ))
.unwrap(); .unwrap();
}, },
@ -146,7 +148,7 @@ impl AsyncWGPUListener for GPU {
WebGPUResponse::RequestAdapter(name, adapter) => { WebGPUResponse::RequestAdapter(name, adapter) => {
let adapter = GPUAdapter::new( let adapter = GPUAdapter::new(
&self.global(), &self.global(),
DOMString::from(name), DOMString::from(format!("{} ({:?})", name, adapter.0.backend())),
Heap::default(), Heap::default(),
adapter, adapter,
); );

View file

@ -78,16 +78,18 @@ impl GPUAdapterMethods for GPUAdapter {
fn RequestDevice(&self, descriptor: &GPUDeviceDescriptor, comp: InCompartment) -> Rc<Promise> { fn RequestDevice(&self, descriptor: &GPUDeviceDescriptor, comp: InCompartment) -> Rc<Promise> {
let promise = Promise::new_in_current_compartment(&self.global(), comp); let promise = Promise::new_in_current_compartment(&self.global(), comp);
let sender = response_async(&promise, self); let sender = response_async(&promise, self);
let desc = wgpu::DeviceDescriptor { let desc = wgpu::instance::DeviceDescriptor {
extensions: wgpu::Extensions { extensions: wgpu::instance::Extensions {
anisotropic_filtering: descriptor.extensions.anisotropicFiltering, anisotropic_filtering: descriptor.extensions.anisotropicFiltering,
}, },
limits: wgpu::Limits { limits: wgpu::instance::Limits {
max_bind_groups: descriptor.limits.maxBindGroups, max_bind_groups: descriptor.limits.maxBindGroups,
}, },
}; };
if let Some(window) = self.global().downcast::<Window>() { if let Some(window) = self.global().downcast::<Window>() {
let id = window.Navigator().create_device_id(); let id = window
.Navigator()
.create_device_id(self.adapter.0.backend());
match window.webgpu_channel() { match window.webgpu_channel() {
Some(thread) => thread Some(thread) => thread
.0 .0

View file

@ -2,50 +2,101 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use webgpu::wgpu::{AdapterId, Backend, DeviceId, IdentityManager, SurfaceId}; use smallvec::SmallVec;
use webgpu::wgpu::{
hub::IdentityManager,
id::{AdapterId, DeviceId},
Backend,
};
#[derive(Debug)] #[derive(Debug)]
pub struct IdentityHub { pub struct IdentityHub {
adapters: IdentityManager<AdapterId>, adapters: IdentityManager,
devices: IdentityManager<DeviceId>, devices: IdentityManager,
backend: Backend,
} }
impl IdentityHub { impl IdentityHub {
fn new(backend: Backend) -> Self { fn new(backend: Backend) -> Self {
IdentityHub { IdentityHub {
adapters: IdentityManager::new(backend), adapters: IdentityManager::default(),
devices: IdentityManager::new(backend), devices: IdentityManager::default(),
backend,
} }
} }
fn create_adapter_id(&mut self) -> AdapterId {
self.adapters.alloc(self.backend)
}
fn create_device_id(&mut self) -> DeviceId {
self.devices.alloc(self.backend)
}
} }
#[derive(Debug)] #[derive(Debug)]
pub struct Identities { pub struct Identities {
surface: IdentityManager<SurfaceId>, surface: IdentityManager,
hub: IdentityHub, #[cfg(any(target_os = "linux", target_os = "windows"))]
vk_hub: IdentityHub,
#[cfg(target_os = "windows")]
dx12_hub: IdentityHub,
#[cfg(target_os = "windows")]
dx11_hub: IdentityHub,
#[cfg(any(target_os = "ios", target_os = "macos"))]
metal_hub: IdentityHub,
dummy_hub: IdentityHub,
} }
impl Identities { impl Identities {
pub fn new() -> Self { 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 { Identities {
surface: IdentityManager::new(Backend::Empty), surface: IdentityManager::default(),
hub, #[cfg(any(target_os = "linux", target_os = "windows"))]
vk_hub: IdentityHub::new(Backend::Vulkan),
#[cfg(target_os = "windows")]
dx12_hub: IdentityHub::new(Backend::Dx12),
#[cfg(target_os = "windows")]
dx11_hub: IdentityHub::new(Backend::Dx11),
#[cfg(any(target_os = "ios", target_os = "macos"))]
metal_hub: IdentityHub::new(Backend::Metal),
dummy_hub: IdentityHub::new(Backend::Empty),
} }
} }
pub fn create_adapter_id(&mut self) -> AdapterId { fn hubs(&mut self) -> Vec<&mut IdentityHub> {
self.hub.adapters.alloc() vec![
#[cfg(any(target_os = "linux", target_os = "windows"))]
&mut self.vk_hub,
#[cfg(target_os = "windows")]
&mut self.dx12_hub,
#[cfg(target_os = "windows")]
&mut self.dx11_hub,
#[cfg(any(target_os = "ios", target_os = "macos"))]
&mut self.metal_hub,
&mut self.dummy_hub,
]
} }
pub fn create_device_id(&mut self) -> DeviceId { pub fn create_device_id(&mut self, backend: Backend) -> DeviceId {
self.hub.devices.alloc() match backend {
#[cfg(any(target_os = "linux", target_os = "windows"))]
Backend::Vulkan => self.vk_hub.create_device_id(),
#[cfg(target_os = "windows")]
Backend::Dx12 => self.dx12_hub.create_device_id(),
#[cfg(target_os = "windows")]
Backend::Dx11 => self.dx11_hub.create_device_id(),
#[cfg(any(target_os = "ios", target_os = "macos"))]
Backend::Metal => self.metal_hub.create_device_id(),
_ => self.dummy_hub.create_device_id(),
}
}
pub fn create_adapter_ids(&mut self) -> SmallVec<[AdapterId; 4]> {
let mut ids = SmallVec::new();
for hub in self.hubs() {
ids.push(hub.create_adapter_id())
}
ids
} }
} }

View file

@ -24,9 +24,13 @@ use crate::dom::serviceworkercontainer::ServiceWorkerContainer;
use crate::dom::window::Window; use crate::dom::window::Window;
use crate::dom::xr::XR; use crate::dom::xr::XR;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use smallvec::SmallVec;
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
use webgpu::wgpu::{AdapterId, DeviceId}; use webgpu::wgpu::{
id::{AdapterId, DeviceId},
Backend,
};
#[dom_struct] #[dom_struct]
pub struct Navigator { pub struct Navigator {
@ -73,12 +77,12 @@ impl Navigator {
} }
impl Navigator { impl Navigator {
pub fn create_adapter_id(&self) -> AdapterId { pub fn create_adapter_ids(&self) -> SmallVec<[AdapterId; 4]> {
self.gpu_id_hub.borrow_mut().create_adapter_id() self.gpu_id_hub.borrow_mut().create_adapter_ids()
} }
pub fn create_device_id(&self) -> DeviceId { pub fn create_device_id(&self, backend: Backend) -> DeviceId {
self.gpu_id_hub.borrow_mut().create_device_id() self.gpu_id_hub.borrow_mut().create_device_id(backend)
} }
} }

View file

@ -17,4 +17,5 @@ log = "0.4"
malloc_size_of = { path = "../malloc_size_of" } malloc_size_of = { path = "../malloc_size_of" }
serde = "1.0" serde = "1.0"
servo_config = {path = "../config"} servo_config = {path = "../config"}
wgpu-native = { version = "0.4.0", features = ["serde"] } smallvec = "0.6"
wgpu-core = { version = "0.1.0", git = "https://github.com/gfx-rs/wgpu", features = ["serde"] }

View file

@ -7,17 +7,17 @@ extern crate log;
#[macro_use] #[macro_use]
extern crate serde; extern crate serde;
#[macro_use] #[macro_use]
pub extern crate wgpu_native as wgpu; pub extern crate wgpu_core as wgpu;
use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; use malloc_size_of::{MallocSizeOf, MallocSizeOfOps};
use servo_config::pref; use servo_config::pref;
use wgpu::{adapter_get_info, adapter_request_device}; use smallvec::SmallVec;
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub enum WebGPUResponse { pub enum WebGPUResponse {
RequestAdapter(String, WebGPUAdapter), RequestAdapter(String, WebGPUAdapter),
RequestDevice(WebGPUDevice, wgpu::DeviceDescriptor), RequestDevice(WebGPUDevice, wgpu::instance::DeviceDescriptor),
} }
pub type WebGPUResponseResult = Result<WebGPUResponse, String>; pub type WebGPUResponseResult = Result<WebGPUResponse, String>;
@ -26,14 +26,14 @@ pub type WebGPUResponseResult = Result<WebGPUResponse, String>;
pub enum WebGPURequest { pub enum WebGPURequest {
RequestAdapter( RequestAdapter(
IpcSender<WebGPUResponseResult>, IpcSender<WebGPUResponseResult>,
wgpu::RequestAdapterOptions, wgpu::instance::RequestAdapterOptions,
wgpu::AdapterId, SmallVec<[wgpu::id::AdapterId; 4]>,
), ),
RequestDevice( RequestDevice(
IpcSender<WebGPUResponseResult>, IpcSender<WebGPUResponseResult>,
WebGPUAdapter, WebGPUAdapter,
wgpu::DeviceDescriptor, wgpu::instance::DeviceDescriptor,
wgpu::DeviceId, wgpu::id::DeviceId,
), ),
Exit(IpcSender<()>), Exit(IpcSender<()>),
} }
@ -78,8 +78,9 @@ impl WebGPU {
struct WGPU { struct WGPU {
receiver: IpcReceiver<WebGPURequest>, receiver: IpcReceiver<WebGPURequest>,
global: wgpu::Global, global: wgpu::hub::Global<()>,
adapters: Vec<WebGPUAdapter>, adapters: Vec<WebGPUAdapter>,
devices: Vec<WebGPUDevice>,
// Track invalid adapters https://gpuweb.github.io/gpuweb/#invalid // Track invalid adapters https://gpuweb.github.io/gpuweb/#invalid
_invalid_adapters: Vec<WebGPUAdapter>, _invalid_adapters: Vec<WebGPUAdapter>,
} }
@ -88,8 +89,9 @@ impl WGPU {
fn new(receiver: IpcReceiver<WebGPURequest>) -> Self { fn new(receiver: IpcReceiver<WebGPURequest>) -> Self {
WGPU { WGPU {
receiver, receiver,
global: wgpu::Global::new("webgpu-native"), global: wgpu::hub::Global::new("wgpu-core"),
adapters: Vec::new(), adapters: Vec::new(),
devices: Vec::new(),
_invalid_adapters: Vec::new(), _invalid_adapters: Vec::new(),
} }
} }
@ -101,8 +103,11 @@ impl WGPU {
fn run(mut self) { fn run(mut self) {
while let Ok(msg) = self.receiver.recv() { while let Ok(msg) = self.receiver.recv() {
match msg { match msg {
WebGPURequest::RequestAdapter(sender, options, id) => { WebGPURequest::RequestAdapter(sender, options, ids) => {
let adapter_id = match wgpu::request_adapter(&self.global, &options, &[id]) { let adapter_id = match self.global.pick_adapter(
&options,
wgpu::instance::AdapterInputs::IdSet(&ids, |id| id.backend()),
) {
Some(id) => id, Some(id) => id,
None => { None => {
if let Err(e) = if let Err(e) =
@ -118,8 +123,8 @@ impl WGPU {
}; };
let adapter = WebGPUAdapter(adapter_id); let adapter = WebGPUAdapter(adapter_id);
self.adapters.push(adapter); self.adapters.push(adapter);
let info = let global = &self.global;
gfx_select!(adapter_id => adapter_get_info(&self.global, adapter_id)); let info = gfx_select!(adapter_id => global.adapter_get_info(adapter_id));
if let Err(e) = if let Err(e) =
sender.send(Ok(WebGPUResponse::RequestAdapter(info.name, adapter))) sender.send(Ok(WebGPUResponse::RequestAdapter(info.name, adapter)))
{ {
@ -130,8 +135,14 @@ impl WGPU {
} }
}, },
WebGPURequest::RequestDevice(sender, adapter, descriptor, id) => { WebGPURequest::RequestDevice(sender, adapter, descriptor, id) => {
let _output = gfx_select!(id => adapter_request_device(&self.global, adapter.0, &descriptor, id)); let global = &self.global;
let id = gfx_select!(id => global.adapter_request_device(
adapter.0,
&descriptor,
id
));
let device = WebGPUDevice(id); let device = WebGPUDevice(id);
self.devices.push(device);
if let Err(e) = if let Err(e) =
sender.send(Ok(WebGPUResponse::RequestDevice(device, descriptor))) sender.send(Ok(WebGPUResponse::RequestDevice(device, descriptor)))
{ {
@ -168,5 +179,5 @@ macro_rules! webgpu_resource {
}; };
} }
webgpu_resource!(WebGPUAdapter, wgpu::AdapterId); webgpu_resource!(WebGPUAdapter, wgpu::id::AdapterId);
webgpu_resource!(WebGPUDevice, wgpu::DeviceId); webgpu_resource!(WebGPUDevice, wgpu::id::DeviceId);