Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: e74aa7f36cbd532f681b2c015002264a7d756b52
https://github.com/WebKit/WebKit/commit/e74aa7f36cbd532f681b2c015002264a7d756b52
Author: Wenson Hsieh <[email protected]>
Date: 2023-03-24 (Fri, 24 Mar 2023)
Changed paths:
M LayoutTests/tiled-drawing/tiled-backing-in-window.html
M Tools/WebKitTestRunner/mac/PlatformWebViewMac.mm
Log Message:
-----------
[UI-side compositing] tiled-drawing/tiled-backing-in-window.html fails when
run on a 2x display
https://bugs.webkit.org/show_bug.cgi?id=254387
rdar://107038034
Reviewed by Simon Fraser.
This test fails when UI-side compositing is enabled. Consider the following
sequence of events,
immediately upon unparenting the web view via `UIScriptController`, when
running the test on a 2x
display with GPUP and UI-side compositing enabled:
1. In the UI process, we schedule an activity state change (to tell the web
process that the view
is no longer in a window).
2. At the same time, we send an IPC message
`WebPage::SetDeviceScaleFactor(2.0)` (the intrinsic
device scale is 2.0 in the UI process after unparenting the web view, since
we fall back to the
main `NSScreen`'s `-backingScaleFactor`).
3. In the web process, we receive the new device scale of 2.0, and mark each
graphics layer with a
dirty bit: `LayerChange::ContentsScaleChanged`.
4. In the web process, we then perform a rendering update that was previously
scheduled (for any
reason). This causes us to `flushCompositingState` on the root layer, and
recursively apply the
new contents scale to all sublayers.
5. In the UI process, we then (finally) dispatch the activity state change
that was scheduled in
step (1).
6. In the web process, we receive the new activity state, and detach the root
layer underneath
`RenderLayerCompositor::setIsInWindow`, with `isInWindow := false`.
Thus, each `PlatformCALayerRemote` ends up with a scale of 2.0 instead of 1.0
after unparenting the
web view, which is reflected in the output of `layerTreeAsText`. In contrast,
when GPUP and UI-side
compositing are disabled, step (4) occurs after (5-6) above, which causes us to
bail earlier before
flushing the new backing store scale to the layer tree:
```
void RenderLayerCompositor::flushPendingLayerChanges(bool isFlushRoot)
{
…
if (rootLayerAttachment() == RootLayerUnattached) {
m_shouldFlushOnReattach = true;
return; // <---------------- We early return here in the non-GPUP
case.
}
…
```
...which allows the layers to retain a device scale of 1. Due to the fact that
it's unclear whether
the post-GPUP behavior is better or worse (as the old behavior effectively
leaves the layer content
scales out of sync with the device scale factor in the UI process), it's
probably best to just fix
this test by making the test itself by forcing a `deviceScaleFactor` of 1.0.
* LayoutTests/tiled-drawing/tiled-backing-in-window.html:
* Tools/WebKitTestRunner/mac/PlatformWebViewMac.mm:
(WTR::PlatformWebView::changeWindowScaleIfNeeded):
Ensure that we actually call into `-_setOverrideDeviceScaleFactor:` when
specifying a
`deviceScaleFactor=1.0` test runner option, by adjusting the implementation of
this helper method
to not early return from the entire function if only the window's
`-backingScaleFactor` matches.
Canonical link: https://commits.webkit.org/262086@main
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes