WebCore and WebKit move to the WebGPU C++ API
Component: WebGPU | 668135a
Source/WebCore/Modules/WebGPU/GPU.cpp
WebKit의 WebGPU는 여러 계층으로 나뉘어 있습니다. 먼저 WebCore에서 JS에 노출되는 GPU* 클래스가 descriptor를 backing type으로 변환합니다. GPU process 모델에서는 이 값이 Web Process의 RemoteXProxy 객체를 거쳐 IPC로 직렬화됩니다. 이후 GPU Process의 RemoteX 객체가 Metal 구현 위에서 이를 다시 실행합니다. 이때 권한이 높은 쪽은 GPU Process입니다. 그래서 IPC converter, descriptor decoding, handle을 객체로 변환하는 과정이 장악된 Web Process로부터 GPU Process를 보호하는 방어선 역할을 합니다.
이 commit에서는 WebCore와 WebKit이 WebGPU와 통신하는 방식이 변경되었습니다. 기존에는 C API, InternalAPI 추상 클래스, *Impl wrapper를 거쳤습니다. 이제는 WebGPUCpp.h에 정의된 C++ API(WebGPU::X)를 직접 사용합니다. 그 결과 WebCore::GPUX는 Ref<WebGPU::X>를 보유하고, RemoteXProxy는 WebGPU::X를 구현하며, RemoteX는 WebGPU::Metal::X를 감싸도록 바뀌었습니다. 한편 InternalAPI/, WebGPUPtr.h, ConvertToBackingContext helper, 그리고 isRemoteXProxy()/isXImpl() 검사는 모두 삭제되었습니다.
Significance
Web Process와 GPU Process 사이의 WebGPU 경계가 새로 작성되었습니다. 또한 알 수 없는 buffer-usage 및 color-write-mask bit는 더 이상 조용히 버려지지 않고, Invalid로 처리되어 validation 단계에서 실패합니다.
Audit directions
- 대상이 변경된 IPC converter와
WebGPU.serialization.in을 살펴볼 필요가 있습니다. 모든 handle, enum, flag 필드가 여전히 GPU Process 쪽에서 검증되어야 합니다. Wire format 자체는 바뀌지 않았으므로, decoding이 이제 C++ API 타입에 의존하게 된 필드를 중심으로 점검하는 것이 좋습니다. - 새로 도입된
BufferUsage/ColorWrite의Invalid값을 모든 사용 지점에서 사용 전에 검사하는지 확인해야 합니다. 특히 검사를 건너뛴 채 범위를 벗어난 값을 Metal 코드로 전달하는 descriptor 변환 경로가 없는지 살펴봐야 합니다. - 이제 descriptor는 배열을 span 형태로 빌려 씁니다. 따라서 backing storage가 각 호출보다 오래 유지되는지 확인해야 합니다. Descriptor를 나중에 변환하는 비동기 pipeline 생성 경로가 특히 주의 대상입니다.
isRemoteXProxy()/isXImpl()기반 downcast가 제거되었습니다. 그 자리에 검사 없는 static cast가 새로 생기지 않았는지, proxy가 Metal 객체로 혼동될 수 있는 지점이 없는지 검색해볼 필요가 있습니다.- 이제 label은
WebCore::GPUX가 소유하므로 label의 lifetime을 점검해야 합니다. 또한 configure,unconfigure(), resize를 거치는 과정에서 stale render buffer나 크기 불일치가 남지 않는지 확인이 필요합니다. 마지막으로 raw CF reference가 전달되는 ARC/non-ARC 혼합 경계에서 retain/release 균형이 맞는지도 살펴봐야 합니다.