Skip to content

Commit 88bce57

Browse files
Move SceneBuilder and Platform View code out of CanvasKit
Fix commits that are a result of bad merge Trigger rebuild Unify web renderers Refactor debug JSON helpers. Make _kickRenderLoop use a while loop remove unused import
1 parent e2d717c commit 88bce57

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+385
-3727
lines changed

dev/benchmarks/macrobenchmarks/lib/src/web/bench_mouse_region_grid_hover.dart

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ class BenchMouseRegionGridHover extends WidgetRecorder {
4242
late _Tester _tester;
4343

4444
void handleDataPoint(Duration duration) {
45-
profile!.addDataPoint('hitTestDuration', duration, reported: true);
45+
if (profile != null) {
46+
profile!.addDataPoint('hitTestDuration', duration, reported: true);
47+
}
4648
}
4749

4850
// Use a non-trivial border to force Web to switch painter
@@ -71,6 +73,11 @@ class BenchMouseRegionGridHover extends WidgetRecorder {
7173
super.frameDidDraw();
7274
}
7375

76+
@override
77+
Future<void> tearDown() async {
78+
await _tester.finished;
79+
}
80+
7481
@override
7582
Widget createWidget() {
7683
const int rowsCount = 60;
@@ -136,6 +143,8 @@ class _Tester {
136143
static const Duration hoverDuration = Duration(milliseconds: 20);
137144

138145
bool _stopped = false;
146+
final Completer<void> _finished = Completer<void>();
147+
Future<void> get finished => _finished.future;
139148

140149
TestGesture get gesture {
141150
return _gesture ??= TestGesture(
@@ -167,6 +176,7 @@ class _Tester {
167176
await _hoverTo(const Offset(370, 390), hoverDuration);
168177
await _hoverTo(const Offset(390, 30), hoverDuration);
169178
}
179+
_finished.complete();
170180
}
171181

172182
void stop() {

dev/benchmarks/macrobenchmarks/lib/src/web/bench_mouse_region_mixed_grid_hover.dart

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ class BenchMouseRegionMixedGridHover extends WidgetRecorder {
5858
late _Tester _tester;
5959

6060
void handleDataPoint(Duration duration) {
61-
profile!.addDataPoint('hitTestDuration', duration, reported: true);
61+
if (profile != null) {
62+
profile!.addDataPoint('hitTestDuration', duration, reported: true);
63+
}
6264
}
6365

6466
// Use a non-trivial border to force Web to switch painter
@@ -87,6 +89,11 @@ class BenchMouseRegionMixedGridHover extends WidgetRecorder {
8789
super.frameDidDraw();
8890
}
8991

92+
@override
93+
Future<void> tearDown() async {
94+
await _tester.finished;
95+
}
96+
9097
@override
9198
Widget createWidget() {
9299
const int rowsCount = 60;
@@ -157,6 +164,8 @@ class _Tester {
157164
static const Duration hoverDuration = Duration(milliseconds: 20);
158165

159166
bool _stopped = false;
167+
final Completer<void> _finished = Completer<void>();
168+
Future<void> get finished => _finished.future;
160169

161170
TestGesture get gesture {
162171
return _gesture ??= TestGesture(
@@ -188,6 +197,7 @@ class _Tester {
188197
await _hoverTo(const Offset(370, 390), hoverDuration);
189198
await _hoverTo(const Offset(390, 30), hoverDuration);
190199
}
200+
_finished.complete();
191201
}
192202

193203
void stop() {

engine/src/flutter/lib/web_ui/lib/src/engine.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,19 +74,18 @@ export 'engine/layer/layer_scene_builder.dart';
7474
export 'engine/layer/layer_tree.dart';
7575
export 'engine/layer/layer_visitor.dart';
7676
export 'engine/layer/n_way_canvas.dart';
77-
export 'engine/layers.dart';
7877
export 'engine/lazy_path.dart';
7978
export 'engine/mouse/context_menu.dart';
8079
export 'engine/mouse/cursor.dart';
8180
export 'engine/mouse/prevent_default.dart';
8281
export 'engine/navigation/history.dart';
8382
export 'engine/noto_font.dart';
8483
export 'engine/noto_font_encoding.dart';
84+
export 'engine/occlusion_map.dart';
8585
export 'engine/onscreen_logging.dart';
8686
export 'engine/platform_dispatcher.dart';
8787
export 'engine/platform_dispatcher/app_lifecycle_state.dart';
8888
export 'engine/platform_dispatcher/view_focus_binding.dart';
89-
export 'engine/platform_views.dart';
9089
export 'engine/platform_views/content_manager.dart';
9190
export 'engine/platform_views/embedder.dart';
9291
export 'engine/platform_views/message_handler.dart';
@@ -99,9 +98,6 @@ export 'engine/profiler.dart';
9998
export 'engine/raw_keyboard.dart';
10099
export 'engine/renderer.dart';
101100
export 'engine/safe_browser_api.dart';
102-
export 'engine/scene_builder.dart';
103-
export 'engine/scene_painting.dart';
104-
export 'engine/scene_view.dart';
105101
export 'engine/semantics/accessibility.dart';
106102
export 'engine/semantics/alert.dart';
107103
export 'engine/semantics/checkable.dart';

engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/image.dart

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -312,17 +312,6 @@ CkImage scaleImage(SkImage image, int? targetWidth, int? targetHeight) {
312312
return ckImage;
313313
}
314314

315-
/// Thrown when the web engine fails to decode an image, either due to a
316-
/// network issue, corrupted image contents, or missing codec.
317-
class ImageCodecException implements Exception {
318-
ImageCodecException(this._message);
319-
320-
final String _message;
321-
322-
@override
323-
String toString() => 'ImageCodecException: $_message';
324-
}
325-
326315
const String _kNetworkImageMessage = 'Failed to load network image.';
327316

328317
/// Instantiates a [ui.Codec] backed by an `SkAnimatedImage` from Skia after

engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/picture_recorder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'dart:typed_data';
77
import 'package:ui/src/engine.dart';
88
import 'package:ui/ui.dart' as ui;
99

10-
class CkPictureRecorder implements LayerPictureRecorder, ScenePictureRecorder {
10+
class CkPictureRecorder implements LayerPictureRecorder {
1111
SkPictureRecorder? _skRecorder;
1212
CkCanvas? _recordingCanvas;
1313

engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/raster_cache.dart

Lines changed: 0 additions & 52 deletions
This file was deleted.

engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/renderer.dart

Lines changed: 10 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -430,71 +430,6 @@ class CanvasKitRenderer extends Renderer {
430430
ui.ParagraphBuilder createParagraphBuilder(ui.ParagraphStyle style) =>
431431
isExperimentalWebParagraph ? WebParagraphBuilder(style) : CkParagraphBuilder(style);
432432

433-
// TODO(harryterkelsen): Merge this logic with the async logic in
434-
// [EngineScene], https://github.com/flutter/flutter/issues/142072.
435-
@override
436-
Future<void> renderScene(ui.Scene scene, EngineFlutterView view) async {
437-
assert(
438-
rasterizers.containsKey(view.viewId),
439-
"Unable to render to a view which hasn't been registered",
440-
);
441-
final ViewRasterizer rasterizer = rasterizers[view.viewId]!;
442-
final RenderQueue renderQueue = rasterizer.queue;
443-
final FrameTimingRecorder? recorder = FrameTimingRecorder.frameTimingsEnabled
444-
? FrameTimingRecorder()
445-
: null;
446-
if (renderQueue.current != null) {
447-
// If a scene is already queued up, drop it and queue this one up instead
448-
// so that the scene view always displays the most recently requested scene.
449-
renderQueue.next?.completer.complete();
450-
final Completer<void> completer = Completer<void>();
451-
renderQueue.next = (scene: scene, completer: completer, recorder: recorder);
452-
return completer.future;
453-
}
454-
final Completer<void> completer = Completer<void>();
455-
renderQueue.current = (scene: scene, completer: completer, recorder: recorder);
456-
unawaited(_kickRenderLoop(rasterizer));
457-
return completer.future;
458-
}
459-
460-
Future<void> _kickRenderLoop(ViewRasterizer rasterizer) async {
461-
final RenderQueue renderQueue = rasterizer.queue;
462-
final RenderRequest current = renderQueue.current!;
463-
try {
464-
await _renderScene(current.scene, rasterizer, current.recorder);
465-
current.completer.complete();
466-
} catch (error, stackTrace) {
467-
current.completer.completeError(error, stackTrace);
468-
}
469-
renderQueue.current = renderQueue.next;
470-
renderQueue.next = null;
471-
if (renderQueue.current == null) {
472-
return;
473-
} else {
474-
return _kickRenderLoop(rasterizer);
475-
}
476-
}
477-
478-
Future<void> _renderScene(
479-
ui.Scene scene,
480-
ViewRasterizer rasterizer,
481-
FrameTimingRecorder? recorder,
482-
) async {
483-
// "Build finish" and "raster start" happen back-to-back because we
484-
// render on the same thread, so there's no overhead from hopping to
485-
// another thread.
486-
//
487-
// CanvasKit works differently from the HTML renderer in that in HTML
488-
// we update the DOM in SceneBuilder.build, which is these function calls
489-
// here are CanvasKit-only.
490-
recorder?.recordBuildFinish();
491-
recorder?.recordRasterStart();
492-
493-
await rasterizer.draw((scene as LayerScene).layerTree, null);
494-
recorder?.recordRasterFinish();
495-
recorder?.submitTimings();
496-
}
497-
498433
@override
499434
void clearFragmentProgramCache() {
500435
_programs.clear();
@@ -537,5 +472,14 @@ class CanvasKitRenderer extends Renderer {
537472
);
538473

539474
@override
540-
void dumpDebugInfo() {}
475+
void dumpDebugInfo() {
476+
int i = 0;
477+
for (final viewRasterizer in rasterizers.values) {
478+
final Map<String, dynamic>? debugJson = viewRasterizer.dumpDebugInfo();
479+
if (debugJson != null) {
480+
downloadDebugInfo('flutter-scene$i', debugJson);
481+
i++;
482+
}
483+
}
484+
}
541485
}

engine/src/flutter/lib/web_ui/lib/src/engine/compositing/rasterizer.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,12 @@ abstract class ViewRasterizer {
5252

5353
/// Draws the [layerTree] to the screen for the view associated with this
5454
/// rasterizer.
55-
Future<void> draw(LayerTree layerTree, FrameTimingRecorder? recorder) async {
55+
/// Returns true if the frame was drawn, and false if it was skipped.
56+
Future<bool> draw(LayerTree layerTree, FrameTimingRecorder? recorder) async {
5657
final ui.Size frameSize = view.physicalSize;
5758
if (frameSize.isEmpty) {
5859
// Available drawing area is empty. Skip drawing.
59-
return;
60+
return false;
6061
}
6162

6263
// The [frameSize] may be slightly imprecise if the `devicePixelRatio` isn't
@@ -76,6 +77,7 @@ abstract class ViewRasterizer {
7677
_lastRenderedLayerTree = layerTree;
7778

7879
await viewEmbedder.submitFrame(recorder);
80+
return true;
7981
}
8082

8183
/// Do some initialization to prepare to draw a frame.

engine/src/flutter/lib/web_ui/lib/src/engine/frame_service.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,8 @@ class FrameService {
162162
// In Flutter terminology "building a frame" consists of "beginning
163163
// frame" and "drawing frame".
164164
//
165-
// We do not call `recordBuildFinish` from here because
166-
// part of the rasterization process, particularly in the HTML
167-
// renderer, takes place in the `SceneBuilder.build()`.
165+
// We do not call `recordBuildFinish` from here because part of the
166+
// rasterization process takes place in `SceneBuilder.build()`.
168167
FrameTimingRecorder.recordCurrentFrameBuildStart();
169168

170169
// We have to convert high-resolution time to `int` so we can construct

engine/src/flutter/lib/web_ui/lib/src/engine/image_decoder.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,3 +267,14 @@ ui.Image scaleImageIfNeeded(
267267
image.dispose();
268268
return finalImage;
269269
}
270+
271+
/// Thrown when the web engine fails to decode an image, either due to a
272+
/// network issue, corrupted image contents, or missing codec.
273+
class ImageCodecException implements Exception {
274+
ImageCodecException(this._message);
275+
276+
final String _message;
277+
278+
@override
279+
String toString() => 'ImageCodecException: $_message';
280+
}

0 commit comments

Comments
 (0)