From 2cffbd75279b72feeb067a680a248b155d224e2c Mon Sep 17 00:00:00 2001 From: Wu Yu Wei Date: Thu, 10 Mar 2022 17:51:53 +0800 Subject: [PATCH] Use IpcBytesReceiver to send Display list data --- components/compositing/compositor.rs | 39 +++++++++++++++------------- components/script_traits/lib.rs | 9 +++++-- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 4c7461dd955..023c3cac959 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -626,25 +626,28 @@ impl IOCompositor { size, pipeline, size2, - data, + receiver, descriptor, - )) => { - self.waiting_on_pending_frame = true; - let mut txn = webrender_api::Transaction::new(); - txn.set_display_list( - epoch, - None, - size, - ( - pipeline, - size2, - webrender_api::BuiltDisplayList::from_data(data, descriptor), - ), - true, - ); - txn.generate_frame(); - self.webrender_api - .send_transaction(self.webrender_document, txn); + )) => match receiver.recv() { + Ok(data) => { + self.waiting_on_pending_frame = true; + let mut txn = webrender_api::Transaction::new(); + txn.set_display_list( + epoch, + None, + size, + ( + pipeline, + size2, + webrender_api::BuiltDisplayList::from_data(data, descriptor), + ), + true, + ); + txn.generate_frame(); + self.webrender_api + .send_transaction(self.webrender_document, txn); + }, + Err(e) => warn!("error receiving display data: {:?}", e), }, WebrenderMsg::Layout(script_traits::WebrenderMsg::HitTest( diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index 0fc56a9f2e3..af336a41374 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -1123,7 +1123,7 @@ pub enum WebrenderMsg { LayoutSize, webrender_api::PipelineId, LayoutSize, - Vec, + ipc::IpcBytesReceiver, BuiltDisplayListDescriptor, ), /// Perform a hit test operation. The result will be returned via @@ -1181,16 +1181,21 @@ impl WebrenderIpcSender { (pipeline, size2, list): (webrender_api::PipelineId, LayoutSize, BuiltDisplayList), ) { let (data, descriptor) = list.into_data(); + let (sender, receiver) = ipc::bytes_channel().unwrap(); if let Err(e) = self.0.send(WebrenderMsg::SendDisplayList( webrender_api::Epoch(epoch.0), size, pipeline, size2, - data, + receiver, descriptor, )) { warn!("Error sending display list: {}", e); } + + if let Err(e) = sender.send(&data) { + warn!("Error sending display data: {}", e); + } } /// Perform a hit test operation. Blocks until the operation is complete and