← All reports

WebGPU: Make WebCore and WebKit use WebGPU C++ API

Component: WebGPU | b6ab04a

Source/WebCore/Modules/WebGPU/GPUAdapter.cpp

-GPUAdapter::GPUAdapter(Ref<WebGPU::Adapter>&& backing)
+GPUAdapter::GPUAdapter(Ref<WebGPU::Adapter>&& backing, Ref<WebGPUIntegration>&& gpu)
: m_backing(WTF::move(backing))
+ , m_gpu(WTF::move(gpu))
+ , m_adapterInfo(m_backing->info())
...
+static std::optional<::WebGPU::Limits> requiredLimits(const WebGPUDeviceDescriptor& descriptor, const ::WebGPU::Limits& supportedLimits)
+{
+ auto limits = ::WebGPU::defaultLimits();
+ for (const auto& pair : descriptor.requiredLimits) {
+ ...
+ if (pair.value > supportedLimits.LIMIT || !setMaxIntegerValue(limits.LIMIT, pair.value))
+ return std::nullopt;

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 }

이번 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로 변환됩니다.