From 3d70243438ac9bc2c95b20ae8d4b6c093086321b Mon Sep 17 00:00:00 2001 From: Hieu Do Date: Sat, 1 Jun 2024 00:51:36 +0700 Subject: [PATCH] webgpu: Parse and forward backend prefs to wgpu (#32410) Signed-off-by: Hieu Do --- components/config/prefs.rs | 2 ++ components/webgpu/wgpu_thread.rs | 16 ++++++++++++++-- resources/prefs.json | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/components/config/prefs.rs b/components/config/prefs.rs index f9c7c39bf82..7bae20b721f 100644 --- a/components/config/prefs.rs +++ b/components/config/prefs.rs @@ -206,6 +206,8 @@ mod gen { webgpu: { /// Enable WebGPU APIs. enabled: bool, + /// List of comma-separated backends to be used by wgpu + wgpu_backend: String, }, bluetooth: { enabled: bool, diff --git a/components/webgpu/wgpu_thread.rs b/components/webgpu/wgpu_thread.rs index 736dd78f812..3a214e2d321 100644 --- a/components/webgpu/wgpu_thread.rs +++ b/components/webgpu/wgpu_thread.rs @@ -13,7 +13,8 @@ use arrayvec::ArrayVec; use base::id::PipelineId; use euclid::default::Size2D; use ipc_channel::ipc::{IpcReceiver, IpcSender, IpcSharedMemory}; -use log::{error, warn}; +use log::{error, info, warn}; +use servo_config::pref; use webrender::{RenderApi, RenderApiSender, Transaction}; use webrender_api::{DirtyRect, DocumentId}; use webrender_traits::{WebrenderExternalImageRegistry, WebrenderImageHandlerType}; @@ -21,6 +22,7 @@ use wgc::command::{ImageCopyBuffer, ImageCopyTexture}; use wgc::device::queue::SubmittedWorkDoneClosure; use wgc::device::{DeviceDescriptor, HostMap, ImplicitPipelineIds}; use wgc::id::DeviceId; +use wgc::instance::parse_backends_from_comma_list; use wgc::pipeline::ShaderModuleDescriptor; use wgc::resource::{BufferMapCallback, BufferMapOperation}; use wgc::{gfx_select, id}; @@ -88,10 +90,20 @@ impl WGPU { external_images: Arc>, wgpu_image_map: Arc>>, ) -> Self { + let backend_pref = pref!(dom.webgpu.wgpu_backend); + let backends = if backend_pref.is_empty() { + wgt::Backends::PRIMARY + } else { + info!( + "Selecting backends based on dom.webgpu.wgpu_backend pref: {:?}", + backend_pref + ); + parse_backends_from_comma_list(&backend_pref) + }; let global = Arc::new(wgc::global::Global::new( "wgpu-core", InstanceDescriptor { - backends: wgt::Backends::PRIMARY, + backends, ..Default::default() }, )); diff --git a/resources/prefs.json b/resources/prefs.json index b4999a84a2c..c26803567a9 100644 --- a/resources/prefs.json +++ b/resources/prefs.json @@ -32,6 +32,7 @@ "dom.testing.htmlinputelement.select_files.enabled": false, "dom.webgl2.enabled": false, "dom.webgpu.enabled": false, + "dom.webgpu.wgpu_backend": "", "dom.webrtc.enabled": false, "dom.webrtc.transceiver.enabled": false, "dom.webvr.enabled": false,