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

Reply via email to