| author | Miko Mynttinen <mikokm@gmail.com> |
| Mon, 27 Jan 2020 14:19:17 +0000 | |
| changeset 511846 | 96290c1e1a5fa34484ef328b6f3c12b814efb45c |
| parent 511845 | 8ef0c5a62e56ba9a570d53e7a1616d912024420d |
| child 511847 | 84e3a48f0843e59661483078101631c25efa9688 |
| push id | 37060 |
| push user | aciure@mozilla.com |
| push date | Mon, 27 Jan 2020 21:39:55 +0000 |
| treeherder | mozilla-central@df59b74d33d7 [default view] [failures only] |
| perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
| bugs | 1558926 |
| milestone | 74.0a1 |
| first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
| last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/wr/webrender/src/scene_builder_thread.rs +++ b/gfx/wr/webrender/src/scene_builder_thread.rs @@ -250,16 +250,17 @@ pub struct SceneBuilderThread { documents: FastHashMap<DocumentId, Document>, rx: Receiver<SceneBuilderRequest>, tx: Sender<SceneBuilderResult>, api_tx: MsgSender<ApiMsg>, config: FrameBuilderConfig, size_of_ops: Option<MallocSizeOfOps>, hooks: Option<Box<dyn SceneBuilderHooks + Send>>, simulate_slow_ms: u32, + removed_pipelines: FastHashSet<PipelineId> } pub struct SceneBuilderThreadChannels { rx: Receiver<SceneBuilderRequest>, tx: Sender<SceneBuilderResult>, api_tx: MsgSender<ApiMsg>, } @@ -294,16 +295,17 @@ impl SceneBuilderThread { documents: Default::default(), rx, tx, api_tx, config, size_of_ops, hooks, simulate_slow_ms: 0, + removed_pipelines: FastHashSet::default(), } } /// Send a message to the render backend thread. /// /// We first put something in the result queue and then send a wake-up /// message to the api queue that the render backend is blocking on. pub fn send(&self, msg: SceneBuilderResult) { @@ -524,38 +526,45 @@ impl SceneBuilderThread { let scene_build_start_time = precise_time_ns(); let doc = self.documents .entry(txn.document_id) .or_insert_with(|| Document::new(Scene::new())); let scene = &mut doc.scene; + for &(pipeline_id, epoch) in &txn.epoch_updates { + scene.update_epoch(pipeline_id, epoch); + } + + if let Some(id) = txn.set_root_pipeline { + scene.set_root_pipeline_id(id); + } + + for &(pipeline_id, _) in &txn.removed_pipelines { + scene.remove_pipeline(pipeline_id); + self.removed_pipelines.insert(pipeline_id); + } + for update in txn.display_list_updates.drain(..) { + if self.removed_pipelines.contains(&update.pipeline_id) { + continue; + } + scene.set_display_list( update.pipeline_id, update.epoch, update.built_display_list, update.background, update.viewport_size, update.content_size, ); } - for &(pipeline_id, epoch) in &txn.epoch_updates { - scene.update_epoch(pipeline_id, epoch); - } - - if let Some(id) = txn.set_root_pipeline { - scene.set_root_pipeline_id(id); - } - - for &(pipeline_id, _) in &txn.removed_pipelines { - scene.remove_pipeline(pipeline_id) - } + self.removed_pipelines.clear(); let mut built_scene = None; let mut interner_updates = None; if scene.has_root_pipeline() { if let Some(request) = txn.request_scene_build.take() { let built = SceneBuilder::build( &scene, request.font_instances,