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

Commit 6dd1830

Browse files
committed
fuchsia: Handle multiple views in platformViews path
1 parent a316f62 commit 6dd1830

18 files changed

+529
-588
lines changed

flow/layers/fuchsia_layer_unittests.cc

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -237,28 +237,14 @@ class MockSession : public fuchsia::ui::scenic::testing::Session_TestBase {
237237
fuchsia::ui::scenic::SessionListenerPtr listener_;
238238
};
239239

240-
class MockSessionWrapper : public flutter::SessionWrapper {
241-
public:
242-
MockSessionWrapper(fuchsia::ui::scenic::SessionPtr session_ptr)
243-
: session_(std::move(session_ptr)) {}
244-
~MockSessionWrapper() override = default;
245-
246-
scenic::Session* get() override { return &session_; }
247-
void Present() override { session_.Flush(); }
248-
249-
private:
250-
scenic::Session session_;
251-
};
252-
253240
struct TestContext {
254241
// Message loop.
255242
fml::RefPtr<fml::MessageLoopFuchsia> loop;
256243
fml::RefPtr<fml::TaskRunner> task_runner;
257244

258245
// Session.
259-
fidl::InterfaceRequest<fuchsia::ui::scenic::SessionListener> listener_request;
260246
MockSession mock_session;
261-
std::unique_ptr<MockSessionWrapper> mock_session_wrapper;
247+
std::unique_ptr<scenic::Session> client_session;
262248

263249
// SceneUpdateContext.
264250
std::shared_ptr<SceneUpdateContext> scene_update_context;
@@ -280,15 +266,15 @@ std::unique_ptr<TestContext> InitTest() {
280266
// Init Session.
281267
fuchsia::ui::scenic::SessionPtr session_ptr;
282268
fuchsia::ui::scenic::SessionListenerPtr listener;
283-
context->listener_request = listener.NewRequest();
269+
auto listener_request = listener.NewRequest();
284270
context->mock_session.Bind(session_ptr.NewRequest(), std::move(listener));
285-
context->mock_session_wrapper =
286-
std::make_unique<MockSessionWrapper>(std::move(session_ptr));
271+
context->client_session = std::make_unique<scenic::Session>(
272+
std::move(session_ptr), std::move(listener_request));
287273

288274
// Init SceneUpdateContext.
289275
context->scene_update_context = std::make_shared<SceneUpdateContext>(
290-
"fuchsia_layer_unittest", fuchsia::ui::views::ViewToken(),
291-
scenic::ViewRefPair::New(), *(context->mock_session_wrapper));
276+
"fuchsia_layer_unittest", context->client_session.get(),
277+
fuchsia::ui::views::ViewToken(), scenic::ViewRefPair::New());
292278

293279
// Init PrerollContext.
294280
context->preroll_context = std::unique_ptr<PrerollContext>(new PrerollContext{
@@ -557,7 +543,7 @@ TEST_F(FuchsiaLayerTest, DISABLED_PhysicalShapeLayersAndChildSceneLayers) {
557543
// against the list above.
558544
root->UpdateScene(test_context->scene_update_context);
559545

560-
test_context->mock_session_wrapper->Present();
546+
test_context->client_session->Flush();
561547

562548
// Run loop until idle, so that the Session receives and processes
563549
// its method calls.
@@ -739,7 +725,7 @@ TEST_F(FuchsiaLayerTest, DISABLED_OpacityAndTransformLayer) {
739725
// commands against the list above.
740726
root->UpdateScene(test_context->scene_update_context);
741727

742-
test_context->mock_session_wrapper->Present();
728+
test_context->client_session->Flush();
743729

744730
// Run loop until idle, so that the Session receives and processes
745731
// its method calls.

flow/scene_update_context.cc

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,18 @@ void SetMaterialColor(scenic::Material& material,
6666
} // namespace
6767

6868
SceneUpdateContext::SceneUpdateContext(std::string debug_label,
69+
scenic::Session* session,
6970
fuchsia::ui::views::ViewToken view_token,
7071
scenic::ViewRefPair view_ref_pair,
71-
SessionWrapper& session,
7272
bool intercept_all_input)
7373
: session_(session),
74-
root_view_(session_.get(),
74+
root_view_(session_,
7575
std::move(view_token),
7676
std::move(view_ref_pair.control_ref),
7777
std::move(view_ref_pair.view_ref),
78-
debug_label),
79-
metrics_node_(session.get()),
80-
layer_tree_node_(session_.get()) {
78+
std::move(debug_label)),
79+
metrics_node_(session_),
80+
layer_tree_node_(session_) {
8181
layer_tree_node_.SetLabel("Flutter::LayerTree");
8282
metrics_node_.SetLabel("Flutter::MetricsWatcher");
8383
metrics_node_.SetEventMask(fuchsia::ui::gfx::kMetricsEventMask);
@@ -88,16 +88,14 @@ SceneUpdateContext::SceneUpdateContext(std::string debug_label,
8888
// will capture all input, and any unwanted input will be reinjected into
8989
// embedded views.
9090
if (intercept_all_input) {
91-
input_interceptor_node_.emplace(session_.get());
91+
input_interceptor_node_.emplace(session_);
9292
input_interceptor_node_->SetLabel("Flutter::InputInterceptor");
9393
input_interceptor_node_->SetHitTestBehavior(
9494
fuchsia::ui::gfx::HitTestBehavior::kDefault);
9595
input_interceptor_node_->SetSemanticVisibility(false);
9696

9797
metrics_node_.AddChild(input_interceptor_node_.value());
9898
}
99-
100-
session_.Present();
10199
}
102100

103101
std::vector<SceneUpdateContext::PaintTask> SceneUpdateContext::GetPaintTasks() {
@@ -109,7 +107,7 @@ std::vector<SceneUpdateContext::PaintTask> SceneUpdateContext::GetPaintTasks() {
109107
}
110108

111109
void SceneUpdateContext::EnableWireframe(bool enable) {
112-
session_.get()->Enqueue(
110+
session_->Enqueue(
113111
scenic::NewSetEnableDebugViewBoundsCmd(root_view_.id(), enable));
114112
}
115113

@@ -132,8 +130,8 @@ void SceneUpdateContext::Reset(const SkISize& frame_size,
132130
// TODO(fxb/): Don't hardcode elevation.
133131
input_interceptor_node_->SetTranslation(frame_size.width() * 0.5f,
134132
frame_size.height() * 0.5f, -100.f);
135-
input_interceptor_node_->SetShape(scenic::Rectangle(
136-
session_.get(), frame_size.width(), frame_size.height()));
133+
input_interceptor_node_->SetShape(
134+
scenic::Rectangle(session_, frame_size.width(), frame_size.height()));
137135
}
138136

139137
// We are going to be sending down a fresh node hierarchy every frame. So just
@@ -156,8 +154,8 @@ void SceneUpdateContext::CreateFrame(scenic::EntityNode& entity_node,
156154
SetEntityNodeClipPlanes(entity_node, shape_bounds);
157155

158156
// TODO(SCN-137): Need to be able to express the radii as vectors.
159-
scenic::ShapeNode shape_node(session_.get());
160-
scenic::Rectangle shape(session_.get(), rrect.width(), rrect.height());
157+
scenic::ShapeNode shape_node(session_);
158+
scenic::Rectangle shape(session_, rrect.width(), rrect.height());
161159
shape_node.SetShape(shape);
162160
shape_node.SetTranslation(shape_bounds.width() * 0.5f + shape_bounds.left(),
163161
shape_bounds.height() * 0.5f + shape_bounds.top(),
@@ -167,7 +165,7 @@ void SceneUpdateContext::CreateFrame(scenic::EntityNode& entity_node,
167165
if (paint_bounds.isEmpty() || !paint_bounds.intersects(shape_bounds))
168166
paint_layers.clear();
169167

170-
scenic::Material material(session_.get());
168+
scenic::Material material(session_);
171169
shape_node.SetMaterial(material);
172170
entity_node.AddChild(shape_node);
173171

@@ -214,9 +212,8 @@ void SceneUpdateContext::UpdateView(int64_t view_id,
214212
bool hit_testable = override_hit_testable.has_value()
215213
? *override_hit_testable
216214
: view_holder->hit_testable();
217-
view_holder->UpdateScene(session_.get(), top_entity_->embedder_node(), offset,
218-
size, SkScalarRoundToInt(alphaf() * 255),
219-
hit_testable);
215+
view_holder->UpdateScene(session_, top_entity_->embedder_node(), offset, size,
216+
SkScalarRoundToInt(alphaf() * 255), hit_testable);
220217

221218
// Assume embedded views are 10 "layers" wide.
222219
next_elevation_ += 10 * kScenicZElevationBetweenLayers;
@@ -257,7 +254,7 @@ void SceneUpdateContext::DestroyView(int64_t view_id) {
257254
SceneUpdateContext::Entity::Entity(std::shared_ptr<SceneUpdateContext> context)
258255
: context_(context),
259256
previous_entity_(context->top_entity_),
260-
entity_node_(context->session_.get()) {
257+
entity_node_(context->session_) {
261258
context->top_entity_ = this;
262259
}
263260

@@ -338,7 +335,7 @@ SceneUpdateContext::Frame::Frame(std::shared_ptr<SceneUpdateContext> context,
338335
rrect_(rrect),
339336
color_(color),
340337
opacity_(opacity),
341-
opacity_node_(context->session_.get()),
338+
opacity_node_(context->session_),
342339
paint_bounds_(SkRect::MakeEmpty()) {
343340
// Increment elevation trackers before calculating any local elevation.
344341
// |UpdateView| can modify context->next_elevation_, which is why it is

flow/scene_update_context.h

Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
#include <set>
1616
#include <vector>
1717

18-
#include "flutter/flow/embedded_views.h"
1918
#include "flutter/fml/logging.h"
2019
#include "flutter/fml/macros.h"
20+
#include "third_party/skia/include/core/SkRRect.h"
2121
#include "third_party/skia/include/core/SkRect.h"
2222
#include "third_party/skia/include/core/SkSurface.h"
2323

@@ -34,15 +34,7 @@ constexpr float kOneMinusEpsilon = 1 - FLT_EPSILON;
3434
// How much layers are separated in Scenic z elevation.
3535
constexpr float kScenicZElevationBetweenLayers = 10.f;
3636

37-
class SessionWrapper {
38-
public:
39-
virtual ~SessionWrapper() {}
40-
41-
virtual scenic::Session* get() = 0;
42-
virtual void Present() = 0;
43-
};
44-
45-
class SceneUpdateContext : public flutter::ExternalViewEmbedder {
37+
class SceneUpdateContext {
4638
public:
4739
class Entity {
4840
public:
@@ -120,9 +112,9 @@ class SceneUpdateContext : public flutter::ExternalViewEmbedder {
120112
};
121113

122114
SceneUpdateContext(std::string debug_label,
115+
scenic::Session* session,
123116
fuchsia::ui::views::ViewToken view_token,
124117
scenic::ViewRefPair view_ref_pair,
125-
SessionWrapper& session,
126118
bool intercept_all_input = false);
127119
~SceneUpdateContext() = default;
128120

@@ -139,34 +131,7 @@ class SceneUpdateContext : public flutter::ExternalViewEmbedder {
139131
// Reset state for a new frame.
140132
void Reset(const SkISize& frame_size, float device_pixel_ratio);
141133

142-
// |ExternalViewEmbedder|
143-
SkCanvas* GetRootCanvas() override { return nullptr; }
144-
145-
// |ExternalViewEmbedder|
146-
void CancelFrame() override {}
147-
148-
// |ExternalViewEmbedder|
149-
void BeginFrame(
150-
SkISize frame_size,
151-
GrDirectContext* context,
152-
double device_pixel_ratio,
153-
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override {}
154-
155-
// |ExternalViewEmbedder|
156-
void PrerollCompositeEmbeddedView(
157-
int view_id,
158-
std::unique_ptr<EmbeddedViewParams> params) override {}
159-
160-
// |ExternalViewEmbedder|
161-
std::vector<SkCanvas*> GetCurrentCanvases() override {
162-
return std::vector<SkCanvas*>();
163-
}
164-
165-
// |ExternalViewEmbedder|
166-
virtual SkCanvas* CompositeEmbeddedView(int view_id) override {
167-
return nullptr;
168-
}
169-
134+
// View manipulation.
170135
void CreateView(int64_t view_id, bool hit_testable, bool focusable);
171136
void UpdateView(int64_t view_id, bool hit_testable, bool focusable);
172137
void DestroyView(int64_t view_id);
@@ -183,7 +148,7 @@ class SceneUpdateContext : public flutter::ExternalViewEmbedder {
183148
const SkRect& paint_bounds,
184149
std::vector<Layer*> paint_layers);
185150

186-
SessionWrapper& session_;
151+
scenic::Session* session_;
187152

188153
scenic::View root_view_;
189154
scenic::EntityNode metrics_node_;

shell/platform/fuchsia/BUILD.gn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,5 @@ group("fuchsia") {
8787
group("tests") {
8888
testonly = true
8989

90-
deps = [ "flutter:tests" ]
90+
#deps = [ "flutter:tests" ]
9191
}

shell/platform/fuchsia/flutter/compositor_context.cc

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,36 @@
44

55
#include "compositor_context.h"
66

7-
#include <algorithm>
7+
#include <algorithm> // For std::clamp
88
#include <vector>
99

1010
#include "flutter/flow/layers/layer_tree.h"
11-
#include "third_party/skia/include/gpu/GrDirectContext.h"
1211

1312
namespace flutter_runner {
1413

1514
class ScopedFrame final : public flutter::CompositorContext::ScopedFrame {
1615
public:
17-
ScopedFrame(CompositorContext& context,
18-
GrDirectContext* gr_context,
19-
SkCanvas* canvas,
20-
flutter::ExternalViewEmbedder* view_embedder,
21-
const SkMatrix& root_surface_transformation,
22-
bool instrumentation_enabled,
23-
bool surface_supports_readback,
24-
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger,
25-
SessionConnection& session_connection,
26-
VulkanSurfaceProducer& surface_producer,
27-
std::shared_ptr<flutter::SceneUpdateContext> scene_update_context)
28-
: flutter::CompositorContext::ScopedFrame(context,
29-
surface_producer.gr_context(),
30-
canvas,
31-
view_embedder,
32-
root_surface_transformation,
33-
instrumentation_enabled,
34-
surface_supports_readback,
35-
raster_thread_merger),
36-
session_connection_(session_connection),
37-
surface_producer_(surface_producer),
38-
scene_update_context_(scene_update_context) {}
16+
ScopedFrame(
17+
CompositorContext& context,
18+
std::shared_ptr<FuchsiaExternalViewEmbedder> external_view_embedder,
19+
SkCanvas* canvas,
20+
const SkMatrix& root_surface_transformation,
21+
bool instrumentation_enabled,
22+
bool surface_supports_readback,
23+
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger)
24+
: flutter::CompositorContext::ScopedFrame(
25+
context,
26+
external_view_embedder->gr_context(),
27+
canvas,
28+
external_view_embedder.get(),
29+
root_surface_transformation,
30+
instrumentation_enabled,
31+
surface_supports_readback,
32+
raster_thread_merger),
33+
external_view_embedder_(external_view_embedder) {}
3934

4035
private:
41-
SessionConnection& session_connection_;
42-
VulkanSurfaceProducer& surface_producer_;
43-
std::shared_ptr<flutter::SceneUpdateContext> scene_update_context_;
36+
std::shared_ptr<FuchsiaExternalViewEmbedder> external_view_embedder_;
4437

4538
flutter::RasterStatus Raster(flutter::LayerTree& layer_tree,
4639
bool ignore_raster_cache) override {
@@ -149,12 +142,8 @@ class ScopedFrame final : public flutter::CompositorContext::ScopedFrame {
149142
};
150143

151144
CompositorContext::CompositorContext(
152-
SessionConnection& session_connection,
153-
VulkanSurfaceProducer& surface_producer,
154-
std::shared_ptr<flutter::SceneUpdateContext> scene_update_context)
155-
: session_connection_(session_connection),
156-
surface_producer_(surface_producer),
157-
scene_update_context_(scene_update_context) {}
145+
std::shared_ptr<FuchsiaExternalViewEmbedder> external_view_embedder)
146+
: external_view_embedder_(external_view_embedder) {}
158147

159148
CompositorContext::~CompositorContext() = default;
160149

@@ -167,10 +156,11 @@ CompositorContext::AcquireFrame(
167156
bool instrumentation_enabled,
168157
bool surface_supports_readback,
169158
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
159+
FML_DCHECK(view_embedder == external_view_embedder_.get());
160+
FML_DCHECK(gr_context == external_view_embedder_->gr_context());
170161
return std::make_unique<flutter_runner::ScopedFrame>(
171-
*this, gr_context, canvas, view_embedder, root_surface_transformation,
172-
instrumentation_enabled, surface_supports_readback, raster_thread_merger,
173-
session_connection_, surface_producer_, scene_update_context_);
162+
*this, external_view_embedder_, canvas, root_surface_transformation,
163+
instrumentation_enabled, surface_supports_readback, raster_thread_merger);
174164
}
175165

176166
} // namespace flutter_runner

0 commit comments

Comments
 (0)