This repository was archived by the owner on Feb 25, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6k
[canvaskit] Fall back to multi-context rendering on Firefox and Safari #49572
Merged
harryterkelsen
merged 20 commits into
flutter:main
from
harryterkelsen:canvaskit-refactor-rasterization
Jan 18, 2024
Merged
Changes from 7 commits
Commits
Show all changes
20 commits
Select commit
Hold shift + click to select a range
db7c653
Refactor rasterization to support single GL context and multi context…
harryterkelsen 9620664
Undo formatting
harryterkelsen d3757e7
WIP fixing semantics tests
harryterkelsen 86457af
Undo fixes for semantics tests
harryterkelsen 2bd517c
Implement dispose and max cache bytes
harryterkelsen 9a6a87a
fix licenses
harryterkelsen 408d8f6
Offset surface
harryterkelsen ef19f8f
Rename OverlayCanvas to DisplayCanvas
harryterkelsen c48f020
Revert debug print
harryterkelsen 4510381
fix licenses
harryterkelsen f046d69
delete unused import
harryterkelsen 0731e64
Merge branch 'main' into canvaskit-refactor-rasterization
harryterkelsen d440403
Fix test
harryterkelsen 9996044
Merge branch 'main' into canvaskit-refactor-rasterization
harryterkelsen 43d2734
Fix off-by-one blurriness bug
harryterkelsen 6e92c43
Add test for proper sizing of Surface
harryterkelsen 6d0ede5
Fix analysis errors in test
harryterkelsen 526610f
Skip test on skwasm since same() doesn't work for JSValues
harryterkelsen b27302b
skip test on wasm
harryterkelsen abc1876
remove unused import
harryterkelsen File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
71 changes: 71 additions & 0 deletions
71
lib/web_ui/lib/src/engine/canvaskit/multi_surface_rasterizer.dart
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,71 @@ | ||
| // Copyright 2013 The Flutter Authors. All rights reserved. | ||
| // 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/ui.dart' as ui; | ||
|
|
||
| /// A Rasterizer which uses one or many on-screen WebGL contexts to display the | ||
| /// scene. This way of rendering is prone to bugs because there is a limit to | ||
| /// how many WebGL contexts can be live at one time as well as bugs in sharing | ||
| /// GL resources between the contexts. However, using [createImageBitmap] is | ||
| /// currently very slow on Firefox and Safari browsers, so directly rendering | ||
| /// to several | ||
| class MultiSurfaceRasterizer extends Rasterizer { | ||
| @override | ||
| MultiSurfaceViewRasterizer createViewRasterizer(EngineFlutterView view) { | ||
| return _viewRasterizers.putIfAbsent( | ||
| view, () => MultiSurfaceViewRasterizer(view, this)); | ||
| } | ||
|
|
||
| final Map<EngineFlutterView, MultiSurfaceViewRasterizer> _viewRasterizers = | ||
| <EngineFlutterView, MultiSurfaceViewRasterizer>{}; | ||
|
|
||
| @override | ||
| void dispose() { | ||
| for (final MultiSurfaceViewRasterizer viewRasterizer | ||
| in _viewRasterizers.values) { | ||
| viewRasterizer.dispose(); | ||
| } | ||
| _viewRasterizers.clear(); | ||
| } | ||
|
|
||
| @override | ||
| void setResourceCacheMaxBytes(int bytes) { | ||
| for (final MultiSurfaceViewRasterizer viewRasterizer | ||
| in _viewRasterizers.values) { | ||
| viewRasterizer.overlayFactory.forEachCanvas((Surface surface) { | ||
| surface.setSkiaResourceCacheMaxBytes(bytes); | ||
| }); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| class MultiSurfaceViewRasterizer extends ViewRasterizer { | ||
| MultiSurfaceViewRasterizer(super.view, this.rasterizer); | ||
|
|
||
| final MultiSurfaceRasterizer rasterizer; | ||
|
|
||
| @override | ||
| final OverlayCanvasFactory<Surface> overlayFactory = | ||
| OverlayCanvasFactory<Surface>( | ||
| createCanvas: () => Surface(isRenderCanvas: true)); | ||
|
|
||
| @override | ||
| void prepareToDraw() { | ||
| overlayFactory.baseCanvas.createOrUpdateSurface(currentFrameSize); | ||
| } | ||
|
|
||
| @override | ||
| Future<void> rasterizeToCanvas( | ||
| OverlayCanvas canvas, List<CkPicture> pictures) { | ||
| final Surface surface = canvas as Surface; | ||
| surface.createOrUpdateSurface(currentFrameSize); | ||
| surface.positionToShowFrame(currentFrameSize); | ||
| final CkCanvas skCanvas = surface.getCanvas(); | ||
| skCanvas.clear(const ui.Color(0x00000000)); | ||
| pictures.forEach(skCanvas.drawPicture); | ||
| surface.flush(); | ||
| return Future<void>.value(); | ||
| } | ||
| } | ||
63 changes: 63 additions & 0 deletions
63
lib/web_ui/lib/src/engine/canvaskit/offscreen_canvas_rasterizer.dart
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,63 @@ | ||
| // Copyright 2013 The Flutter Authors. All rights reserved. | ||
| // 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'; | ||
|
|
||
| /// A [Rasterizer] that uses a single GL context in an OffscreenCanvas to do | ||
| /// all the rendering. It transers bitmaps created in the OffscreenCanvas to | ||
harryterkelsen marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| /// one or many on-screen <canvas> elements to actually display the scene. | ||
| class OffscreenCanvasRasterizer extends Rasterizer { | ||
| /// This is an SkSurface backed by an OffScreenCanvas. This single Surface is | ||
| /// used to render to many RenderCanvases to produce the rendered scene. | ||
| final Surface offscreenSurface = Surface(); | ||
|
|
||
| @override | ||
| OffscreenCanvasViewRasterizer createViewRasterizer(EngineFlutterView view) { | ||
| return _viewRasterizers.putIfAbsent( | ||
| view, () => OffscreenCanvasViewRasterizer(view, this)); | ||
| } | ||
|
|
||
| final Map<EngineFlutterView, OffscreenCanvasViewRasterizer> _viewRasterizers = | ||
| <EngineFlutterView, OffscreenCanvasViewRasterizer>{}; | ||
|
|
||
| @override | ||
| void setResourceCacheMaxBytes(int bytes) { | ||
| offscreenSurface.setSkiaResourceCacheMaxBytes(bytes); | ||
| } | ||
|
|
||
| @override | ||
| void dispose() { | ||
| offscreenSurface.dispose(); | ||
| for (final OffscreenCanvasViewRasterizer viewRasterizer | ||
| in _viewRasterizers.values) { | ||
| viewRasterizer.dispose(); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| class OffscreenCanvasViewRasterizer extends ViewRasterizer { | ||
| OffscreenCanvasViewRasterizer(super.view, this.rasterizer); | ||
|
|
||
| final OffscreenCanvasRasterizer rasterizer; | ||
|
|
||
| @override | ||
| final OverlayCanvasFactory<RenderCanvas> overlayFactory = | ||
| OverlayCanvasFactory<RenderCanvas>(createCanvas: () => RenderCanvas()); | ||
|
|
||
| /// Render the given [pictures] so it is displayed by the given [canvas]. | ||
| @override | ||
| Future<void> rasterizeToCanvas( | ||
| OverlayCanvas canvas, List<CkPicture> pictures) async { | ||
| await rasterizer.offscreenSurface.rasterizeToCanvas( | ||
| currentFrameSize, | ||
| canvas as RenderCanvas, | ||
| pictures, | ||
| ); | ||
| } | ||
|
|
||
| @override | ||
| void prepareToDraw() { | ||
| rasterizer.offscreenSurface.createOrUpdateSurface(currentFrameSize); | ||
| } | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.