<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>244017</bug_id>
          
          <creation_ts>2022-08-16 19:54:29 -0700</creation_ts>
          <short_desc>Tiled layer flicker when an animation ends</short_desc>
          <delta_ts>2022-12-11 05:40:45 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Animations</component>
          <version>Safari Technology Preview</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=244134</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Simon Fraser (smfr)">simon.fraser</reporter>
          <assigned_to name="Simon Fraser (smfr)">simon.fraser</assigned_to>
          <cc>dino</cc>
    
    <cc>graouts</cc>
    
    <cc>graouts</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1891845</commentid>
    <comment_count>0</comment_count>
      <attachid>461685</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2022-08-16 19:54:29 -0700</bug_when>
    <thetext>Created attachment 461685
Testcase

Attached testcase shows a bug where sometimes there&apos;s a single frame where some tiles are missing at the end of the animation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1891846</commentid>
    <comment_count>1</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2022-08-16 19:54:44 -0700</bug_when>
    <thetext>While the animation is running, we adjust the tile coverage taking the animation motion into account (GraphicsLayer::adjustCoverageRectForMovement() etc). At some point, our KeyframeEffect animation code determines that the animation is complete, and in that same rendering update, we recompute the tile coverage assuming no animation. However, the Core Animation animation is still running in WindowServer, so the composited layer position continues to be affected by it (even though we’ve recomputed the tile coverage).

The animation is only removed from the CALayer in the next rendering update loop, one frame too late:

Page::updateRendering()
DocumentTimelinesController::updateAnimationsAndSendEvents for time 4.61s
AnimationEffect 0x4730b00c0 getBasicTiming - localTime 1482.00 activeAfterBoundaryTime 1500.00
KeyframeEffect 0x4730b00c0 getAnimatedStyle - progress 1.00
  blending transform from translateX(0px, 0px, 0px) to translateX(-100%, 0px, 0px) at 1.00 -&gt; translate(-99.99%, 0px, 0px)
GraphicsLayer::adjustCoverageRectForMovement - previousVisibleRect (1119.29,0) width=1120.00 height=440, currentVisibleRect (1119.91,0) width=1120 height=440 expandedRect (1119.91,0) width=1121.24 height=440
TileGrid 0x4730216c0 (controller 0x4731500c0) revalidateTiles: bounds (0,0) width=2242 height=440 coverageRect(1119.91,0) width=1121.24 height=440 validation: []

Page::updateRendering()
AnimationEffect 0x4730b00c0 getBasicTiming - localTime 1532.00 activeAfterBoundaryTime 1500.00
KeyframeEffect 0x4730b00c0 getAnimatedStyle - progress unset
GraphicsLayer::adjustCoverageRectForMovement - previousVisibleRect (1119.91,0) width=1120 height=440, currentVisibleRect (5.40,0) width=1120 height=440 expandedRect (-2223.64,0) width=3349.04 height=440
TileGrid 0x4730216c0 (controller 0x4731500c0) revalidateTiles: bounds (0,0) width=2242 height=440 coverageRect(-2223.64,0) width=3349.04 height=440 validation: []

Page::updateRendering()
DocumentTimelinesController::updateAnimationsAndSendEvents for time 4.67s
DeclarativeAnimation::tick for element node 0x4a900d510 DIV 0x4a900d510 class=&apos;heroslide-set&apos;
KeyframeEffect::invalidate on element node 0x4a900d510 DIV 0x4a900d510 class=&apos;heroslide-set&apos;
GraphicsLayerCA 0x47303b370 id 91 removeAnimation keyframe-effect-2675c818-2317-40e3-9d74-32f9fc4036bd (is running 1)
animationDidStop &lt;CAAnimationGroup: 0x6000007e0f20&gt; finished 0
animationDidStop &lt;CAAnimationGroup: 0x6000007e10c0&gt; finished 0</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1891847</commentid>
    <comment_count>2</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2022-08-16 19:55:00 -0700</bug_when>
    <thetext>&lt;rdar://89111231&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1891848</commentid>
    <comment_count>3</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2022-08-16 19:55:08 -0700</bug_when>
    <thetext>For accelerated animations, DocumentTimeline::scheduleNextTick() starts a timer to trigger a rendering update for the next time that animations need servicing. However, there’s enough slop here that this timer fires too late:

DocumentTimeline 0x10511c500 scheduleNextTick - scheduleDelay 2.48s to fire at 68704.44432
…
DocumentTimeline 0x10511c500 scheduleAnimationResolution at 68704.55151 (timer fire)
…
Page::updateRendering() at 68704.55159

So this updateRendering() is the one too late to catch the end of the animation.

One option would be to always tick animations on every frame if a tiled layer is being animated (since we run rendering updates then every frame for tile coverage updates). Another would be to have the behavior of software animations match the CA animations, and behave like “fill-forward” until DocumentTimelinesController::updateAnimationsAndSendEvents() removes them. A third option would be to make scheduleNextTick use a slightly shorter delay.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1891849</commentid>
    <comment_count>4</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2022-08-16 20:08:10 -0700</bug_when>
    <thetext>Pull request: https://github.com/WebKit/WebKit/pull/3392</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1892150</commentid>
    <comment_count>5</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2022-08-18 00:08:56 -0700</bug_when>
    <thetext>Committed 253549@main (3292b5d3e182): &lt;https://commits.webkit.org/253549@main&gt;

Reviewed commits have been landed. Closing PR #3392 and removing active labels.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1918268</commentid>
    <comment_count>6</comment_count>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2022-12-11 05:40:45 -0800</bug_when>
    <thetext>*** Bug 249091 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>461685</attachid>
            <date>2022-08-16 19:54:29 -0700</date>
            <delta_ts>2022-08-16 19:54:29 -0700</delta_ts>
            <desc>Testcase</desc>
            <filename>animation-flicker.html</filename>
            <type>text/html</type>
            <size>4496</size>
            <attacher name="Simon Fraser (smfr)">simon.fraser</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29u
dGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgogICAgPG1ldGEg
bmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2Fs
ZT0xIj4KICAgIDxzY3JpcHQ+CiAgICAgICAgbGV0IGF0TGVmdCA9IGZhbHNlOwogICAgICAgIGZ1
bmN0aW9uIHN3YXAoKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGF0TGVmdCkKICAgICAgICAg
ICAgICAgIG5leHQoKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcHJldmlvdXMo
KTsKICAgICAgICAgICAgYXRMZWZ0ID0gIWF0TGVmdDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0
aW9uIG5leHQoKQogICAgICAgIHsKICAgICAgICAgICAgbGV0IGhlcm9TbGlkZSA9IGRvY3VtZW50
LnF1ZXJ5U2VsZWN0b3IoJy5oZXJvc2xpZGUtc2V0Jyk7CiAgICAgICAgICAgIGhlcm9TbGlkZS5z
dHlsZS50cmFuc2l0aW9uID0gJ3RyYW5zZm9ybSAyNTAwbXMnOwogICAgICAgICAgICBoZXJvU2xp
ZGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoMHB4KSc7CiAgICAgICAgfQogICAgICAg
IAogICAgICAgIGZ1bmN0aW9uIHByZXZpb3VzKCkKICAgICAgICB7CiAgICAgICAgICAgIGxldCBo
ZXJvU2xpZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVyb3NsaWRlLXNldCcpOwogICAg
ICAgICAgICBoZXJvU2xpZGUuc3R5bGUudHJhbnNpdGlvbiA9ICd0cmFuc2Zvcm0gMjUwMG1zJzsK
ICAgICAgICAgICAgaGVyb1NsaWRlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKC0xMDAl
KSc7CiAgICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBp
ZD0icGFnZS13cmFwcGVyIj4KICAgICAgICA8ZGl2IGlkPSJwYWdlIj4KICAgICAgICAgICAgPGRp
diBpZD0ibWFpbiIgY2xhc3M9Im1haW4tY29udGVudC1yZWdpb24gY29udGV4dHVhbC1saW5rcy1y
ZWdpb24iPgogICAgICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9InNsaWRlLXNldC0taGVybyI+
CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVyb3NsaWRlLWNvbnRhaW5lciI+CiAg
ICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imhlcm9zbGlkZS1zZXQiIHN0eWxlPSJ0
cmFuc2l0aW9uOiBub25lIDBzIGVhc2UgMHM7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwcHgpOyBs
ZWZ0OiAwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRl
LWl0ZW0gaGVyby1pdGVtLWZ1bGwgaGVyby1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA8ZGl2IGNsYXNzPSJub2RlIG5vZGUtYXJ0aWNsZSB3aXRoLWltYWdlIj4KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW1hZ2UiIHN0eWxlPSJi
YWNrZ3JvdW5kLWNvbG9yOiAjMTIzIj4mbmJzcDs8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGUtaXRlbSBoZXJvLWl0ZW0t
ZnVsbCBoZXJvLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xh
c3M9Im5vZGUgbm9kZS1hcnRpY2xlIHdpdGgtaW1hZ2UiPgogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbWFnZSIgc3R5bGU9IndpZHRoOiAxMTIycHg7IGJh
Y2tncm91bmQtY29sb3I6ICM1NjciPiZuYnNwOzwvZGl2PgogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAg
ICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAg
ICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0icGFkZGxlcyI+CiAgICAgICAgICAgICAgICAgICAg
ICAgIDxsaSBjbGFzcz0ibmV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9u
IG9uY2xpY2s9InN3YXAoKSI+TmV4dDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8
L2xpPgogICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9InByZXYiPgogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJzd2FwKCkiPlByZXZpb3VzPC9idXR0
b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgPC91
bD4KICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAg
PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgICAjcGFnZS13cmFwcGVyIHsKICAg
ICAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogYXV0
bzsKICAgICAgICAgICAgbWF4LXdpZHRoOiAxMTIwcHg7CiAgICAgICAgICAgIHBhZGRpbmctbGVm
dDogMHB4OwogICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7CiAgICAgICAgfQoKICAgICAg
ICAuc2xpZGUtc2V0LS1oZXJvIC5wYWRkbGVzLCAubmV3cy1zZWNvbmRhcnktc2VjdGlvbiAucGFk
ZGxlcyB7CiAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgbGlzdC1zdHlsZTog
bm9uZTsKICAgICAgICAgICAgbWFyZ2luOiAwcHg7CiAgICAgICAgICAgIHBhZGRpbmc6IDBweDsK
ICAgICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAg
fQogICAgICAgIC5zbGlkZS1zZXQtLWhlcm8gLnBhZGRsZXMgbGksIC5uZXdzLXNlY29uZGFyeS1z
ZWN0aW9uIC5wYWRkbGVzIGxpIHsKICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKICAgICAg
ICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgcGFkZGluZzogMHB4OwogICAgICAg
ICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIHRvcDogNTAlOwogICAgICAgICAg
ICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAg
ICAgICBsaW5lLWhlaWdodDogNTNweDsKICAgICAgICAgICAgY29sb3I6IHJnYmEoMTM2LCAxMzYs
IDEzNiwgMC44KTsKICAgICAgICB9CiAgICAgICAgLnNsaWRlLXNldC0taGVybyAucGFkZGxlcyBs
aSBidXR0b24sIC5uZXdzLXNlY29uZGFyeS1zZWN0aW9uIC5wYWRkbGVzIGxpIGJ1dHRvbiB7CiAg
ICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbm9u
ZTsKICAgICAgICB9CgogICAgICAgIC5zbGlkZS1zZXQtLWhlcm8gLnBhZGRsZXMgbGkucHJldiwg
Lm5ld3Mtc2Vjb25kYXJ5LXNlY3Rpb24gLnBhZGRsZXMgbGkucHJldiB7CiAgICAgICAgICAgIGxl
ZnQ6IC0yMDBweDsKICAgICAgICB9CiAgICAgICAgLnNsaWRlLXNldC0taGVybyAucGFkZGxlcyBs
aS5uZXh0LCAubmV3cy1zZWNvbmRhcnktc2VjdGlvbiAucGFkZGxlcyBsaS5uZXh0IHsKICAgICAg
ICAgICAgcmlnaHQ6IC0yMDBweDsKICAgICAgICB9CgogICAgICAgIC5oZXJvc2xpZGUtY29udGFp
bmVyIHsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICBvdmVyZmxv
dzogaGlkZGVuOwogICAgICAgIH0KCiAgICAgICAgLmhlcm8taXRlbSB7CiAgICAgICAgICAgIHBv
c2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB9CgogICAgICAgIC5oZXJvLWl0ZW0gLmNvbnRlbnQg
ewogICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIH0KCiAgICAgICAg
Lmhlcm8taXRlbSAuaW1hZ2UgewogICAgICAgICAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgICAg
ICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB9
CgogICAgICAgIC5oZXJvLWl0ZW0gLmltYWdlIHsKICAgICAgICAgICAgaGVpZ2h0OiA0NDBweDsK
ICAgICAgICAgICAgd2lkdGg6IDExMjBweDsKICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAg
ICAgICAgICAgIG1heC13aWR0aDogMTAxJTsKICAgICAgICB9CgogICAgICAgIC5oZXJvLWl0ZW0t
ZnVsbCB7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBmbGV4OiAwIDAgMTAw
JTsKICAgICAgICB9CgogICAgICAgIC5oZXJvc2xpZGUtc2V0IHsKICAgICAgICAgICAgZGlzcGxh
eTogZmxleDsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICB0cmFu
c2Zvcm06IHRyYW5zbGF0ZTNkKDBweCwgMHB4LCAwcHgpOwogICAgICAgIH0KCiAgICAgICAgLnNs
aWRlLXNldC0taGVybyB7CiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB9
CiAgICA8L3N0eWxlPgogIDwvYm9keT4KPC9odG1sPjxzY3JpcHQ+Cgo8L3NjcmlwdD4=
</data>

          </attachment>
      

    </bug>

</bugzilla>