7 #include "flutter/fml/logging.h"
15 DrawOrderLayer& layer = draw_order_layers_.back();
17 layer.opaque_elements.push_back(element_index);
19 layer.dependent_elements.push_back(element_index);
23 draw_order_layers_.back().dependent_elements.push_back(element_index);
24 draw_order_layers_.push_back({});
28 if (draw_order_layers_.size() == 1u) {
30 VALIDATION_LOG <<
"Attemped to pop the first draw order clip layer. This "
31 "may be a bug in `EntityPass`.";
35 DrawOrderLayer& layer = draw_order_layers_.back();
36 DrawOrderLayer& parent_layer =
37 draw_order_layers_[draw_order_layers_.size() - 2];
39 layer.WriteCombinedDraws(parent_layer.dependent_elements, 0, 0);
41 draw_order_layers_.pop_back();
45 FML_DCHECK(draw_order_layers_.size() >= 1u);
47 size_t layer_count = draw_order_layers_.size();
50 while (draw_order_layers_.size() > 1u) {
55 DrawOrderLayer& layer = draw_order_layers_.back();
56 if (!first_root_flush_.has_value()) {
58 first_root_flush_ = std::move(layer);
62 layer.WriteCombinedDraws(sorted_elements_, 0, 0);
63 layer.opaque_elements.clear();
64 layer.dependent_elements.clear();
68 draw_order_layers_.resize(layer_count);
72 size_t opaque_skip_count,
73 size_t translucent_skip_count)
const {
74 FML_DCHECK(draw_order_layers_.size() == 1u)
75 <<
"Attempted to get sorted draws before all clips were popped.";
78 sorted_elements.reserve(
79 (first_root_flush_.has_value()
80 ? first_root_flush_->opaque_elements.size() +
81 first_root_flush_->dependent_elements.size()
83 sorted_elements_.size() +
84 draw_order_layers_.back().opaque_elements.size() +
85 draw_order_layers_.back().dependent_elements.size());
88 if (first_root_flush_.has_value()) {
89 first_root_flush_->WriteCombinedDraws(sorted_elements, opaque_skip_count,
90 translucent_skip_count);
92 sorted_elements.insert(sorted_elements.end(), sorted_elements_.begin(),
93 sorted_elements_.end());
96 draw_order_layers_.back().WriteCombinedDraws(
97 sorted_elements, first_root_flush_.has_value() ? 0 : opaque_skip_count,
98 first_root_flush_.has_value() ? 0 : translucent_skip_count);
100 return sorted_elements;
103 void DrawOrderResolver::DrawOrderLayer::WriteCombinedDraws(
104 ElementRefs& destination,
105 size_t opaque_skip_count,
106 size_t translucent_skip_count)
const {
107 FML_DCHECK(opaque_skip_count <= opaque_elements.size());
108 FML_DCHECK(translucent_skip_count <= dependent_elements.size());
110 destination.reserve(destination.size() +
111 opaque_elements.size() - opaque_skip_count +
112 dependent_elements.size() - translucent_skip_count);
115 destination.insert(destination.end(), opaque_elements.rbegin(),
116 opaque_elements.rend() - opaque_skip_count);
118 destination.insert(destination.end(),
119 dependent_elements.begin() + translucent_skip_count,
120 dependent_elements.end());
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)