surpass/painter/layer_workbench/passes/
tile_unchanged.rs

1// Copyright 2022 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use std::ops::ControlFlow;
6
7use crate::painter::layer_workbench::passes::PassesSharedState;
8use crate::painter::layer_workbench::{Context, LayerWorkbenchState, OptimizerTileWriteOp};
9use crate::painter::LayerProps;
10
11pub fn tile_unchanged_pass<'w, 'c, P: LayerProps>(
12    workbench: &'w mut LayerWorkbenchState,
13    state: &'w mut PassesSharedState,
14    context: &'c Context<'_, P>,
15) -> ControlFlow<OptimizerTileWriteOp> {
16    let clear_color_is_unchanged = context
17        .cached_clear_color
18        .map(|previous_clear_color| previous_clear_color == context.clear_color)
19        .unwrap_or_default();
20
21    let tile_paint = context.cached_tile.as_ref().and_then(|cached_tile| {
22        let layers = workbench.ids.len() as u32;
23        let previous_layers = cached_tile.update_layer_count(Some(layers));
24
25        let is_unchanged = previous_layers
26            .map(|previous_layers| {
27                state.layers_were_removed = layers < previous_layers;
28
29                previous_layers == layers
30                    && workbench.ids.iter().all(|&id| context.props.is_unchanged(id))
31            })
32            .unwrap_or_default();
33
34        (clear_color_is_unchanged && is_unchanged).then_some(OptimizerTileWriteOp::None)
35    });
36
37    match tile_paint {
38        Some(tile_paint) => ControlFlow::Break(tile_paint),
39        None => ControlFlow::Continue(()),
40    }
41}