[GTK][WPE] Skia Compositor: use deferred display lists to paint tiles
Source/WebCore/platform/graphics/skia/SkiaPaintingEngine.cpp
Source/WebCore/platform/graphics/skia/SkiaUtilities.cpp
WebKit의 GTK/WPE coordinated compositor는 페이지를 backing store 단위의 tile로 분할하고, worker thread pool을 통해 tile을 병렬로 렌더링합니다. 기존 방식에서는 각 worker가 독립적인 Skia GrContext를 보유해야 했습니다. GrContext는 thread에 종속되며 생성 비용이 높은 GPU 컨텍스트 핸들입니다. Skia의 Deferred Display List(DDL) 기능은 recording과 실행을 분리합니다. SkDeferredDisplayListRecorder는 GPU 호출 없이 draw command를 직렬화된 목록으로 캡처하고, 이후 SkDDLPlayer가 실제 GrContext thread에서 이를 replay합니다. GPU texture는 특정 GrContext에 종속되므로 DDL에 직접 포함할 수 없습니다. 이에 대한 Skia의 해결책이 promise image입니다. Promise image는 SkImage의 placeholder로, replay 시점에 GPU thread에서 fulfillment callback(promiseImageTexture)이 호출되어 실제 backend texture를 제공합니다.
이 commit은 해당 전체 pipeline을 구현합니다. Worker는 GL 관여 없이 DDL에 recording하고, compositor thread가 이를 GPU surface에 replay합니다. 기록 시점에 GPU에 상주하는 image는 Skia promise image로 래핑되며, texture 결정은 PromiseImageContext callback을 통해 replay 시점으로 지연됩니다. 이 commit은 SkiaPaintingEngine::record/replay, SkiaReplayCanvas, PromiseImageContext를 추가합니다.
Before (direct GL on workers): After (DDL record/replay):
Worker Thread N Worker Thread N Compositor Thread
└── GrContext (per thread) └── SkDDLRecorder └── SkiaReplayCanvas
└── paint tile → GPU surface └── record(tile) └── replay(DDL, GrContext)
└── accel image └── PromiseImageContext::
→ PromiseImage promiseImageTexture()
(placeholder) └── resolve → GPU texture
Significance
Worker별 GrContext 생성을 제거함으로써 GPU resource 비용을 크게 줄이고, cross-thread 직접 렌더링에서 비롯되던 GL context sharing 위험도 함께 해소되었습니다. Worker의 tile recording에는 더 이상 GL이 관여하지 않으며, 단일 GPU thread가 live GrContext를 독점적으로 소유합니다. 구조적으로 훨씬 단순한 모델입니다. 한편 promise image를 통한 cross-thread GPU texture ownership protocol은 아키텍처 면에서 중요한 변화로, 기존 WebKit에 없던 새로운 동기화 지점을 도입합니다.