Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
324cc1c
Cleanup impl
dkwingsmt Nov 2, 2023
c7d5022
Format
dkwingsmt Nov 3, 2023
ec459ab
Merge remote-tracking branch 'origin/main' into mv-raster-multiview
dkwingsmt Nov 6, 2023
da8694e
Fix lint
dkwingsmt Nov 6, 2023
a715ed5
Add doc
dkwingsmt Nov 6, 2023
f483d8c
Add a test
dkwingsmt Nov 7, 2023
0d2be4e
Format
dkwingsmt Nov 7, 2023
89eceb1
Add TODO
dkwingsmt Nov 9, 2023
109cdea
Merge remote-tracking branch 'origin/main' into mv-raster-multiview
dkwingsmt Nov 9, 2023
90107b5
Merge branch 'main' into mv-raster-multiview
dkwingsmt Nov 13, 2023
0260384
Merge remote-tracking branch 'origin/main' into mv-raster-multiview
dkwingsmt Nov 17, 2023
b6431b5
Merge remote-tracking branch 'dkwingsmt/mv-raster-multiview' into mv-…
dkwingsmt Nov 17, 2023
cadb2f3
Compile
dkwingsmt Nov 17, 2023
cba9869
fuchsia compile
dkwingsmt Nov 17, 2023
17293b0
Fix fuchsia compile
dkwingsmt Nov 17, 2023
d4aeba7
Fuchsia compile
dkwingsmt Nov 17, 2023
94cff61
Explain the two IDs
dkwingsmt Nov 21, 2023
068793b
Prepare/SubmitFlutterView
dkwingsmt Nov 21, 2023
18ee8b3
Merge remote-tracking branch 'origin/main' into mv-raster-multiview
dkwingsmt Nov 27, 2023
de5f205
Fix lint error
dkwingsmt Nov 27, 2023
559a043
Fix fuchsia
dkwingsmt Nov 27, 2023
86af1c4
Merge branch 'main' into mv-raster-multiview
dkwingsmt Nov 27, 2023
dfeae47
Merge branch 'main' into mv-raster-multiview
dkwingsmt Nov 28, 2023
973a85d
Merge remote-tracking branch 'origin/main' into mv-raster-multiview
dkwingsmt Dec 4, 2023
5ad5661
ignore deprecated member on hashvalues
dkwingsmt Dec 4, 2023
830ad4c
Remove empty trace
dkwingsmt Dec 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions flow/embedded_views.cc
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,19 @@ bool DisplayListEmbedderViewSlice::recording_ended() {
return builder_ == nullptr;
}

void ExternalViewEmbedder::SubmitFrame(
void ExternalViewEmbedder::SubmitFlutterView(
GrDirectContext* context,
const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<SurfaceFrame> frame) {
frame->Submit();
}

bool ExternalViewEmbedder::SupportsDynamicThreadMerging() {
return false;
}

void ExternalViewEmbedder::Teardown() {}

void MutatorsStack::PushClipRect(const SkRect& rect) {
std::shared_ptr<Mutator> element = std::make_shared<Mutator>(rect);
vector_.push_back(element);
Expand Down Expand Up @@ -112,10 +118,4 @@ const std::vector<std::shared_ptr<Mutator>>::const_iterator MutatorsStack::End()
return vector_.end();
}

bool ExternalViewEmbedder::SupportsDynamicThreadMerging() {
return false;
}

void ExternalViewEmbedder::Teardown() {}

} // namespace flutter
40 changes: 33 additions & 7 deletions flow/embedded_views.h
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,29 @@ class DisplayListEmbedderViewSlice : public EmbedderViewSlice {
//
// Used on iOS, Android (hybrid composite mode), and on embedded platforms
// that provide a system compositor as part of the project arguments.
//
// There are two kinds of "view IDs" in the context of ExternalViewEmbedder, and
// specific names are used to avoid ambiguation:
//
// * ExternalViewEmbedder composites a stack of layers. Each layer's content
// might be from Flutter widgets, or a platform view, which displays platform
// native components. Each platform view is labeled by a view ID, which
// corresponds to the ID from `PlatformViewsRegistry.getNextPlatformViewId`
// from the framework. In the context of `ExternalViewEmbedder`, this ID is
// called platform_view_id.
// * The layers are compositied into a single rectangular surface, displayed by
// taking up an entire native window or part of a window. Each such surface
// is labeled by a view ID, which corresponds to `FlutterView.viewID` from
// dart:ui. In the context of `ExternalViewEmbedder`, this ID is called
// flutter_view_id.
//
// The lifecycle of drawing a frame using ExternalViewEmbedder is:
//
// 1. At the start of a frame, call |BeginFrame|, then |SetUsedThisFrame| to
// true.
// 2. For each view to be drawn, call |PrepareFlutterView|, then
// |SubmitFlutterView|.
// 3. At the end of a frame, if |GetUsedThisFrame| is true, call |EndFrame|.
class ExternalViewEmbedder {
// TODO(cyanglaz): Make embedder own the `EmbeddedViewParams`.

Expand All @@ -383,7 +406,7 @@ class ExternalViewEmbedder {
// from the on-screen render target.
virtual DlCanvas* GetRootCanvas() = 0;

// Call this in-lieu of |SubmitFrame| to clear pre-roll state and
// Call this in-lieu of |SubmitFlutterView| to clear pre-roll state and
// sets the stage for the next pre-roll.
virtual void CancelFrame() = 0;

Expand All @@ -392,13 +415,11 @@ class ExternalViewEmbedder {
// The `raster_thread_merger` will be null if |SupportsDynamicThreadMerging|
// returns false.
virtual void BeginFrame(
SkISize frame_size,
GrDirectContext* context,
double device_pixel_ratio,
const fml::RefPtr<fml::RasterThreadMerger>& raster_thread_merger) = 0;

virtual void PrerollCompositeEmbeddedView(
int64_t view_id,
int64_t platform_view_id,
std::unique_ptr<EmbeddedViewParams> params) = 0;

// This needs to get called after |Preroll| finishes on the layer tree.
Expand All @@ -411,14 +432,19 @@ class ExternalViewEmbedder {
}

// Must be called on the UI thread.
virtual DlCanvas* CompositeEmbeddedView(int64_t view_id) = 0;
virtual DlCanvas* CompositeEmbeddedView(int64_t platform_view_id) = 0;

// Prepare for a view to be drawn.
virtual void PrepareFlutterView(int64_t flutter_view_id,
SkISize frame_size,
double device_pixel_ratio) = 0;

// Implementers must submit the frame by calling frame.Submit().
//
// This method can mutate the root Skia canvas before submitting the frame.
//
// It can also allocate frames for overlay surfaces to compose hybrid views.
virtual void SubmitFrame(
virtual void SubmitFlutterView(
GrDirectContext* context,
const std::shared_ptr<impeller::AiksContext>& aiks_context,
std::unique_ptr<SurfaceFrame> frame);
Expand Down Expand Up @@ -462,7 +488,7 @@ class ExternalViewEmbedder {

// Pushes the platform view id of a visited platform view to a list of
// visited platform views.
virtual void PushVisitedPlatformView(int64_t view_id) {}
virtual void PushVisitedPlatformView(int64_t platform_view_id) {}

// Pushes a DlImageFilter object to each platform view within a list of
// visited platform views.
Expand Down
7 changes: 5 additions & 2 deletions flow/testing/mock_embedder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,14 @@ void MockViewEmbedder::CancelFrame() {}

// |ExternalViewEmbedder|
void MockViewEmbedder::BeginFrame(
SkISize frame_size,
GrDirectContext* context,
double device_pixel_ratio,
const fml::RefPtr<fml::RasterThreadMerger>& raster_thread_merger) {}

// |ExternalViewEmbedder|
void MockViewEmbedder::PrepareFlutterView(int64_t flutter_view_id,
SkISize frame_size,
double device_pixel_ratio) {}

// |ExternalViewEmbedder|
void MockViewEmbedder::PrerollCompositeEmbeddedView(
int64_t view_id,
Expand Down
9 changes: 6 additions & 3 deletions flow/testing/mock_embedder.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,15 @@ class MockViewEmbedder : public ExternalViewEmbedder {
void CancelFrame() override;

// |ExternalViewEmbedder|
void BeginFrame(SkISize frame_size,
GrDirectContext* context,
double device_pixel_ratio,
void BeginFrame(GrDirectContext* context,
const fml::RefPtr<fml::RasterThreadMerger>&
raster_thread_merger) override;

// |ExternalViewEmbedder|
void PrepareFlutterView(int64_t flutter_view_id,
SkISize frame_size,
double device_pixel_ratio) override;

// |ExternalViewEmbedder|
void PrerollCompositeEmbeddedView(
int64_t view_id,
Expand Down
4 changes: 4 additions & 0 deletions lib/web_ui/test/engine/hash_codes_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ void main() {
internalBootstrapBrowserTest(() => testMain);
}

// Ignoring the deprecated member use because we're specifically testing
// deprecated API.
// ignore: deprecated_member_use

void testMain() {
test('hashValues and hashList can hash lots of huge values effectively', () {
final int hashValueFromArgs = hashValues(
Expand Down
20 changes: 6 additions & 14 deletions shell/common/rasterizer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -562,13 +562,6 @@ Rasterizer::DoDrawResult Rasterizer::DrawToSurfaces(
std::unique_ptr<FrameItem> Rasterizer::DrawToSurfacesUnsafe(
FrameTimingsRecorder& frame_timings_recorder,
std::vector<std::unique_ptr<LayerTreeTask>> tasks) {
// TODO(dkwingsmt): The rasterizer only supports rendering a single view
// and that view must be the implicit view. Properly support multi-view
// in the future.
// See https://github.com/flutter/flutter/issues/135530, item 2 & 4.
FML_CHECK(tasks.size() == 1u) << "Unexpected size of " << tasks.size();
FML_DCHECK(tasks.front()->view_id == kFlutterImplicitViewId);

compositor_context_->ui_time().SetLapTime(
frame_timings_recorder.GetBuildDuration());

Expand All @@ -593,11 +586,8 @@ std::unique_ptr<FrameItem> Rasterizer::DrawToSurfacesUnsafe(
if (external_view_embedder_) {
FML_DCHECK(!external_view_embedder_->GetUsedThisFrame());
external_view_embedder_->SetUsedThisFrame(true);
external_view_embedder_->BeginFrame(
// TODO(dkwingsmt): Add all views here.
// See https://github.com/flutter/flutter/issues/135530, item 4.
tasks.front()->layer_tree->frame_size(), surface_->GetContext(),
tasks.front()->device_pixel_ratio, raster_thread_merger_);
external_view_embedder_->BeginFrame(surface_->GetContext(),
raster_thread_merger_);
}

std::optional<fml::TimePoint> presentation_time = std::nullopt;
Expand Down Expand Up @@ -664,6 +654,8 @@ DrawSurfaceStatus Rasterizer::DrawToSurfaceUnsafe(

DlCanvas* embedder_root_canvas = nullptr;
if (external_view_embedder_) {
external_view_embedder_->PrepareFlutterView(
view_id, layer_tree.frame_size(), device_pixel_ratio);
// TODO(dkwingsmt): Add view ID here.
embedder_root_canvas = external_view_embedder_->GetRootCanvas();
}
Expand Down Expand Up @@ -704,7 +696,7 @@ DrawSurfaceStatus Rasterizer::DrawToSurfaceUnsafe(
// for accurate performance metrics.
if (frame->framebuffer_info().supports_partial_repaint &&
!layer_tree.is_leaf_layer_tracing_enabled()) {
// Disable partial repaint if external_view_embedder_ SubmitFrame is
// Disable partial repaint if external_view_embedder_ SubmitFlutterView is
// involved - ExternalViewEmbedder unconditionally clears the entire
// surface and also partial repaint with platform view present is
// something that still need to be figured out.
Expand Down Expand Up @@ -750,7 +742,7 @@ DrawSurfaceStatus Rasterizer::DrawToSurfaceUnsafe(
if (external_view_embedder_ &&
(!raster_thread_merger_ || raster_thread_merger_->IsMerged())) {
FML_DCHECK(!frame->IsSubmitted());
external_view_embedder_->SubmitFrame(
external_view_embedder_->SubmitFlutterView(
surface_->GetContext(), surface_->GetAiksContext(), std::move(frame));
} else {
frame->Submit();
Expand Down
Loading