Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 143f60f

Browse files
author
Emmanuel Garcia
committed
Pass SurfaceFrame to SubmitFrame
1 parent 4d78121 commit 143f60f

21 files changed

+178
-156
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,8 @@ FILE: ../../../flutter/shell/common/skia_event_tracer_impl.cc
616616
FILE: ../../../flutter/shell/common/skia_event_tracer_impl.h
617617
FILE: ../../../flutter/shell/common/surface.cc
618618
FILE: ../../../flutter/shell/common/surface.h
619+
FILE: ../../../flutter/shell/common/surface_frame.cc
620+
FILE: ../../../flutter/shell/common/surface_frame.h
619621
FILE: ../../../flutter/shell/common/switches.cc
620622
FILE: ../../../flutter/shell/common/switches.h
621623
FILE: ../../../flutter/shell/common/thread_host.cc

flow/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ source_set("flow") {
7373
deps = [
7474
"//flutter/common",
7575
"//flutter/fml",
76+
"//flutter/shell/common:surface_frame",
7677
"//third_party/skia",
7778
]
7879

flow/embedded_views.cc

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,10 @@
77
namespace flutter {
88

99
bool ExternalViewEmbedder::SubmitFrame(GrContext* context,
10-
SkCanvas* background_canvas) {
11-
return false;
10+
std::unique_ptr<SurfaceFrame> frame) {
11+
return frame->Submit();
1212
};
1313

14-
void ExternalViewEmbedder::FinishFrame(){};
15-
1614
void MutatorsStack::PushClipRect(const SkRect& rect) {
1715
std::shared_ptr<Mutator> element = std::make_shared<Mutator>(rect);
1816
vector_.push_back(element);

flow/embedded_views.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "flutter/fml/memory/ref_counted.h"
1111
#include "flutter/fml/raster_thread_merger.h"
12+
#include "flutter/shell/common/surface_frame.h"
1213
#include "third_party/skia/include/core/SkCanvas.h"
1314
#include "third_party/skia/include/core/SkPath.h"
1415
#include "third_party/skia/include/core/SkPoint.h"
@@ -248,10 +249,13 @@ class ExternalViewEmbedder {
248249
// Must be called on the UI thread.
249250
virtual SkCanvas* CompositeEmbeddedView(int view_id) = 0;
250251

251-
virtual bool SubmitFrame(GrContext* context, SkCanvas* background_canvas);
252-
253-
// This is called after submitting the embedder frame and the surface frame.
254-
virtual void FinishFrame();
252+
// Submits the frame by calling frame.Submit().
253+
//
254+
// This method can mutate the root Skia canvas before submitting the frame.
255+
//
256+
// It can also allocate frames for overlay surfaces to compose hybrid views.
257+
virtual bool SubmitFrame(GrContext* context,
258+
std::unique_ptr<SurfaceFrame> frame);
255259

256260
// This should only be called after |SubmitFrame|.
257261
// This method provides the embedder a way to do additional tasks after

shell/common/BUILD.gn

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ source_set("common") {
120120
]
121121

122122
deps = [
123+
":surface_frame",
123124
"//flutter/assets",
124125
"//flutter/common",
125126
"//flutter/flow",
@@ -141,6 +142,18 @@ source_set("common") {
141142
public_configs = [ "//flutter:config" ]
142143
}
143144

145+
source_set("surface_frame") {
146+
sources = [
147+
"surface_frame.cc",
148+
"surface_frame.h",
149+
]
150+
151+
deps = [
152+
"//flutter/fml",
153+
"//third_party/skia",
154+
]
155+
}
156+
144157
template("shell_host_executable") {
145158
executable(target_name) {
146159
testonly = true

shell/common/rasterizer.cc

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -421,14 +421,11 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) {
421421
return raster_status;
422422
}
423423
if (external_view_embedder != nullptr) {
424+
FML_DCHECK(!frame->IsSubmitted());
424425
external_view_embedder->SubmitFrame(surface_->GetContext(),
425-
root_surface_canvas);
426-
// The external view embedder may mutate the root surface canvas while
427-
// submitting the frame.
428-
// Therefore, submit the final frame after asking the external view
429-
// embedder to submit the frame.
430-
frame->Submit();
431-
external_view_embedder->FinishFrame();
426+
std::move(frame));
427+
// The frame must be submitted at this point.
428+
FML_DCHECK(frame->IsSubmitted());
432429
} else {
433430
frame->Submit();
434431
}

shell/common/shell_test_external_view_embedder.cc

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,12 @@ SkCanvas* ShellTestExternalViewEmbedder::CompositeEmbeddedView(int view_id) {
3333
}
3434

3535
// |ExternalViewEmbedder|
36-
bool ShellTestExternalViewEmbedder::SubmitFrame(GrContext* context,
37-
SkCanvas* background_canvas) {
38-
return true;
36+
bool ShellTestExternalViewEmbedder::SubmitFrame(
37+
GrContext* context,
38+
std::unique_ptr<SurfaceFrame> frame) {
39+
return frame->Submit();
3940
}
4041

41-
// |ExternalViewEmbedder|
42-
void ShellTestExternalViewEmbedder::FinishFrame() {}
43-
4442
// |ExternalViewEmbedder|
4543
void ShellTestExternalViewEmbedder::EndFrame(
4644
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {

shell/common/shell_test_external_view_embedder.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,8 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder {
4949
SkCanvas* CompositeEmbeddedView(int view_id) override;
5050

5151
// |ExternalViewEmbedder|
52-
bool SubmitFrame(GrContext* context, SkCanvas* background_canvas) override;
53-
54-
// |ExternalViewEmbedder|
55-
void FinishFrame() override;
52+
bool SubmitFrame(GrContext* context,
53+
std::unique_ptr<SurfaceFrame> frame) override;
5654

5755
// |ExternalViewEmbedder|
5856
void EndFrame(

shell/common/surface.cc

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,58 +4,8 @@
44

55
#include "flutter/shell/common/surface.h"
66

7-
#include "flutter/fml/logging.h"
8-
#include "third_party/skia/include/core/SkSurface.h"
9-
107
namespace flutter {
118

12-
SurfaceFrame::SurfaceFrame(sk_sp<SkSurface> surface,
13-
bool supports_readback,
14-
const SubmitCallback& submit_callback)
15-
: submitted_(false),
16-
surface_(surface),
17-
supports_readback_(supports_readback),
18-
submit_callback_(submit_callback) {
19-
FML_DCHECK(submit_callback_);
20-
}
21-
22-
SurfaceFrame::~SurfaceFrame() {
23-
if (submit_callback_ && !submitted_) {
24-
// Dropping without a Submit.
25-
submit_callback_(*this, nullptr);
26-
}
27-
}
28-
29-
bool SurfaceFrame::Submit() {
30-
if (submitted_) {
31-
return false;
32-
}
33-
34-
submitted_ = PerformSubmit();
35-
36-
return submitted_;
37-
}
38-
39-
SkCanvas* SurfaceFrame::SkiaCanvas() {
40-
return surface_ != nullptr ? surface_->getCanvas() : nullptr;
41-
}
42-
43-
sk_sp<SkSurface> SurfaceFrame::SkiaSurface() const {
44-
return surface_;
45-
}
46-
47-
bool SurfaceFrame::PerformSubmit() {
48-
if (submit_callback_ == nullptr) {
49-
return false;
50-
}
51-
52-
if (submit_callback_(*this, SkiaCanvas())) {
53-
return true;
54-
}
55-
56-
return false;
57-
}
58-
599
Surface::Surface() = default;
6010

6111
Surface::~Surface() = default;

shell/common/surface.h

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,10 @@
1010
#include "flutter/flow/compositor_context.h"
1111
#include "flutter/flow/embedded_views.h"
1212
#include "flutter/fml/macros.h"
13-
#include "third_party/skia/include/core/SkCanvas.h"
13+
#include "flutter/shell/common/surface_frame.h"
1414

1515
namespace flutter {
1616

17-
/// Represents a Frame that has been fully configured for the underlying client
18-
/// rendering API. A frame may only be submitted once.
19-
class SurfaceFrame {
20-
public:
21-
using SubmitCallback =
22-
std::function<bool(const SurfaceFrame& surface_frame, SkCanvas* canvas)>;
23-
24-
SurfaceFrame(sk_sp<SkSurface> surface,
25-
bool supports_readback,
26-
const SubmitCallback& submit_callback);
27-
28-
~SurfaceFrame();
29-
30-
bool Submit();
31-
32-
SkCanvas* SkiaCanvas();
33-
34-
sk_sp<SkSurface> SkiaSurface() const;
35-
36-
bool supports_readback() { return supports_readback_; }
37-
38-
private:
39-
bool submitted_;
40-
sk_sp<SkSurface> surface_;
41-
bool supports_readback_;
42-
SubmitCallback submit_callback_;
43-
44-
bool PerformSubmit();
45-
46-
FML_DISALLOW_COPY_AND_ASSIGN(SurfaceFrame);
47-
};
48-
4917
/// Abstract Base Class that represents where we will be rendering content.
5018
class Surface {
5119
public:

0 commit comments

Comments
 (0)