From 16a802bedcf1fc98ac8d4aaff7c9794d45eef375 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Fri, 18 Mar 2022 14:15:09 -0700 Subject: [PATCH] allow experimentally opting into MSAA on canvaskit (flutter/engine#32045) --- .../lib/src/engine/canvaskit/surface.dart | 7 +- .../web_ui/test/canvaskit/vertices_test.dart | 221 +++++++++++++++++- 2 files changed, 225 insertions(+), 3 deletions(-) diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/surface.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/surface.dart index f0e8a149574..0bfc5df7c10 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/surface.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/surface.dart @@ -17,6 +17,11 @@ import 'initialization.dart'; import 'surface_factory.dart'; import 'util.dart'; +// Only supported in profile/release mode. Allows Flutter to use MSAA but +// removes the ability for disabling AA on Paint objects. +const bool _kUsingMSAA = + bool.fromEnvironment('flutter.canvaskit.msaa', defaultValue: false); + typedef SubmitCallback = bool Function(SurfaceFrame, CkCanvas); /// A frame which contains a canvas to be drawn into. @@ -307,7 +312,7 @@ class Surface { SkWebGLContextOptions( // Default to no anti-aliasing. Paint commands can be explicitly // anti-aliased by setting their `Paint` object's `antialias` property. - antialias: 0, + antialias: _kUsingMSAA ? 1 : 0, majorVersion: webGLVersion, ), ); diff --git a/engine/src/flutter/lib/web_ui/test/canvaskit/vertices_test.dart b/engine/src/flutter/lib/web_ui/test/canvaskit/vertices_test.dart index 89f1d387e4e..847ead6a215 100644 --- a/engine/src/flutter/lib/web_ui/test/canvaskit/vertices_test.dart +++ b/engine/src/flutter/lib/web_ui/test/canvaskit/vertices_test.dart @@ -2,10 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:typed_data'; + import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; +import 'package:web_engine_tester/golden_tester.dart'; import 'common.dart'; @@ -24,7 +27,8 @@ void testMain() { expect(vertices.resurrect(), isNotNull); final CkPictureRecorder recorder = CkPictureRecorder(); - final CkCanvas canvas = recorder.beginRecording(const ui.Rect.fromLTRB(0, 0, 100, 100)); + final CkCanvas canvas = + recorder.beginRecording(const ui.Rect.fromLTRB(0, 0, 100, 100)); canvas.drawVertices( vertices, ui.BlendMode.srcOver, @@ -32,8 +36,36 @@ void testMain() { ); vertices.delete(); }); - // TODO(hterkelsen): https://github.com/flutter/flutter/issues/60040 + // TODO(hterkelsen): https://github.com/flutter/flutter/issues/60040 }, skip: isIosSafari); + + test('Vertices are not anti-aliased by default', () async { + const ui.Rect region = ui.Rect.fromLTRB(0, 0, 500, 500); + final CkPictureRecorder recorder = CkPictureRecorder(); + final CkCanvas canvas = recorder.beginRecording(region); + final CkVertices vertices = ui.Vertices.raw( + ui.VertexMode.triangles, + Float32List.fromList(_circularVertices), + indices: Uint16List.fromList(_circularVertexIndices), + ) as CkVertices; + canvas.scale(3.0, 3.0); + canvas.drawVertices( + vertices, + ui.BlendMode.srcOver, + CkPaint()..color = const ui.Color(0xFFFF0000), + ); + + final CkPicture verticesPicture = recorder.endRecording(); + + final LayerSceneBuilder builder = LayerSceneBuilder(); + builder.pushOffset(0, 0); + builder.addPicture(ui.Offset.zero, verticesPicture); + EnginePlatformDispatcher.instance.rasterizer! + .draw(builder.build().layerTree); + await matchGoldenFile('canvaskit_vertices_antialiased.png', region: region); + + // TODO(hterkelsen): https://github.com/flutter/flutter/issues/60040 + }, skip: isSafari); } CkVertices _testVertices() { @@ -57,3 +89,188 @@ CkVertices _testVertices() { indices: [0, 1, 2], ) as CkVertices; } + +const List _circularVertices = [ + 14.530723571777344, + 18.18381690979004, + 14.530723571777344, + 18.624177932739258, + 14.538220405578613, + 18.40399742126465, + 14.445072174072266, + 17.765277862548828, + 14.445072174072266, + 19.04271697998047, + 14.282388687133789, + 17.38067626953125, + 14.282388687133789, + 19.427318572998047, + 14.051292419433594, + 17.038639068603516, + 14.051292419433594, + 19.76935577392578, + 13.76040267944336, + 16.747783660888672, + 13.76040267944336, + 20.06021499633789, + 13.418340682983398, + 16.5167236328125, + 13.418340682983398, + 20.291275024414062, + 13.033727645874023, + 20.45391845703125, + 13.03372573852539, + 16.354080200195312, + 12.615180015563965, + 20.539527893066406, + 12.6151762008667, + 16.268470764160156, + 12.395000457763672, + 20.547000885009766, + 12.394994735717773, + 16.260997772216797, + 12.394994735717773, + 20.546998977661133, + 12.174847602844238, + 16.268516540527344, + 12.174847602844238, + 20.539480209350586, + 11.75637149810791, + 16.354188919067383, + 11.75637149810791, + 20.45380973815918, + 11.371832847595215, + 16.516868591308594, + 11.371832847595215, + 20.291126251220703, + 11.029844284057617, + 16.747943878173828, + 11.029844284057617, + 20.06005096435547, + 10.739023208618164, + 17.038795471191406, + 10.739023208618164, + 19.76919937133789, + 10.507984161376953, + 17.380809783935547, + 10.507984161376953, + 19.427188873291016, + 10.345342636108398, + 17.765365600585938, + 10.345342636108398, + 19.042633056640625, + 10.259716033935547, + 18.183849334716797, + 10.259716033935547, + 18.6241455078125, + 10.25222110748291, + 18.40399742126465, +]; + +const List _circularVertexIndices = [ + 0, + 1, + 2, + 3, + 1, + 0, + 3, + 4, + 1, + 5, + 4, + 3, + 5, + 6, + 4, + 7, + 6, + 5, + 7, + 8, + 6, + 9, + 8, + 7, + 9, + 10, + 8, + 11, + 10, + 9, + 11, + 12, + 10, + 11, + 13, + 12, + 14, + 13, + 11, + 14, + 15, + 13, + 16, + 15, + 14, + 16, + 17, + 15, + 18, + 17, + 16, + 18, + 19, + 17, + 20, + 19, + 18, + 20, + 21, + 19, + 22, + 21, + 20, + 22, + 23, + 21, + 24, + 23, + 22, + 24, + 25, + 23, + 26, + 25, + 24, + 26, + 27, + 25, + 28, + 27, + 26, + 28, + 29, + 27, + 30, + 29, + 28, + 30, + 31, + 29, + 32, + 31, + 30, + 32, + 33, + 31, + 34, + 33, + 32, + 34, + 35, + 33, + 35, + 34, + 36 +];