mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
The root slice of a surface frame was requesting the construction of an RTree from its DisplayList when it was built from a layer tree, but since the layer tree already does branch culling, it would not benefit from any further culling during `DisplayList::Dispatch`. Further, if there are platform views present in the layer tree then they will need an RTree to accurately convey "pixel ownership" information to the platform, but the root slice lives below any and all platform views, so it is the only slice that doesn't need an RTree for that case. The cost of having an RTree in that slice was the accumulation of information and lists of rects that would never prove useful.
86 lines
2.4 KiB
C++
86 lines
2.4 KiB
C++
// Copyright 2013 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "flutter/flow/surface_frame.h"
|
|
|
|
#include <limits>
|
|
#include <utility>
|
|
|
|
#include "flutter/fml/logging.h"
|
|
#include "flutter/fml/trace_event.h"
|
|
|
|
#include "third_party/skia/include/core/SkSurface.h"
|
|
#include "third_party/skia/include/utils/SkNWayCanvas.h"
|
|
|
|
namespace flutter {
|
|
|
|
SurfaceFrame::SurfaceFrame(sk_sp<SkSurface> surface,
|
|
FramebufferInfo framebuffer_info,
|
|
const SubmitCallback& submit_callback,
|
|
SkISize frame_size,
|
|
std::unique_ptr<GLContextResult> context_result,
|
|
bool display_list_fallback)
|
|
: surface_(std::move(surface)),
|
|
framebuffer_info_(framebuffer_info),
|
|
submit_callback_(submit_callback),
|
|
context_result_(std::move(context_result)) {
|
|
FML_DCHECK(submit_callback_);
|
|
if (surface_) {
|
|
adapter_.set_canvas(surface_->getCanvas());
|
|
canvas_ = &adapter_;
|
|
} else if (display_list_fallback) {
|
|
FML_DCHECK(!frame_size.isEmpty());
|
|
// The root frame of a surface will be filled by the layer_tree which
|
|
// performs branch culling so it will be unlikely to need an rtree for
|
|
// further culling during `DisplayList::Dispatch`. Further, this canvas
|
|
// will live underneath any platform views so we do not need to compute
|
|
// exact coverage to describe "pixel ownership" to the platform.
|
|
dl_builder_ = sk_make_sp<DisplayListBuilder>(SkRect::Make(frame_size),
|
|
/*prepare_rtree=*/false);
|
|
canvas_ = dl_builder_.get();
|
|
}
|
|
}
|
|
|
|
bool SurfaceFrame::Submit() {
|
|
TRACE_EVENT0("flutter", "SurfaceFrame::Submit");
|
|
if (submitted_) {
|
|
return false;
|
|
}
|
|
|
|
submitted_ = PerformSubmit();
|
|
|
|
return submitted_;
|
|
}
|
|
|
|
bool SurfaceFrame::IsSubmitted() const {
|
|
return submitted_;
|
|
}
|
|
|
|
DlCanvas* SurfaceFrame::Canvas() {
|
|
return canvas_;
|
|
}
|
|
|
|
sk_sp<SkSurface> SurfaceFrame::SkiaSurface() const {
|
|
return surface_;
|
|
}
|
|
|
|
bool SurfaceFrame::PerformSubmit() {
|
|
if (submit_callback_ == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
if (submit_callback_(*this, Canvas())) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
sk_sp<DisplayList> SurfaceFrame::BuildDisplayList() {
|
|
TRACE_EVENT0("impeller", "SurfaceFrame::BuildDisplayList");
|
|
return dl_builder_ ? dl_builder_->Build() : nullptr;
|
|
}
|
|
|
|
} // namespace flutter
|