WebGPU: Make WebCore and WebKit use WebGPU C++ API
Component: WebGPU | b6ab04a
Source/WebCore/Modules/WebGPU/GPUAdapter.cpp
WebKit의 WebGPU는 여러 process에 나뉘어 동작합니다. 먼저 Web Process에서는 JS binding(GPUDevice, GPUBuffer, …)이 실행되고, 이 binding은 proxy와 통신합니다. Proxy는 호출을 serialize한 뒤 IPC로 GPU Process에 전달하며, GPU Process에서는 RemoteX 객체가 Metal 기반 구현을 보유하는 구조입니다. 이때 IPC를 넘어오는 handle은 object heap을 통해 resolve되고, descriptor는 필드 단위로 변환됩니다. 결과적으로 type 정의와 converter가 곧 신뢰할 수 없는 renderer로부터 GPU Process가 무엇을 받아들일지를 결정하는 셈입니다.
이번 변경으로 WebCore와 WebKit은 WebGPU C++ API(WebGPU::X, WebGPU/WebGPUCpp.h에 정의)를 구현체에 접근하는 유일한 인터페이스로 사용하게 되었습니다. 더 이상 wgpu* 함수나 WGPU* 타입은 직접 다루지 않습니다. 구체적으로는 WebCore::GPUX가 Ref<WebGPU::X>를 보유하고, Web Process에서는 RemoteXProxy가 WebGPU::X를 구현합니다. 반대편의 RemoteX는 WebGPU::Metal::X를 감싸는 형태로 바뀌었습니다. 한편 XImpl 클래스, isRemoteXProxy()/isXImpl() 검사, C API 변환 helper, InternalAPI 디렉터리는 모두 제거되었습니다. IPC converter 역시 API 타입을 대상으로 하도록 변경되었습니다.
Before:
WebCore (JS binding) └─► WebCore::WebGPU::X (abstract)
├─► XImpl ──► ConvertToBackingContext ──► wgpu*/WGPU* C API
└─► RemoteXProxy ──IPC──► RemoteX ──► WebGPU::XImpl ──► WGPU* C API
After:
WebCore::GPUX { Ref<WebGPU::X>, label } └─► WebGPU::X (WebGPUCpp.h)
├─► WebGPU::Metal::X (in-process)
└─► RemoteXProxy ──IPC (API structs)──► RemoteX { WebGPU::Metal::X as WebGPU::X }
Significance
이번 commit은 단일 변경으로 WebContent process와 GPU process 사이의 WebGPU object model, 그리고 그 IPC serialization을 함께 다시 작성했습니다. 이전에는 bit 16 이상의 알 수 없는 GPUBufferUsage bit가 버려졌지만, 이제는 validation에서 실패하는 Invalid sentinel로 매핑됩니다. 네 개의 channel bit 범위를 넘는 color write mask도 마찬가지로 WebGPU::ColorWrite::Invalid로 변환됩니다.
Audit directions
- 비동기 경계를 넘는 borrowed span. Descriptor는 이제 배열을 span 형태로 빌려 사용합니다. 따라서 pipeline 생성처럼 비동기로 동작하는 경로에서 dangling span이 생기는지 살펴볼 필요가 있습니다. IPC decode 결과를 descriptor로 옮기는 경로도 같은 관점에서 점검 대상입니다.
- Serializer 동등성. Object handle을 포함하지 않는 descriptor는 이제 raw API struct 형태로 전달됩니다. 이때
WebGPU.serialization.in이 enum, flag, 배열 크기를 이전과 동일하게 검증하는지 확인해야 합니다. 또한 새로 도입된Invalidsentinel이 GPU Process 안에서 도달 가능한 모든 지점에서 처리되는지도 살펴볼 필요가 있습니다. - 사라진 type guard.
isRemoteXProxy()/isXImpl()와 downcast helper가 제거되었습니다. 이 type confusion guard를 무엇이 대신하고 있는지 확인해야 합니다. 나아가RemoteX가 잘못된 concrete type일 수도 있는WebGPU::X를 그대로 신뢰하는지도 점검 대상입니다. - Canvas presentation 객체의 lifetime.
unconfigure()가 이제 presentation context까지 도달하고, 크기 정보는CanvasConfiguration을 통해 전달됩니다. 그래서 render buffer 재생성, resize, teardown의 실행 순서를 검토할 필요가 있습니다. XR layer backing의 lifetime도 함께 살펴봐야 합니다. - ARC/non-ARC 경계. 새 경계에서는
RetainPtr대신 raw CF reference와 span이 사용됩니다. 이런 지점은 leak이나 over-release가 발생하기 쉬운 전형적인 위치에 해당합니다. 한편 WebCore에 새로 저장되는 label은 상대적으로 부차적인 점검 사항입니다.