I am glad that setting it to 0 was able to address your quality concerns. If you can take a screenshot of the bad artifacts with non-retina 8 I would appreciate it. A lot of Skia's newer path renderers have focused on MSAA-oriented techniques for improved performance and because their visual quality is acceptable on mobile / retina displays, which are becoming increasingly common. That being said, we will always need to have non-MSAA approaches available, and if we aren't using MSAA, it will generally have higher visual quality because coverage is calculated analytically. While it's pretty safe to say non-MSAA will always be supported, the specific techniques used for coverage AA for specific types of paths and styles may be subject to change.
At the moment we have four non-MSAA path renderers that can be used in various situations:
1. A software fallback that uses the CPU backend's conventional rasterization techniques to make an alpha mask and upload it to the GPU. This is robust and a great fallback, but definitely hurts performance; if everything you were to draw would use the software path renderer, you're probably better off using the CPU backend of Skia, but when you have mixed content like primitive shapes, images, and filter effects, the software path renderer won't be too bad used here and there.
2. An analytic renderer for convex filled paths and strokes that tessellates a path into vertices and then draws those as triangles on the GPU. This has some CPU overhead preparing the vertices but because we know the base curve was convex, it's still reasonably efficient.
3. An analytic renderer for arbitrary filled paths and strokes that fully triangulates the path and calculates all the winding fill rules per triangle, and then computes additional inset/outset vertices to provide the anti-aliasing along all the final edges. This has high visual quality but a lot of CPU overhead and can suffer from numerical stability issues and is currently a source of technical debt that we'd like to alleviate.
4. A signed-distance field renderer where small paths are converted to an SDF and then can be re-rendered quickly at new transformations with anti-aliasing derived from the gradient of the SDF. This can look good and have high performance, although care has to be taken around the memory budget of the cached SDF textures, and not every path converts to an SDF losslessly so we prefer it for small paths.
The specific capabilities of these renderers, in terms of path type, style, and transformation matrix can be pretty complex so the easiest knob is the InternalMultisampleCount option to turn on and off the MSAA renderers that have priority. We definitely should have a way to expose this in CanvasKit that is currently lacking. Internally we have some testing utility code that lets us enable/disable various renderers but it would not be as simple as a "fidelity" dial. I think something like that would give us a good way to accept a quality hint from the user while still giving us flexibility to adjust implementations internally over time. For instance, we may pursue compute-shader based non-MSAA path renderers, post-processing, or multi-pass algorithms to increase the quality of the MSAA renderers.
-M
PS - The sampleCount parameter to GrBackendRenderTarget is purely informative for Skia, it tells us what sample count the GPU surface was created with externally. If you change that value without changing how the GPU surface was allocated, Skia might think it's rendering with MSAA but the rendering will be non-MSAA and we won't know. If you were changing both the sampleCount passed to GrBRT and how created the WebGL surface and were not seeing any behavioral differences then that sounds like an issue with MSAA and WebGL that would be good to dig into further.