зеркало из https://github.com/mozilla/gecko-dev.git
9a83835d67
This patch introduces a number of subtle but important changes to how we deal with off-screen surfaces. The overall goals are: - Improve rendering correctness in a number of edge cases. - Begin reducing complexity related to surfaces, scaling factors, surface size adjustments and clipping. - Improve CPU performance by removing some per-primitive work. - Simplify implementation of future SVG and CSS filters by having explicit support for picture rects + inflation regions. - Lay the groundwork for caching child picture surfaces, reduction of per-primitive work during visibility pass, simplifying picture code. Unfortunately, the nature of the changes make it impossible to split up in to small isolated patches. Details below: * Introduce `LocalRectKind` concept. This allows us to separate out the bounding rect of the surface (a group of primitives backed by a texture) from the bounding rect of the picture compositing that surface (e.g. a drop-shadow which draws the surface once at the local origin and once at a specific offset + blur-radius). This fixes a number of correctness bugs we have related to culling, clipping, invalidation regions of complex primitives such as drop-shadows and blur filters. Importantly, it makes it simpler to implement (or fix) SVG filter chains, backdrop-filter implementations. * Establish raster roots for all off-screen surfaces. Every off-screen surface uses the spatial node of the enclosing stacking context as a coordinate system root, ensuring that each off-screen surface is drawn in a 2D coordinate system, with appropriate scaling factors applied to ensure high quality rendering. The primary goal is to make it possible to correctly inflate and clip off-screen surfaces, removing some correctness issues we currently have with complex filters interacting with transforms. The initial work here doesn't reduce complexity a huge amount, but will allow us to simplify large parts of the picture/surface handling code in future, as well as simplify a number of shaders that currently must handle arbitrarily complex transform matrices. This will also allow us to simplify the implementation of features such as mix-blend-mode and backdrop-filter, which rely on readback and UV mapping from the parent surface. * Remove concepts of `estimated` and `precise` local rects for pictures. This is both a performance optimization and a code simplification. Instead, we only determine the estimated local rect during bounding rect propagation, and rely on the clipping regions from the tile dirty regions to reduce which parts of the picture we allocate if drawing to an off-screen surface. This removes some per-primitive work during the visibility pass, and also means we can rely on the final picture bounding rect from the start of the visibility pass. This also removes much of the complexity in `take_context` where we previously determined surface scale factors and device pixel ratio - instead these can be determined earlier during `propagate_bounding_rects`. * Remove some complexity in `update_prim_visibility`. This is still recursive, but follow up patches will aim to remove this recursion and integrate this pass with the picture graph (similar to how `propagate_bounding_rects` works). * Remove `PictureOptions` struct. Instead, store `inflate_if_required` with the Blur filter enum, which is the only place that uses it. * Remove `root_scaling_factor` from text runs - this is handled implicitly by the surface device-pixel scale. * Skip calling `update_clip_task` for pass-through pictures (since they have no defined local rect). * Improve scaling factors used for determining the render task cache size for complex line decorations. Differential Revision: https://phabricator.services.mozilla.com/D137569 |
||
---|---|---|
.. | ||
basic-negcoord-ref.xhtml | ||
basic-negcoord.xhtml | ||
basic-ref.xhtml | ||
basic.xhtml | ||
blur-notref.xhtml | ||
blur-opacity-ref.html | ||
blur-opacity.html | ||
blur.xhtml | ||
color-inherit-ref.xhtml | ||
color-inherit.xhtml | ||
multiple-noblur-ref.xhtml | ||
multiple-noblur.xhtml | ||
overflow-clip-ref.html | ||
overflow-clip.html | ||
overflow-decoration-ref.html | ||
overflow-decoration.html | ||
reftest.list | ||
text-shadow-on-selection-1-ref.html | ||
text-shadow-on-selection-1.html | ||
text-shadow-on-selection-2-ref.html | ||
text-shadow-on-selection-2.html | ||
text-shadow-on-space-1-ref.html | ||
text-shadow-on-space-1.html | ||
text-shadow-selected-1-notref.html | ||
text-shadow-selected-1-ref.html | ||
text-shadow-selected-1.html | ||
text-shadow-selected-2-notref.html | ||
text-shadow-selected-2-ref.html | ||
text-shadow-selected-2.html |