Correct clipping of destination rects for filters when 3D transformed. #28413
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.
Make InverseMapQuadToLocalSpace flatten transform to avoid 3D clipping
glitches.
While cc::MathUtil::InverseMapQuadToLocalSpace was documented as
requiring callers to flatten the transform, only one of the four
existing callers did this. This changes it to flatten the transform
internally.
This fixes a bug where incorrect clipping rects were used in at least
two of those three callers that were not flattening: the callers in
SkiaRenderer::CalculateRPDQParams and
GLRenderer::UpdateRPDQWithSkiaFilters. These callers were computing
the minimal clip rect in local space (in a plane that might have a 3D
transform) by transforming the clip rect (in the simple testcase, the
window boundary), as a quad, into the local coordinate space,
producing points that (with 3D) can have a nonzero Z components. This
nonzero Z component was then dropped. However, the desired result was
the point with a zero Z component in local space that would produce
the correct X/Y position in device space with some arbitrary Z
component in device space (that could then be dropped).
This fixes the case tested in
preserve3d-and-filter-no-perspective.html
Don't try clipping at all when the transform has perspective, since
when there is perspective, there could be areas on the local surface
that are visible even though they are outside the bounds of the quad
that maps to the device's clip.
This fixes the case tested in
preserve3d-and-filter-with-perspective.html
Bug: 923766
Change-Id: I5fbc679300ca52446552a1f5d90160309073d687
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2809095
Reviewed-by: vmpstr <vmpstr@chromium.org>
Commit-Queue: David Baron <dbaron@chromium.org>
Cr-Commit-Position: refs/heads/master@{#870500}