언리얼 엔진의 성공적인 메시 셰이더 데모는 커뮤니티에 엄청난 영감을 주었다. WebGPU의 미래는 그 어느 때보다 밝아 보였다. 하지만 드미트리는 그 화려한 성공의 이면에, 새로운 종류의 그림자가 드리우고 있음을 감지하고 있었다.
그 그림자의 정체는 구글 내부의 한 데이터 시각화 팀과의 기술 자문 미팅에서 드러났다.
그 팀은 수천 개의 서로 다른 데이터셋을, 각각 고유한 스타일과 모양의 3D 차트로 렌더링하는 라이브러리를 개발하고 있었다.
팀의 리드 엔지니어, 헬레나가 문제를 설명했다.
“저희는 WebGPU의 파이프라인 개념을 적극적으로 활용하고 있습니다. 각 차트 스타일에 맞춰, 수백 개의 서로 다른 렌더 파이프라인을 미리 생성해두죠. 렌더링 성능 자체는 환상적입니다. 문제는… 애플리케이션의 초기 로딩 시간입니다.”
그녀는 성능 분석 도구의 타임라인 뷰를 화면에 띄웠다. 페이지가 로드되고 첫 번째 차트가 그려지기까지, 무려 5초에 가까운 시간이 소요되고 있었다. 그리고 그 시간의 대부분을 차지하는 것은 거대한 보라색 막대였다. 막대 위에는 ‘Shader Compilation(셰이더 컴파일)’이라고 쓰여 있었다.
헬레나가 말했다.
“사용자가 페이지에 접속하는 순간, 저희는 수백 개의 WGSL 셰이더들을 한 번에 컴파일해서 파이프라인을 생성합니다. 이 과정이 특히 저사양 기기나 모바일에서 너무 오래 걸립니다. 사용자들은 텅 빈 화면을 5초나 보고 있어야 하는 거죠. 이건 웹에서는 용납될 수 없는 시간입니다.”
드미트리는 문제의 심각성을 즉시 깨달았다.
WebGPU는 런타임의 CPU 오버헤드를 줄이기 위해, 많은 계산을 ‘사전(Upfront)’에 처리하도록 설계되었다. 파이프라인 생성, 그리고 그 핵심인 셰이더 컴파일이 바로 그 대표적인 예시였다. 하지만 개발자들이 이 ‘사전 비용’을 고려하지 않고 너무 많은 파이프라인을 한 번에 생성하려 하자, 그것이 새로운 형태의 병목, 즉 ‘초기 로딩 병목’을 만들어낸 것이다.
이것은 메시 셰이더와는 또 다른, WebGPU 1.0 자체에 내재된 근본적인 문제였다.
회의가 끝나고, 드미트리는 이 문제를 해결할 방법을 고민했다.
“개발자들에게 ‘파이프라인을 너무 많이 만들지 마세요’라고 말하는 건 해결책이 아니야. 복잡한 애플리케이션은 수많은 파이프라인을 필요로 할 수밖에 없어. 우리가 이 비용 자체를 줄여줄 방법을 찾아야 해.”
그의 머릿속에 한 가지 아이디어가 떠올랐다.
“만약… 우리가 이 셰이더 컴파일 작업을 미리 해둘 수 있다면?”
그는 팀원들을 모아놓고 설명했다.
“현재의 모델은 이렇습니다. 브라우저는 WGSL 셰이더 코드를 ‘문자열’로 받아서, 런타임에 파싱하고, 컴파일해서 GPU에 보냅니다. 하지만 만약, 개발자가 빌드 시점에, 즉 자신의 서버에서 미리 WGSL 코드를 컴파일해서 최적화된 바이트코드(Bytecode)로 만들어 둘 수 있다면 어떨까요?”
그는 화이트보드에 새로운 흐름을 그렸다.
[개발자 서버]: WGSL -> (사전 컴파일러) -> 최적화된 바이트코드
[브라우저]: 최적화된 바이트코드 -> (최소한의 변환) -> GPU
“브라우저는 더 이상 무거운 컴파일 작업을 할 필요가 없어집니다. 이미 최적화된 바이트코드를 받아서, 아주 약간의 최종 변환만 거쳐 GPU에 전달하기만 하면 되죠. 초기 로딩 시간의 셰이더 컴파일 비용을 거의 제로에 가깝게 만들 수 있습니다.”
이것은 마치 복잡한 요리를 손님 앞에서 처음부터 시작하는 대신, 주방에서 미리 재료를 다듬고 반조리 상태(바이트코드)로 준비해두었다가, 주문이 들어오면 살짝 데워서(최종 변환) 내놓는 것과 같았다.
카이가 감탄하며 말했다.
“SPIR-V와 비슷한 개념이지만, 이건 WGSL에 더 특화된, 웹을 위한 새로운 표준 바이너리 포맷을 만드는 거군요!”
“정확해. 그리고 우리는 이 사전 컴파일러를 오픈소스로 제공하는 거야. 개발자들은 웹팩(Webpack)이나 다른 빌드 도구에 이 컴파일러를 통합해서, 자신들의 개발 파이프라인에 자연스럽게 녹여낼 수 있게 되겠지.”
하지만 이 아이디어에는 한 가지 거대한 장애물이 있었다.
바로 ‘보안’이었다.
문자열 형태의 WGSL은 브라우저가 모든 내용을 파악하고 제어할 수 있었다. 하지만 미리 컴파일된 정체불명의 바이트코드를 브라우저가 그대로 실행하는 것은 엄청난 보안 위험을 초래할 수 있었다.
드미트리는 보안팀과의 기나긴 논의를 시작해야 함을 직감했다.
새로운 바이너리 포맷은 어떻게 설계되어야 하는가? 어떤 정보만 담고, 어떤 위험한 정보는 제외해야 하는가? 브라우저는 이 바이트코드를 신뢰하기 전에 어떤 최소한의 검증 절차를 거쳐야 하는가?
셰이더 컴파일이라는 보이지 않는 비용을 해결하려는 시도는, 그들을 WebGPU의 또 다른 깊은 곳, 즉 ‘보안 바이너리 포맷’이라는 새로운 미지의 영역으로 이끌고 있었다.
드미트리는 데이터 시각화 팀의 헬레나에게 회신했다.
“문제의 근원을 찾았습니다. 당장의 해결책은 아니지만, 저희는 지금 이 ‘사전 컴파일 비용’을 원천적으로 해결하기 위한 장기적인 계획에 착수했습니다. 조금만 기다려 주십시오.”
그것은 단순한 위로가 아니었다. 새로운 시대의 문을 연 자로서, 그 문을 통과하는 이들이 겪는 고통까지 책임지겠다는, 플랫폼 관리자의 무거운 약속이었다.