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

Reverts "Implement frame timing callbacks in Skwasm. (#50737)" #50895

Merged
merged 1 commit into from
Feb 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 0 additions & 2 deletions ci/licenses_golden/licenses_flutter
Original file line number Diff line number Diff line change
Expand Up @@ -10324,7 +10324,6 @@ ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/font_fallback_data.dart + ../
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/font_fallbacks.dart + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/fonts.dart + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/frame_reference.dart + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/frame_timing_recorder.dart + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/html/backdrop_filter.dart + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/html/bitmap_canvas.dart + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/html/canvas.dart + ../../../flutter/LICENSE
Expand Down Expand Up @@ -13162,7 +13161,6 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/font_fallback_data.dart
FILE: ../../../flutter/lib/web_ui/lib/src/engine/font_fallbacks.dart
FILE: ../../../flutter/lib/web_ui/lib/src/engine/fonts.dart
FILE: ../../../flutter/lib/web_ui/lib/src/engine/frame_reference.dart
FILE: ../../../flutter/lib/web_ui/lib/src/engine/frame_timing_recorder.dart
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/backdrop_filter.dart
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/bitmap_canvas.dart
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/canvas.dart
Expand Down
1 change: 0 additions & 1 deletion lib/web_ui/lib/src/engine.dart
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ export 'engine/font_fallback_data.dart';
export 'engine/font_fallbacks.dart';
export 'engine/fonts.dart';
export 'engine/frame_reference.dart';
export 'engine/frame_timing_recorder.dart';
export 'engine/html/backdrop_filter.dart';
export 'engine/html/bitmap_canvas.dart';
export 'engine/html/canvas.dart';
Expand Down
1 change: 0 additions & 1 deletion lib/web_ui/lib/src/engine/canvaskit/rasterizer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,6 @@ abstract class DisplayCanvas {
typedef RenderRequest = ({
ui.Scene scene,
Completer<void> completer,
FrameTimingRecorder? recorder,
});

/// A per-view queue of render requests. Only contains the current render
Expand Down
16 changes: 7 additions & 9 deletions lib/web_ui/lib/src/engine/canvaskit/renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -417,17 +417,16 @@ class CanvasKitRenderer implements Renderer {
"Unable to render to a view which hasn't been registered");
final ViewRasterizer rasterizer = _rasterizers[view.viewId]!;
final RenderQueue renderQueue = rasterizer.queue;
final FrameTimingRecorder? recorder = FrameTimingRecorder.frameTimingsEnabled ? FrameTimingRecorder() : null;
if (renderQueue.current != null) {
// If a scene is already queued up, drop it and queue this one up instead
// so that the scene view always displays the most recently requested scene.
renderQueue.next?.completer.complete();
final Completer<void> completer = Completer<void>();
renderQueue.next = (scene: scene, completer: completer, recorder: recorder);
renderQueue.next = (scene: scene, completer: completer);
return completer.future;
}
final Completer<void> completer = Completer<void>();
renderQueue.current = (scene: scene, completer: completer, recorder: recorder);
renderQueue.current = (scene: scene, completer: completer);
unawaited(_kickRenderLoop(rasterizer));
return completer.future;
}
Expand All @@ -436,7 +435,7 @@ class CanvasKitRenderer implements Renderer {
final RenderQueue renderQueue = rasterizer.queue;
final RenderRequest current = renderQueue.current!;
try {
await _renderScene(current.scene, rasterizer, current.recorder);
await _renderScene(current.scene, rasterizer);
current.completer.complete();
} catch (error, stackTrace) {
current.completer.completeError(error, stackTrace);
Expand All @@ -450,20 +449,19 @@ class CanvasKitRenderer implements Renderer {
}
}

Future<void> _renderScene(ui.Scene scene, ViewRasterizer rasterizer, FrameTimingRecorder? recorder) async {
Future<void> _renderScene(ui.Scene scene, ViewRasterizer rasterizer) async {
// "Build finish" and "raster start" happen back-to-back because we
// render on the same thread, so there's no overhead from hopping to
// another thread.
//
// CanvasKit works differently from the HTML renderer in that in HTML
// we update the DOM in SceneBuilder.build, which is these function calls
// here are CanvasKit-only.
recorder?.recordBuildFinish();
recorder?.recordRasterStart();
frameTimingsOnBuildFinish();
frameTimingsOnRasterStart();

await rasterizer.draw((scene as LayerScene).layerTree);
recorder?.recordRasterFinish();
recorder?.submitTimings();
frameTimingsOnRasterFinish();
}

// Map from view id to the associated Rasterizer for that view.
Expand Down
2 changes: 1 addition & 1 deletion lib/web_ui/lib/src/engine/dom.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1487,7 +1487,7 @@ class DomCanvasRenderingContextBitmapRenderer {}

extension DomCanvasRenderingContextBitmapRendererExtension
on DomCanvasRenderingContextBitmapRenderer {
external void transferFromImageBitmap(DomImageBitmap? bitmap);
external void transferFromImageBitmap(DomImageBitmap bitmap);
}

@JS('ImageData')
Expand Down
100 changes: 0 additions & 100 deletions lib/web_ui/lib/src/engine/frame_timing_recorder.dart

This file was deleted.

7 changes: 2 additions & 5 deletions lib/web_ui/lib/src/engine/html/renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -323,11 +323,8 @@ class HtmlRenderer implements Renderer {
@override
Future<void> renderScene(ui.Scene scene, ui.FlutterView view) async {
final EngineFlutterView implicitView = EnginePlatformDispatcher.instance.implicitView!;
scene as SurfaceScene;
implicitView.dom.setScene(scene.webOnlyRootElement!);
final FrameTimingRecorder? recorder = scene.timingRecorder;
recorder?.recordRasterFinish();
recorder?.submitTimings();
implicitView.dom.setScene((scene as SurfaceScene).webOnlyRootElement!);
frameTimingsOnRasterFinish();
}

@override
Expand Down
12 changes: 7 additions & 5 deletions lib/web_ui/lib/src/engine/html/scene.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,22 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:ui/src/engine.dart';
import 'package:ui/src/engine/display.dart';
import 'package:ui/ui.dart' as ui;

import '../dom.dart';
import '../vector_math.dart';
import '../window.dart';
import 'surface.dart';

class SurfaceScene implements ui.Scene {
/// This class is created by the engine, and should not be instantiated
/// or extended directly.
///
/// To create a Scene object, use a [SceneBuilder].
SurfaceScene(this.webOnlyRootElement, {
required this.timingRecorder,
});
SurfaceScene(this.webOnlyRootElement);

final DomElement? webOnlyRootElement;
final FrameTimingRecorder? timingRecorder;

/// Creates a raster image representation of the current state of the scene.
/// This is a slow operation that is performed on a background thread.
Expand Down
9 changes: 4 additions & 5 deletions lib/web_ui/lib/src/engine/html/scene_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'dart:typed_data';
import 'package:ui/ui.dart' as ui;
import 'package:ui/ui_web/src/ui_web.dart' as ui_web;

import '../../engine.dart' show FrameTimingRecorder, kProfileApplyFrame, kProfilePrerollFrame;
import '../../engine.dart' show kProfileApplyFrame, kProfilePrerollFrame;
import '../display.dart';
import '../dom.dart';
import '../picture.dart';
Expand Down Expand Up @@ -511,9 +511,8 @@ class SurfaceSceneBuilder implements ui.SceneBuilder {
// In the HTML renderer we time the beginning of the rasterization phase
// (counter-intuitively) in SceneBuilder.build because DOM updates happen
// here. This is different from CanvasKit.
final FrameTimingRecorder? recorder = FrameTimingRecorder.frameTimingsEnabled ? FrameTimingRecorder() : null;
recorder?.recordBuildFinish();
recorder?.recordRasterStart();
frameTimingsOnBuildFinish();
frameTimingsOnRasterStart();
timeAction<void>(kProfilePrerollFrame, () {
while (_surfaceStack.length > 1) {
// Auto-pop layers that were pushed without a corresponding pop.
Expand All @@ -529,7 +528,7 @@ class SurfaceSceneBuilder implements ui.SceneBuilder {
}
commitScene(_persistedScene);
_lastFrameScene = _persistedScene;
return SurfaceScene(_persistedScene.rootElement, timingRecorder: recorder);
return SurfaceScene(_persistedScene.rootElement);
});
}

Expand Down
17 changes: 8 additions & 9 deletions lib/web_ui/lib/src/engine/initialization.dart
Original file line number Diff line number Diff line change
Expand Up @@ -158,15 +158,7 @@ Future<void> initializeEngineServices({
if (!waitingForAnimation) {
waitingForAnimation = true;
domWindow.requestAnimationFrame((JSNumber highResTime) {
FrameTimingRecorder.recordCurrentFrameVsync();

// In Flutter terminology "building a frame" consists of "beginning
// frame" and "drawing frame".
//
// We do not call `recordBuildFinish` from here because
// part of the rasterization process, particularly in the HTML
// renderer, takes place in the `SceneBuilder.build()`.
FrameTimingRecorder.recordCurrentFrameBuildStart();
frameTimingsOnVsync();

// Reset immediately, because `frameHandler` can schedule more frames.
waitingForAnimation = false;
Expand All @@ -179,6 +171,13 @@ Future<void> initializeEngineServices({
final int highResTimeMicroseconds =
(1000 * highResTime.toDartDouble).toInt();

// In Flutter terminology "building a frame" consists of "beginning
// frame" and "drawing frame".
//
// We do not call `frameTimingsOnBuildFinish` from here because
// part of the rasterization process, particularly in the HTML
// renderer, takes place in the `SceneBuilder.build()`.
frameTimingsOnBuildStart();
if (EnginePlatformDispatcher.instance.onBeginFrame != null) {
EnginePlatformDispatcher.instance.invokeOnBeginFrame(
Duration(microseconds: highResTimeMicroseconds));
Expand Down
Loading