[canvaskit] Add configuration option to force multi-Surface rendering (#163087)
Adds a configuration option `canvasKitForceMultiSurfaceRasterizer` and associated environment variable `FLUTTER_WEB_CANVASKIT_FORCE_MULTI_SURFACE_RASTERIZER` to force the CanvasKit renderer to use `MultiSurfaceRasterizer`. This allows us to easily create reproduction apps for https://github.com/flutter/flutter/issues/162618 to show to the Chrome team. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
This commit is contained in:
parent
1023664651
commit
512d1d58ff
@ -48,17 +48,27 @@ class CanvasKitRenderer implements Renderer {
|
|||||||
Rasterizer _rasterizer = _createRasterizer();
|
Rasterizer _rasterizer = _createRasterizer();
|
||||||
|
|
||||||
static Rasterizer _createRasterizer() {
|
static Rasterizer _createRasterizer() {
|
||||||
if (isSafari || isFirefox) {
|
if (configuration.canvasKitForceMultiSurfaceRasterizer || isSafari || isFirefox) {
|
||||||
return MultiSurfaceRasterizer();
|
return MultiSurfaceRasterizer();
|
||||||
}
|
}
|
||||||
return OffscreenCanvasRasterizer();
|
return OffscreenCanvasRasterizer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Resets the [Rasterizer] to the default value. Used in tests.
|
||||||
|
void debugResetRasterizer() {
|
||||||
|
_rasterizer = _createRasterizer();
|
||||||
|
}
|
||||||
|
|
||||||
/// Override the rasterizer with the given [_rasterizer]. Used in tests.
|
/// Override the rasterizer with the given [_rasterizer]. Used in tests.
|
||||||
void debugOverrideRasterizer(Rasterizer testRasterizer) {
|
void debugOverrideRasterizer(Rasterizer testRasterizer) {
|
||||||
_rasterizer = testRasterizer;
|
_rasterizer = testRasterizer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the current [Rasterizer]. Used in tests.
|
||||||
|
Rasterizer debugGetRasterizer() {
|
||||||
|
return _rasterizer;
|
||||||
|
}
|
||||||
|
|
||||||
set resourceCacheMaxBytes(int bytes) => _rasterizer.setResourceCacheMaxBytes(bytes);
|
set resourceCacheMaxBytes(int bytes) => _rasterizer.setResourceCacheMaxBytes(bytes);
|
||||||
|
|
||||||
/// A surface used specifically for `Picture.toImage` when software rendering
|
/// A surface used specifically for `Picture.toImage` when software rendering
|
||||||
|
@ -275,6 +275,13 @@ class FlutterConfiguration {
|
|||||||
'FLUTTER_WEB_CANVASKIT_FORCE_CPU_ONLY',
|
'FLUTTER_WEB_CANVASKIT_FORCE_CPU_ONLY',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
bool get canvasKitForceMultiSurfaceRasterizer =>
|
||||||
|
_configuration?.canvasKitForceMultiSurfaceRasterizer ??
|
||||||
|
_defaultCanvasKitForceMultiSurfaceRasterizer;
|
||||||
|
static const bool _defaultCanvasKitForceMultiSurfaceRasterizer = bool.fromEnvironment(
|
||||||
|
'FLUTTER_WEB_CANVASKIT_FORCE_MULTI_SURFACE_RASTERIZER',
|
||||||
|
);
|
||||||
|
|
||||||
/// The maximum number of canvases to use when rendering in CanvasKit.
|
/// The maximum number of canvases to use when rendering in CanvasKit.
|
||||||
///
|
///
|
||||||
/// Limits the amount of overlays that can be created.
|
/// Limits the amount of overlays that can be created.
|
||||||
@ -370,6 +377,10 @@ extension JsFlutterConfigurationExtension on JsFlutterConfiguration {
|
|||||||
external JSBoolean? get _canvasKitForceCpuOnly;
|
external JSBoolean? get _canvasKitForceCpuOnly;
|
||||||
bool? get canvasKitForceCpuOnly => _canvasKitForceCpuOnly?.toDart;
|
bool? get canvasKitForceCpuOnly => _canvasKitForceCpuOnly?.toDart;
|
||||||
|
|
||||||
|
@JS('canvasKitForceMultiSurfaceRasterizer')
|
||||||
|
external JSBoolean? get _canvasKitForceMultiSurfaceRasterizer;
|
||||||
|
bool? get canvasKitForceMultiSurfaceRasterizer => _canvasKitForceMultiSurfaceRasterizer?.toDart;
|
||||||
|
|
||||||
@JS('canvasKitMaximumSurfaces')
|
@JS('canvasKitMaximumSurfaces')
|
||||||
external JSNumber? get _canvasKitMaximumSurfaces;
|
external JSNumber? get _canvasKitMaximumSurfaces;
|
||||||
double? get canvasKitMaximumSurfaces => _canvasKitMaximumSurfaces?.toDartDouble;
|
double? get canvasKitMaximumSurfaces => _canvasKitMaximumSurfaces?.toDartDouble;
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'dart:js_interop';
|
||||||
|
|
||||||
import 'package:test/bootstrap/browser.dart';
|
import 'package:test/bootstrap/browser.dart';
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
@ -68,6 +70,10 @@ void testMain() {
|
|||||||
group('Renderer', () {
|
group('Renderer', () {
|
||||||
setUpCanvasKitTest();
|
setUpCanvasKitTest();
|
||||||
|
|
||||||
|
tearDown(() {
|
||||||
|
CanvasKitRenderer.instance.debugResetRasterizer();
|
||||||
|
});
|
||||||
|
|
||||||
test('always renders most recent picture and skips intermediate pictures', () async {
|
test('always renders most recent picture and skips intermediate pictures', () async {
|
||||||
final TestRasterizer testRasterizer = TestRasterizer();
|
final TestRasterizer testRasterizer = TestRasterizer();
|
||||||
CanvasKitRenderer.instance.debugOverrideRasterizer(testRasterizer);
|
CanvasKitRenderer.instance.debugOverrideRasterizer(testRasterizer);
|
||||||
@ -175,5 +181,25 @@ void testMain() {
|
|||||||
expect(treesRenderedInView3.first, treesToRenderInView3.first);
|
expect(treesRenderedInView3.first, treesToRenderInView3.first);
|
||||||
expect(treesRenderedInView3.last, treesToRenderInView3.last);
|
expect(treesRenderedInView3.last, treesToRenderInView3.last);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'defaults to OffscreenCanvasRasterizer on Chrome and MultiSurfaceRasterizer on Firefox and Safari',
|
||||||
|
() {
|
||||||
|
if (isChromium) {
|
||||||
|
expect(CanvasKitRenderer.instance.debugGetRasterizer(), isA<OffscreenCanvasRasterizer>());
|
||||||
|
} else {
|
||||||
|
expect(CanvasKitRenderer.instance.debugGetRasterizer(), isA<MultiSurfaceRasterizer>());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
test('can be configured to always use MultiSurfaceRasterizer', () {
|
||||||
|
debugOverrideJsConfiguration(
|
||||||
|
<String, Object?>{'canvasKitForceMultiSurfaceRasterizer': true}.jsify()
|
||||||
|
as JsFlutterConfiguration?,
|
||||||
|
);
|
||||||
|
CanvasKitRenderer.instance.debugResetRasterizer();
|
||||||
|
expect(CanvasKitRenderer.instance.debugGetRasterizer(), isA<MultiSurfaceRasterizer>());
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user