Bug 236699 - REGRESSION (iOS 15.4b3): Catastrophic (20x) performance regression in texImage2D from mp4 video
Summary: REGRESSION (iOS 15.4b3): Catastrophic (20x) performance regression in texImag...
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: WebGL (show other bugs)
Version: Safari 15
Hardware: Unspecified Unspecified
: P2 Major
Assignee: Kimmo Kinnunen
URL:
Keywords: InRadar
Depends on: 220896
Blocks:
  Show dependency treegraph
 
Reported: 2022-02-16 02:23 PST by Simon Taylor
Modified: 2022-03-15 04:03 PDT (History)
11 users (show)

See Also:


Attachments
Patch (2.45 KB, patch)
2022-02-17 00:03 PST, Kimmo Kinnunen
no flags Details | Formatted Diff | Diff
STP 141 on MacBook Pro with M1 Pro (2.04 MB, video/quicktime)
2022-03-15 04:03 PDT, Simon Taylor
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Simon Taylor 2022-02-16 02:23:26 PST
Another major video texImage2D performance regression has appeared with iOS 15.4 beta.

Using my usual test cases from Bug 216250, featuring a 720p video:
https://tango-bravo.net/WebGLVideoPerformance/texImage2d_video.html (uses gl.RGB format and internal format)
https://tango-bravo.net/WebGLVideoPerformance/texImage2d_video_rgba.html (uses gl.RGBA format and internal format)

On an iPhone 12 Pro with iOS 15.4 beta 3, the first one results in ~60ms per frame for texImage2D and the second one is ~40ms. I've confirmed with systrace that the CPU is busy for all that time in the WebKit content process, and running on a performance core.

This is around a 20x performance regression (previously typical timings were in the 2-3ms range when CPU is running with high clocks).

---

In case it's helpful:

I know in the past some of these regressions have been caused by the compressed internal IOSurface formats - I wonder if it might be worth explicitly requesting a non-compressed format for AVPlayerItemVideoOutput / AVCaptureVideoDataOutput?

Something like this (ideally I suppose you'd pick the best match for the source video in terms of full / video range):

NSDictionary *pixBuffAttributes = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange],
                                   (id)kCVPixelBufferPixelFormatTypeKey, nil];

AVPlayerItemVideoOutput* output = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:pixBuffAttributes];

I struggled to find much about the compressed IOSurface support, but this WWDC talk is the best reference I've seen:
https://developer.apple.com/videos/play/wwdc2021/10047/?time=1843
Comment 1 Radar WebKit Bug Importer 2022-02-16 07:22:20 PST
<rdar://problem/89024095>
Comment 2 Simon Taylor 2022-02-16 09:37:46 PST
This isn't reproducible on an iPod touch 7th gen with 15.4b3, which points towards this being another one specific to the compressed IOSurface formats.
Comment 3 Jer Noble 2022-02-16 19:58:48 PST
Thanks for the report. It looks like this is due to a change in ANGLE, introduced in r286603. The compressed pixel buffers are failing validation inside IOSurfaceSurfaceMtl::ValidateAttributes().
Comment 4 Kenneth Russell 2022-02-16 23:59:21 PST
To clarify, that was the ANGLE roll performed in Bug 220896 in early December 2021, which resolved 1+ year of divergent work.

Can this bug be reproduced on macOS, perhaps on the M1 GPU?

Which incoming compressed pixel format is failing validation? Was an entry dropped in ANGLE's format tables during the upstreaming process?
Comment 5 Kimmo Kinnunen 2022-02-17 00:03:37 PST
Created attachment 452332 [details]
Patch
Comment 6 EWS Watchlist 2022-02-17 00:05:24 PST
Note that there are important steps to take when updating ANGLE. See https://trac.webkit.org/wiki/UpdatingANGLE
Comment 7 EWS 2022-02-17 05:14:24 PST
Committed r290011 (247397@main): <https://commits.webkit.org/247397@main>

All reviewed patches have been landed. Closing bug and clearing flags on attachment 452332 [details].
Comment 8 Darin Adler 2022-02-17 06:31:17 PST
Regression test to prevent his kind of mistake from being reintroduced in future?
Comment 9 Darin Adler 2022-02-17 06:33:08 PST
Oh, I see: coming in bug 236759
Comment 10 Jer Noble 2022-02-17 11:14:54 PST
(In reply to Kenneth Russell from comment #4)
> To clarify, that was the ANGLE roll performed in Bug 220896 in early
> December 2021, which resolved 1+ year of divergent work.
> 
> Can this bug be reproduced on macOS, perhaps on the M1 GPU?
> 
> Which incoming compressed pixel format is failing validation? Was an entry
> dropped in ANGLE's format tables during the upstreaming process?

The format in question was kCVPixelFormatType_Lossless_420YpCbCr8BiPlanarVideoRange, documented (kind of) here: <https://developer.apple.com/documentation/corevideo/3746862-anonymous/kcvpixelformattype_lossless_420ypcbcr8biplanarvideorange>.  The compression means that each "element" in a given plane is a block of multiple pixels. While each pixel within that element conforms correctly to the validation (two-components, each component occupies 1 byte, etc.), the element as a whole does not, and so the 
return value of IOSurfaceGetBytesPerElementOfPlane() is much, much larger than ANGLE expects.
Comment 11 Dustin Kerstein 2022-02-18 07:39:31 PST
Are there any known workarounds for this issue in case this makes it out in the official iOS 15.4? From the original post it seems to affect both RGB and RGBA textures, but if there are any ways to avoid this perf regression, it'd be good to post here for folks who may encounter it.
Comment 12 Simon Taylor 2022-02-18 08:54:04 PST
(In reply to Kenneth Russell from comment #4)
> Can this bug be reproduced on macOS, perhaps on the M1 GPU?

It does reproduce on my M1 Pro MBP in the latest Safari Tech Preview 140. Weirdly there it is reporting 60 FPS still and upload timings around 13ms but the video is noticeably jankier that those timings suggest.

(In reply to Dustin Kerstein from comment #11)
> Are there any known workarounds for this issue in case this makes it out in
> the official iOS 15.4? From the original post it seems to affect both RGB
> and RGBA textures, but if there are any ways to avoid this perf regression,
> it'd be good to post here for folks who may encounter it.

This is basically the same bug that was with us in iOS 14 up until 14.6 and I don't know of any workarounds from that time. It's a small patch so I'm guessing the chances are good it will be fixed by 15.4 final, but Apple of course will not comment on such a thing as they enjoy giving us all sleepless nights waiting for the release to drop to a few hundred million users :)
Comment 13 Simon Taylor 2022-03-15 04:00:05 PDT
I've just checked with the 15.4 RC build on iPhone 12 Pro, and the performance regression has been resolved there, so I can sleep a little more easily waiting for the final 15.4 to drop now.

On the Mac side, the latest STP 141 (from March 3rd) still suffers from this issue on M1 systems.
Comment 14 Simon Taylor 2022-03-15 04:03:48 PDT
Created attachment 454688 [details]
STP 141 on MacBook Pro with M1 Pro

Attached a video of the RGBA test page in STP 141 on my M1 Pro MBP.

You can see it claims to be hitting 60 FPS consistently, but the upload time is high. The actual playback does look much jankier than usual, so there is something else slightly odd happening - possibly just the decode progress being somewhat starved of CPU time by the software fallback upload path?