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#include "flutter/flow/surface_frame.h"
6
7#include <limits>
8#include <utility>
9
10#include "flutter/fml/logging.h"
11#include "flutter/fml/trace_event.h"
12
13#include "third_party/skia/include/core/SkSurface.h"
14#include "third_party/skia/include/utils/SkNWayCanvas.h"
15
16namespace flutter {
17
18SurfaceFrame::SurfaceFrame(sk_sp<SkSurface> surface,
19 FramebufferInfo framebuffer_info,
20 const SubmitCallback& submit_callback,
21 SkISize frame_size,
22 std::unique_ptr<GLContextResult> context_result,
23 bool display_list_fallback)
24 : surface_(std::move(surface)),
25 framebuffer_info_(framebuffer_info),
26 submit_callback_(submit_callback),
27 context_result_(std::move(context_result)) {
28 FML_DCHECK(submit_callback_);
29 if (surface_) {
30 adapter_.set_canvas(surface_->getCanvas());
31 canvas_ = &adapter_;
32 } else if (display_list_fallback) {
33 FML_DCHECK(!frame_size.isEmpty());
34 dl_builder_ =
35 sk_make_sp<DisplayListBuilder>(args: SkRect::Make(size: frame_size), args: true);
36 canvas_ = dl_builder_.get();
37 }
38}
39
40bool SurfaceFrame::Submit() {
41 TRACE_EVENT0("flutter", "SurfaceFrame::Submit");
42 if (submitted_) {
43 return false;
44 }
45
46 submitted_ = PerformSubmit();
47
48 return submitted_;
49}
50
51bool SurfaceFrame::IsSubmitted() const {
52 return submitted_;
53}
54
55DlCanvas* SurfaceFrame::Canvas() {
56 return canvas_;
57}
58
59sk_sp<SkSurface> SurfaceFrame::SkiaSurface() const {
60 return surface_;
61}
62
63bool SurfaceFrame::PerformSubmit() {
64 if (submit_callback_ == nullptr) {
65 return false;
66 }
67
68 if (submit_callback_(*this, Canvas())) {
69 return true;
70 }
71
72 return false;
73}
74
75sk_sp<DisplayList> SurfaceFrame::BuildDisplayList() {
76 TRACE_EVENT0("impeller", "SurfaceFrame::BuildDisplayList");
77 return dl_builder_ ? dl_builder_->Build() : nullptr;
78}
79
80} // namespace flutter
81

source code of flutter_engine/flutter/flow/surface_frame.cc