Flutter Impeller
draw_order_resolver.h
Go to the documentation of this file.
1 // Copyright 2013 The Flutter 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 
5 #ifndef FLUTTER_IMPELLER_ENTITY_DRAW_ORDER_RESOLVER_H_
6 #define FLUTTER_IMPELLER_ENTITY_DRAW_ORDER_RESOLVER_H_
7 
8 #include <optional>
9 #include <vector>
10 
11 namespace impeller {
12 
13 /// Helper that records draw indices in painter's order and sorts the draws into
14 /// an optimized order based on translucency and clips.
16  public:
17  using ElementRefs = std::vector<size_t>;
18 
20 
21  void AddElement(size_t element_index, bool is_opaque);
22 
23  void PushClip(size_t element_index);
24 
25  void PopClip();
26 
27  void Flush();
28 
29  //-------------------------------------------------------------------------
30  /// @brief Returns the sorted draws for the current draw order layer.
31  /// This should only be called after all recording has finished.
32  ///
33  /// @param[in] opaque_skip_count The number of opaque elements to skip
34  /// when appending the combined elements.
35  /// This is used for the "clear color"
36  /// optimization.
37  /// @param[in] translucent_skip_count The number of translucent elements to
38  /// skip when appending the combined
39  /// elements. This is used for the
40  /// "clear color" optimization.
41  ///
42  ElementRefs GetSortedDraws(size_t opaque_skip_count,
43  size_t translucent_skip_count) const;
44 
45  private:
46  /// A data structure for collecting sorted draws for a given "draw order
47  /// layer". Currently these layers just correspond to the local clip stack.
48  struct DrawOrderLayer {
49  /// The list of backdrop-independent elements (always just opaque). These
50  /// are order independent, and so we render these elements in reverse
51  /// painter's order so that they cull one another.
52  ElementRefs opaque_elements;
53 
54  /// The list of backdrop-dependent elements with respect to this draw
55  /// order layer. These elements are drawn after all of the independent
56  /// elements.
57  ElementRefs dependent_elements;
58 
59  //-----------------------------------------------------------------------
60  /// @brief Appends the combined opaque and transparent elements into
61  /// a final destination buffer.
62  ///
63  /// @param[in] destination The buffer to append the combined
64  /// elements to.
65  /// @param[in] opaque_skip_count The number of opaque elements to
66  /// skip when appending the combined
67  /// elements. This is used for the
68  /// "clear color" optimization.
69  /// @param[in] translucent_skip_count The number of translucent elements
70  /// to skip when appending the combined
71  /// elements. This is used for the
72  /// "clear color" optimization.
73  ///
74  void WriteCombinedDraws(ElementRefs& destination,
75  size_t opaque_skip_count,
76  size_t translucent_skip_count) const;
77  };
78  std::vector<DrawOrderLayer> draw_order_layers_;
79 
80  // The first time the root layer is flushed, the layer contents are stored
81  // here. This is done to enable element skipping for the clear color
82  // optimization.
83  std::optional<DrawOrderLayer> first_root_flush_;
84  // All subsequent root flushes are stored here.
85  ElementRefs sorted_elements_;
86 
87  DrawOrderResolver(const DrawOrderResolver&) = delete;
88 
89  DrawOrderResolver& operator=(const DrawOrderResolver&) = delete;
90 };
91 
92 } // namespace impeller
93 
94 #endif // FLUTTER_IMPELLER_ENTITY_DRAW_ORDER_RESOLVER_H_
void PushClip(size_t element_index)
ElementRefs GetSortedDraws(size_t opaque_skip_count, size_t translucent_skip_count) const
Returns the sorted draws for the current draw order layer. This should only be called after all recor...
std::vector< size_t > ElementRefs
void AddElement(size_t element_index, bool is_opaque)