juj/wasm_webgpu
System headers for interfacing WebGPU from C programs compiled via Emscripten to WebAssembly
개요
wasm_webgpu는 Emscripten으로 WebAssembly로 컴파일된 C/C++ 프로그램이 브라우저의 WebGPU 그래픽스 API와 통신할 수 있게 해주는 작은 오픈 소스 라이브러리입니다. 브라우저 측 WebGPU JavaScript API를 얇고 1:1로 매핑하므로 개발자는 네이티브 C/C++로 GPU 가속 렌더링 코드를 작성하고 브라우저에서 실행할 수 있습니다(실험적으로는 브라우저 외부에서 Dawn을 통해 실행할 수도 있습니다).
기능
| 기능 | 의미 |
|---|---|
헤더 + 구현 파일 (lib_webgpu.*) |
이 파일을 Emscripten 프로젝트에 넣고 lib_webgpu.h를 포함하면 wgpu_adapter_request_device_sync()와 같이 기본 WebGPU JS 함수를 호출하는 C 스타일 래퍼를 사용할 수 있습니다. |
| 정확한 API 매핑 | GPUAdapter 같은 타입은 WGpuAdapter가 되고 함수는 동일한 형태를 유지합니다 (wgpu_canvas_context_configure). 따라서 C 코드를 작성할 때 사양이 신뢰할 수 있는 참조가 됩니다. |
| 성능 중심 | 바인딩 레이어는 의도적으로 저수준이며 추가 JavaScript 객체를 피합니다. Closure Compiler와 함께 작동하여 적극적인 축소화를 지원하고 런타임 오버헤드와 생성된 코드 크기를 최소화합니다. |
| 사용자 정의 헬퍼 | 매핑된 버퍼 읽기/쓰기 및 URL에서 이미지 로딩 기능은 JS와 Wasm 사이에서 전달하기 어려운 일반적인 WebGPU 작업을 단순화합니다. |
| JSPI(동기 API) 지원 | 선택적 플래그(-sJSPI)를 사용하면 일반적으로 비동기인 WebGPU 호출의 동기 버전을 노출합니다. 빠른 프로토타입이나 테스트 하니스에 유용합니다. |
| OffscreenCanvas 및 워커 | WebWorker 또는 pthread에서 OffscreenCanvas를 생성하고 제어하는 API를 제공하여 백그라운드 스레드에서 렌더링할 수 있습니다. |
| 메모리 모델 유연성 | Emscripten의 2GB, 4GB 및 Wasm64 메모리 구성에서 작동하므로 필요한 경우 대용량 데이터 세트를 대상으로 할 수 있습니다. |
| Dawn 백엔드(실험적) | 별도의 소스 파일(lib_webgpu_dawn.cpp)을 사용하면 브라우저 외부에서 WebGPU의 Dawn 구현에 대해 컴파일할 수 있습니다. 다만 주요 초점은 아닙니다. |
사용 대상
- 게임 또는 그래픽 엔진 개발자: 핵심 렌더링 코드를 C/C++로 유지하고 JavaScript나 WebGL로 다시 작성하지 않고 웹에 배포하려는 경우.
- 연구 코드베이스: 네이티브 C++에서 이미 GPU 컴퓨트를 사용하고 있으며 데모나 재현성을 위해 브라우저에서 실행할 수 있는 빠른 경로가 필요한 경우.
- 도구 작성자: 동기 API와 최소 코드 크기의 이점을 활용하는 WebGPU 기반 시각화 도구, 편집기 또는 테스트 스위트를 구축하는 경우.
시작하기 (빠른 요약)
- Emscripten을 설치합니다.
- 저장소를 클론하고
lib/파일을 프로젝트에 복사한 다음 Emscripten 링크 단계에 라이브러리를 추가합니다 (--js-library …). samples/에 제공된 CMakeLists를 템플릿으로 사용합니다.emcmake cmake … && ninja로 빌드한 다음 생성된 HTML을emrun .으로 제공합니다.
제한 사항 / 주의 사항
- 라이브러리는 현재 WebGPU 사양을 정확히 반영합니다. 사양이 발전함에 따라 파괴적인 변경이 발생할 수 있으며 ABI 안정성은 보장되지 않습니다.
- Dawn 백엔드는 오래되었으며 적극적으로 유지 관리되지 않습니다.
- 이는 바인딩 레이어일 뿐입니다. 실제 렌더링 로직은 직접 작성해야 합니다. 제공된 샘플은 의도적으로 단순하며 화려하지 않습니다.
- JSPI를 사용하면 예기치 않은 이벤트 루프 상호 작용이 발생할 수 있으므로 프로덕션 코드에는 프로파일링을 권장합니다.
결론
wasm_webgpu는 WebAssembly로 컴파일된 C/C++에서 WebGPU에 접근할 수 있게 해주는 진정한 저수준 브리지입니다. 고수준 그래픽 엔진을 찾는 개발자보다는 성능, 코드 크기, 공식 WebGPU 사양에 충실함을 중시하는 개발자를 대상으로 합니다.
관련
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트