From 9c52f9c41c6b945b89420ad2c451892d4e581ad6 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 9 Mar 2016 18:18:26 -0800 Subject: [PATCH] Flatten display list transfer into a separately-transferred byte array, and consolidate the multitude of display list messages into one. Along with the corresponding patches to other Servo repositories, this improves display list building performance on small display lists by about 3x. --- src/render_backend.rs | 48 ++++++++++++++++++++++++++++--------------- src/renderer.rs | 5 +++-- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/render_backend.rs b/src/render_backend.rs index cffbd203d4..f059e0d98d 100644 --- a/src/render_backend.rs +++ b/src/render_backend.rs @@ -4,7 +4,7 @@ use frame::Frame; use internal_types::{FontTemplate, ResultMsg, RendererFrame}; -use ipc_channel::ipc::IpcReceiver; +use ipc_channel::ipc::{IpcBytesReceiver, IpcReceiver}; use profiler::BackendProfileCounters; use resource_cache::ResourceCache; use scene::Scene; @@ -13,7 +13,7 @@ use std::collections::HashMap; use std::sync::{Arc, Mutex}; use std::sync::mpsc::Sender; use texture_cache::{TextureCache, TextureCacheItemId}; -use webrender_traits::{ApiMsg, IdNamespace, RenderNotifier}; +use webrender_traits::{ApiMsg, AuxiliaryLists, BuiltDisplayList, IdNamespace, RenderNotifier}; use webrender_traits::{WebGLContextId, ScrollLayerId}; use batch::new_id; use device::TextureId; @@ -21,6 +21,7 @@ use offscreen_gl_context::{NativeGLContext, GLContext, ColorAttachmentType, Nati pub struct RenderBackend { api_rx: IpcReceiver, + payload_rx: IpcBytesReceiver, result_tx: Sender, device_pixel_ratio: f32, @@ -40,6 +41,7 @@ pub struct RenderBackend { impl RenderBackend { pub fn new(api_rx: IpcReceiver, + payload_rx: IpcBytesReceiver, result_tx: Sender, device_pixel_ratio: f32, white_image_id: TextureCacheItemId, @@ -60,6 +62,7 @@ impl RenderBackend { RenderBackend { thread_pool: thread_pool, api_rx: api_rx, + payload_rx: payload_rx, result_tx: result_tx, device_pixel_ratio: device_pixel_ratio, resource_cache: resource_cache, @@ -105,19 +108,6 @@ impl RenderBackend { format, bytes); } - ApiMsg::AddDisplayList(id, pipeline_id, epoch, built_display_list) => { - self.scene.add_display_list(id, - pipeline_id, - epoch, - built_display_list, - &mut self.resource_cache); - } - ApiMsg::AddStackingContext(id, pipeline_id, epoch, stacking_context) => { - self.scene.add_stacking_context(id, - pipeline_id, - epoch, - stacking_context); - } ApiMsg::CloneApi(sender) => { let result = self.next_namespace_id; @@ -131,7 +121,33 @@ impl RenderBackend { epoch, pipeline_id, viewport_size, - auxiliary_lists) => { + stacking_contexts, + display_lists, + auxiliary_lists_descriptor) => { + for (id, stacking_context) in stacking_contexts.into_iter() { + self.scene.add_stacking_context(id, + pipeline_id, + epoch, + stacking_context); + } + + for (display_list_id, + display_list_descriptor) in display_lists.into_iter() { + let built_display_list_data = self.payload_rx.recv().unwrap(); + let built_display_list = + BuiltDisplayList::from_data(built_display_list_data, + display_list_descriptor); + self.scene.add_display_list(display_list_id, + pipeline_id, + epoch, + built_display_list, + &mut self.resource_cache); + } + + let auxiliary_lists_data = self.payload_rx.recv().unwrap(); + let auxiliary_lists = + AuxiliaryLists::from_data(auxiliary_lists_data, + auxiliary_lists_descriptor); let frame = profile_counters.total_time.profile(|| { self.scene.set_root_stacking_context(pipeline_id, epoch, diff --git a/src/renderer.rs b/src/renderer.rs index 663d1b6cca..a30c0d6492 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -168,6 +168,7 @@ pub struct Renderer { impl Renderer { pub fn new(options: RendererOptions) -> (Renderer, RenderApiSender) { let (api_tx, api_rx) = ipc::channel().unwrap(); + let (payload_tx, payload_rx) = ipc::bytes_channel().unwrap(); let (result_tx, result_rx) = channel(); let notifier = Arc::new(Mutex::new(None)); @@ -260,6 +261,7 @@ impl Renderer { let (device_pixel_ratio, enable_aa) = (options.device_pixel_ratio, options.enable_aa); thread::spawn(move || { let mut backend = RenderBackend::new(api_rx, + payload_rx, result_tx, device_pixel_ratio, white_image_id, @@ -318,8 +320,7 @@ impl Renderer { renderer.update_uniform_locations(); - let sender = RenderApiSender::new(api_tx); - + let sender = RenderApiSender::new(api_tx, payload_tx); (renderer, sender) }