WGSL과 Rust 구조체 레이아웃 차이, facet 런타임 리플렉션 단위 테스트로 잡는다
- WGSL의 mat3x3f는 행마다 4바이트 패딩이 붙어 48바이트인데 Rust [[f32; 3]; 3]는 36바이트로 꽉 차 있어서, 뒤따르는 image_size 필드 오프셋이 48 대 36으로 어긋나고 테스트가 이걸 잡아냄
- naga로 WGSL struct 레이아웃을 파싱하고 facet의 런타임 리플렉션(SHAPE)과 std::mem::offset_of!를 맞대어 필드별 오프셋 불일치를 자동 검출함
- wgsl_to_wgpu, wgsl_bindgen, encase 같은 기존 도구 대신 직접 만든 이유는 외부 의존성과 빌드 스크립트를 늘리지 않으려는 것임. 대신 새 설정 객체를 테스트에 빠뜨릴 수 있다는 실패 모드는 감수함
- 컴퓨트 셰이더의 실패 모드가 GPU 스레드가 계속 돌아 컴퓨터를 재부팅해야 하는 상황이라, 최근 재부팅 하나를 디버깅한 뒤 시스템적으로 고치기로 함
- 마지막 멤버로 런타임 크기 배열을 두는 VoxelConfig 같은 구조체도 검사 대상에 포함됨
Hacker News opinions
Vulkan 버퍼 정렬 문제로 시간 엄청 날렸는데, WebGPU는 처음부터 Facet 같은 도구가 있어서 큰 이득임.
이거 진짜 좋다. 언어가 타입을 컴파일 타임 검사로만 두는 게 아직도 이해가 안 감. TypeScript는 5년 넘게 진전이 없고 초기 실험만 죽었잖아.
참고로 uniform 버퍼 구조체 레이아웃을 다른 주소 공간이랑 맞춰주는 WebGPU 확장이 있는데 지금은 크로미움 계열만 구현돼 있음. std140 스타일 제약은 GPU가 uniform 데이터에 vec4 레지스터 테이블을 쓰던 시절의 잔재임.