Bug 231404

Summary: Split DisplayList::Recorder into an abstract base class and a concrete implementation
Product: WebKit Reporter: Wenson Hsieh <wenson_hsieh>
Component: WebCore Misc.Assignee: Wenson Hsieh <wenson_hsieh>
Status: RESOLVED FIXED    
Severity: Normal CC: annulen, cdumez, changseok, darin, esprehn+autocc, ews-watchlist, gyuyoung.kim, mmaxfield, ryuan.choi, sabouhallawa, sergio, simon.fraser, thorton, webkit-bug-importer
Priority: P2 Keywords: InRadar
Version: WebKit Nightly Build   
Hardware: Unspecified   
OS: Unspecified   
Attachments:
Description Flags
For EWS
ews-feeder: commit-queue-
Fix GTK/WPE builds
ews-feeder: commit-queue-
Fix GTK/WPE builds
ews-feeder: commit-queue-
Fix GTK/WPE builds
none
Fix GTK/WPE builds
ews-feeder: commit-queue-
Fix CMake build
none
For EWS none

Description Wenson Hsieh 2021-10-07 17:27:20 PDT
More work towards streaming display lists.

This refactoring will allow us to introduce a WebKit2-specific subclass of DisplayList::Recorder in a subsequent patch, which is similar to the existing DisplayList::Recorder object, but immediately sends its display list items to the GPU Process through the IPC stream connection instead of appending them to an instance of WebCore::DisplayList.
Comment 1 Wenson Hsieh 2021-10-08 07:51:04 PDT Comment hidden (obsolete)
Comment 2 Wenson Hsieh 2021-10-08 08:02:05 PDT Comment hidden (obsolete)
Comment 3 Wenson Hsieh 2021-10-08 08:11:49 PDT Comment hidden (obsolete)
Comment 4 Wenson Hsieh 2021-10-08 08:22:41 PDT Comment hidden (obsolete)
Comment 5 Wenson Hsieh 2021-10-08 08:30:36 PDT Comment hidden (obsolete)
Comment 6 Wenson Hsieh 2021-10-08 09:31:57 PDT
Created attachment 440631 [details]
Fix CMake build
Comment 7 Myles C. Maxfield 2021-10-08 12:56:01 PDT
Comment on attachment 440631 [details]
Fix CMake build

View in context: https://bugs.webkit.org/attachment.cgi?id=440631&action=review

> Source/WebCore/ChangeLog:10
> +        DisplayList::RecorderImpl. See below for more details.

Other places we use Concrete. Not sure which is better.

> Source/WebCore/ChangeLog:44
> +        data or drawing simple paths. The base class also manages updating and maintaining the state stack (a list of
> +        Recorder::ContextState) when modifying graphics context state.

Cool. Enabling this code sharing was my biggest concern.

> Source/WebCore/platform/graphics/cocoa/GraphicsContextCocoa.mm:29
> +#import "DisplayListRecorderImpl.h"

Is this necessary?

> Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp:-66
> -    if (!m_isNested)
> -        LOG(DisplayLists, "Recorded display list:\n%s", m_displayList.description().data());

Who is using m_isNested now? Can it be deleted?

> Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp:401
> -    append<StrokeEllipse>(rect);
> +    appendStateChangeItemIfNecessary();
> +    recordStrokeEllipse(rect);

It seems unfortunate that the appendStateChange logic had to be moved from one centralized place into all its callers, duplicating the call. Is there a better way? Can we at least do some code sharing?

> Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h:140
> +    virtual void recordResourceUse(NativeImage&) = 0;
> +    virtual void recordResourceUse(Font&) = 0;
> +    virtual void recordResourceUse(ImageBuffer&) = 0;

I would have renamed these in a follow-up patch, to keep this one smaller.

> Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h:189
>      // FIXME: Maybe remove this?

Looks like you're removing this. Perhaps the comment can be removed too?
Comment 8 Wenson Hsieh 2021-10-08 13:17:15 PDT
Comment on attachment 440631 [details]
Fix CMake build

View in context: https://bugs.webkit.org/attachment.cgi?id=440631&action=review

Thanks for the review!

>> Source/WebCore/ChangeLog:10
>> +        DisplayList::RecorderImpl. See below for more details.
> 
> Other places we use Concrete. Not sure which is better.

So I chatted with Tim (proposing either ConcreteRecorder and RecorderImpl), and we decided on RecorderImpl. Overall, we seem to use FooImpl a lot more than ConcreteFoo (I think ConcreteImageBuffer is actually the only instance?)

>> Source/WebCore/ChangeLog:44
>> +        Recorder::ContextState) when modifying graphics context state.
> 
> Cool. Enabling this code sharing was my biggest concern.

Indeed! This refactoring allows us to avoid a lot of the duplicate code that was in my hacky WIP.

> Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp:33
> +#include "DisplayListRecorderImpl.h"

Looks like this change is also unnecessary, so I'll change this back too.

>> Source/WebCore/platform/graphics/cocoa/GraphicsContextCocoa.mm:29
>> +#import "DisplayListRecorderImpl.h"
> 
> Is this necessary?

It's not — good catch! Reverted this bit.

>> Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp:-66
>> -        LOG(DisplayLists, "Recorded display list:\n%s", m_displayList.description().data());
> 
> Who is using m_isNested now? Can it be deleted?

Good catch, it looks like this is actually *just* used inside `RecorderImpl::~RecorderImpl()` for a single logging statement. I'll just move this into the RecorderImpl, and remove the protected getter.

>> Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp:401
>> +    recordStrokeEllipse(rect);
> 
> It seems unfortunate that the appendStateChange logic had to be moved from one centralized place into all its callers, duplicating the call. Is there a better way? Can we at least do some code sharing?

Yeah, this is a bit unfortunate :/

I wasn't sure how to avoid this though, since we no longer templatize item recording methods, since they're now virtual. I'll add a FIXME in `appendStateChangeItemIfNecessary()`, and continue to think of ways to improve this.

>> Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h:140
>> +    virtual void recordResourceUse(ImageBuffer&) = 0;
> 
> I would have renamed these in a follow-up patch, to keep this one smaller.

Hm..I'm not sure how this would work though, since these are new virtual methods (not renamed versions of existing methods).

>> Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h:189
>>      // FIXME: Maybe remove this?
> 
> Looks like you're removing this. Perhaps the comment can be removed too?

Oh, I moved `canDrawImageBuffer` into the protected section of the class, but forgot to move this comment. I'll move the FIXME to match the `canDrawImageBuffer` again.
Comment 9 Wenson Hsieh 2021-10-08 13:46:10 PDT
Created attachment 440666 [details]
For EWS
Comment 10 EWS 2021-10-08 16:09:50 PDT
Committed r283848 (242727@main): <https://commits.webkit.org/242727@main>

All reviewed patches have been landed. Closing bug and clearing flags on attachment 440666 [details].
Comment 11 Radar WebKit Bug Importer 2021-10-08 16:11:41 PDT
<rdar://problem/84047977>
Comment 12 Darin Adler 2021-10-11 17:42:11 PDT
Comment on attachment 440631 [details]
Fix CMake build

View in context: https://bugs.webkit.org/attachment.cgi?id=440631&action=review

>>> Source/WebCore/ChangeLog:10
>>> +        DisplayList::RecorderImpl. See below for more details.
>> 
>> Other places we use Concrete. Not sure which is better.
> 
> So I chatted with Tim (proposing either ConcreteRecorder and RecorderImpl), and we decided on RecorderImpl. Overall, we seem to use FooImpl a lot more than ConcreteFoo (I think ConcreteImageBuffer is actually the only instance?)

Sad to hear it. I personally like Concrete so much better than Impl!

But without our traditions … our lives would be as shaky as a programmer on the roof.