diff options
author | Kunal Mohan <kunalmohan99@gmail.com> | 2020-05-22 17:49:35 +0530 |
---|---|---|
committer | Kunal Mohan <kunalmohan99@gmail.com> | 2020-05-22 21:22:19 +0530 |
commit | 39f336b5278fc2c4ab25da508245e8eb86aa9b33 (patch) | |
tree | d8939d2b5ae9a3d918148fe1e4dc4afda3f94a54 /components/script/script_thread.rs | |
parent | 94063d67a8fb1f4a9f776771aba9eb8a2b3bd3bd (diff) | |
download | servo-39f336b5278fc2c4ab25da508245e8eb86aa9b33.tar.gz servo-39f336b5278fc2c4ab25da508245e8eb86aa9b33.zip |
Implement client-side logic for WebGPU id recycling
Diffstat (limited to 'components/script/script_thread.rs')
-rw-r--r-- | components/script/script_thread.rs | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index d061dc7d32e..c3e2694149f 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -168,6 +168,7 @@ use style::dom::OpaqueNode; use style::thread_state::{self, ThreadState}; use time::{at_utc, get_time, precise_time_ns, Timespec}; use url::Position; +use webgpu::identity::WebGPUMsg; use webrender_api::units::LayoutPixel; use webrender_api::DocumentId; @@ -267,6 +268,7 @@ enum MixedMessage { FromScript(MainThreadScriptMsg), FromDevtools(DevtoolScriptControlMsg), FromImageCache((PipelineId, PendingImageResponse)), + FromWebGPUServer(WebGPUMsg), } /// Messages used to control the script event loop. @@ -692,8 +694,11 @@ pub struct ScriptThread { /// Code is running as a consequence of a user interaction is_user_interacting: Cell<bool>, - /// Channel to WebGPU + /// Identity manager for WebGPU resources gpu_id_hub: Arc<Mutex<Identities>>, + + /// Receiver to receive commands from optional WebGPU server. + webgpu_port: RefCell<Option<Receiver<WebGPUMsg>>>, } /// In the event of thread panic, all data on the stack runs its destructor. However, there @@ -1383,6 +1388,7 @@ impl ScriptThread { node_ids: Default::default(), is_user_interacting: Cell::new(false), gpu_id_hub: Arc::new(Mutex::new(Identities::new())), + webgpu_port: RefCell::new(None), } } @@ -1405,7 +1411,9 @@ impl ScriptThread { /// Handle incoming control messages. fn handle_msgs(&self) -> bool { use self::MixedMessage::FromScript; - use self::MixedMessage::{FromConstellation, FromDevtools, FromImageCache}; + use self::MixedMessage::{ + FromConstellation, FromDevtools, FromImageCache, FromWebGPUServer, + }; // Handle pending resize events. // Gather them first to avoid a double mut borrow on self. @@ -1445,6 +1453,8 @@ impl ScriptThread { recv(self.devtools_chan.as_ref().map(|_| &self.devtools_port).unwrap_or(&crossbeam_channel::never())) -> msg => FromDevtools(msg.unwrap()), recv(self.image_cache_port) -> msg => FromImageCache(msg.unwrap()), + recv(self.webgpu_port.borrow().as_ref().unwrap_or(&crossbeam_channel::never())) -> msg + => FromWebGPUServer(msg.unwrap()), }; debug!("Got event."); @@ -1540,7 +1550,13 @@ impl ScriptThread { Err(_) => match self.task_queue.try_recv() { Err(_) => match self.devtools_port.try_recv() { Err(_) => match self.image_cache_port.try_recv() { - Err(_) => break, + Err(_) => match &*self.webgpu_port.borrow() { + Some(p) => match p.try_recv() { + Err(_) => break, + Ok(ev) => event = FromWebGPUServer(ev), + }, + None => break, + }, Ok(ev) => event = FromImageCache(ev), }, Ok(ev) => event = FromDevtools(ev), @@ -1572,6 +1588,7 @@ impl ScriptThread { FromScript(inner_msg) => self.handle_msg_from_script(inner_msg), FromDevtools(inner_msg) => self.handle_msg_from_devtools(inner_msg), FromImageCache(inner_msg) => self.handle_msg_from_image_cache(inner_msg), + FromWebGPUServer(inner_msg) => self.handle_msg_from_webgpu_server(inner_msg), } None @@ -1659,6 +1676,7 @@ impl ScriptThread { }, _ => ScriptThreadEventCategory::ScriptEvent, }, + MixedMessage::FromWebGPUServer(_) => ScriptThreadEventCategory::WebGPUMsg, } } @@ -1698,6 +1716,7 @@ impl ScriptThread { ScriptHangAnnotation::PerformanceTimelineTask }, ScriptThreadEventCategory::PortMessage => ScriptHangAnnotation::PortMessage, + ScriptThreadEventCategory::WebGPUMsg => ScriptHangAnnotation::WebGPUMsg, }; self.background_hang_monitor .as_ref() @@ -1743,6 +1762,7 @@ impl ScriptThread { PaintMetric(..) => None, ExitFullScreen(id, ..) => Some(id), MediaSessionAction(..) => None, + SetWebGPUPort(..) => None, }, MixedMessage::FromDevtools(_) => None, MixedMessage::FromScript(ref inner_msg) => match *inner_msg { @@ -1756,6 +1776,7 @@ impl ScriptThread { MainThreadScriptMsg::WakeUp => None, }, MixedMessage::FromImageCache((pipeline_id, _)) => Some(pipeline_id), + MixedMessage::FromWebGPUServer(..) => None, } } @@ -1810,6 +1831,7 @@ impl ScriptThread { ScriptThreadEventCategory::PerformanceTimelineTask => { ProfilerCategory::ScriptPerformanceEvent }, + ScriptThreadEventCategory::WebGPUMsg => ProfilerCategory::ScriptWebGPUMsg, }; profile(profiler_cat, None, self.time_profiler_chan.clone(), f) } else { @@ -1959,6 +1981,14 @@ impl ScriptThread { ConstellationControlMsg::MediaSessionAction(pipeline_id, action) => { self.handle_media_session_action(pipeline_id, action) }, + ConstellationControlMsg::SetWebGPUPort(port) => { + if self.webgpu_port.borrow().is_some() { + warn!("WebGPU port already exists for this content process"); + } else { + let p = ROUTER.route_ipc_receiver_to_new_crossbeam_receiver(port); + *self.webgpu_port.borrow_mut() = Some(p); + } + }, msg @ ConstellationControlMsg::AttachLayout(..) | msg @ ConstellationControlMsg::Viewport(..) | msg @ ConstellationControlMsg::SetScrollState(..) | @@ -1970,6 +2000,25 @@ impl ScriptThread { } } + fn handle_msg_from_webgpu_server(&self, msg: WebGPUMsg) { + match msg { + WebGPUMsg::FreeAdapter(id) => self.gpu_id_hub.lock().kill_adapter_id(id), + WebGPUMsg::FreeDevice(id) => self.gpu_id_hub.lock().kill_device_id(id), + WebGPUMsg::FreeBuffer(id) => self.gpu_id_hub.lock().kill_buffer_id(id), + WebGPUMsg::FreePipelineLayout(id) => self.gpu_id_hub.lock().kill_pipeline_layout_id(id), + WebGPUMsg::FreeComputePipeline(id) => { + self.gpu_id_hub.lock().kill_compute_pipeline_id(id) + }, + WebGPUMsg::FreeBindGroup(id) => self.gpu_id_hub.lock().kill_bind_group_id(id), + WebGPUMsg::FreeBindGroupLayout(id) => { + self.gpu_id_hub.lock().kill_bind_group_layout_id(id) + }, + WebGPUMsg::FreeCommandBuffer(id) => self.gpu_id_hub.lock().kill_command_buffer_id(id), + WebGPUMsg::FreeShaderModule(id) => self.gpu_id_hub.lock().kill_shader_module_id(id), + _ => {}, + } + } + fn handle_msg_from_script(&self, msg: MainThreadScriptMsg) { match msg { MainThreadScriptMsg::Common(CommonScriptMsg::Task(_, task, _, _)) => task.run_box(), |