Apple M1 GPU용 오픈 소스 드라이버를 역설계하고 완성해 온 여정, 그리고 Asahi Linux에서의 그래픽·Vulkan·Proton 게임 지원을 마무리하며.
26 Aug 2025
2020년, Apple은 맞춤형 GPU를 탑재한 M1을 출시했습니다. 우리는 하드웨어 역설계와 Linux 이식 작업에 착수했습니다. 오늘날에는 다양한 M1 및 M2 Mac에서 Linux를 실행할 수 있고, 무선 통신, 오디오, 완전한 그래픽 가속까지 거의 모든 하드웨어가 작동합니다.
이야기는 2020년 12월, Hector Martin이 Asahi Linux를 시작하면서 시작됩니다. 저는 Arm Mali GPU용 오픈 소스 Mesa3D 드라이버인 Panfrost를 작업하며 Collabora에서 일하고 있었습니다. Hector는 상위 오픈 소스 유지관리자들에게 조언을 구하는 공개 요청을 올렸고, 저는 응했습니다. 처음에는 간단한 조언 몇 가지를 전할 생각이었습니다. 그러다 스스로에게 크리스마스 선물을 사고 작업에 뛰어들었습니다. 대학 수업과 Collabora 업무 사이사이에 셰이더 명령어 집합을 살펴보았습니다.
그러다 일이 계속 이어졌습니다. 몇 주 만에 삼각형을 그렸습니다.
3D 그래픽에서는 삼각형을 그릴 수 있다면 무엇이든 할 수 있습니다.
곧 셰이더 컴파일러 작업을 시작했습니다. 그 학기의 기말고사가 끝난 뒤 Collabora에서 며칠 휴가를 내고, 새 컴파일러로 기어를 돌릴 수 있는 OpenGL 드라이버를 구동했습니다.
그다음 1년 동안 계속 역설계를 진행하고 드라이버를 개선하여, 마침내 macOS에서 3D 게임을 실행할 수 있게 되었습니다.
한편 Asahi Lina는 Apple GPU용 커널 드라이버를 작성했습니다. 제 사용자 공간 OpenGL 드라이버는 macOS에서 실행되었고, 오픈 소스 그래픽 스택에 남은 마지막 조각은 그녀의 커널 드라이버였습니다. 2022년 12월, 우리는 Asahi Linux에 그래픽 가속을 출시했습니다.
2023년 1월, 저는 University of Toronto 컴퓨터 과학 과정의 마지막 학기를 시작했습니다. 수년 동안 수업, 시간제 일자리, 취미로 만든 드라이버를 병행했습니다. 또래들과 똑같은 질문에 마주했습니다. 졸업 후에는 무엇을 할까?
Panfrost일까요? 저는 아직 고등학생이던 2017년에 Mali Midgard GPU 역설계를 시작했습니다. 그것은 졸업 후 2019년 Collabora 인턴십으로 이어졌고, 대학 4년 내내 제 직업이 되었습니다. 그 기간 Panfrost는 블랙박스 역설계에 기반한 한 아이의 개인 프로젝트에서, Arm의 지원과 하드웨어 문서를 바탕으로 한 팀이 개발하는 전문 드라이버로 성장했습니다. 저는 처음 이루고자 한 일을 해냈고, 프로젝트는 꿈을 뛰어넘는 성공을 거두었습니다. 떠날 때가 되었습니다.
다음으로 제가 정말 하고 싶은 일은 무엇이었을까요?
Panfrost는 우리가 “이길” 때까지 제 도전 과제였습니다. 다음 도전 과제는요? M1에서 Linux 게임을 구현하는 것이었습니다.
수업을 마친 뒤 Linux 게임 작업을 전업으로 시작했습니다. 한 달 만에 Asahi Linux에서 OpenGL 3.1을 출시했습니다. 몇 주 뒤에는 OpenGL ES 3.1의 공식 규격 준수를 통과했습니다. 이로써 Panfrost와 기능 면에서 동등해졌습니다. 저는 더 나아가고 싶었습니다.
OpenGL (ES) 3.2에는 Arm과 Apple 하드웨어 모두 지원하지 않는 구식 기능인 지오메트리 셰이더가 필요합니다. 독점 OpenGL 드라이버는 컴퓨트로 지오메트리 셰이더를 에뮬레이션하지만, 참고할 만한 오픈 소스 선례는 없었습니다. 여러 Mesa 드라이버가 지오메트리/테셀레이션 에뮬레이션을 필요로 했음에도, 아무도 거기까지 가기 위한 작업을 하지 않았습니다.
초기 OpenGL 진척은 Mesa의 성숙한 공통 코드 덕분에 빨랐습니다. 이제 받은 도움을 되돌려줄 때였습니다. 그해 남은 기간 동안 지오메트리/테셀레이션 셰이더 에뮬레이션을 구현했습니다. 그리고 올빼미의 나머지 부분도요. 2024년 1월, 전체 OpenGL 4.6 사양의 규격 준수를 통과하며 OpenGL을 마무리했습니다.
Vulkan도 그리 어렵지 않았습니다. 몇 달 동안 OpenGL 드라이버를 다듬었지만, Vulkan 드라이버를 작성하기 시작한 뒤 몇 주 만에 1.3 규격 준수를 통과했습니다.
남은 일은 지오메트리/테셀레이션 에뮬레이션을 반짝이는 새 Vulkan 드라이버에 연결하는 것이었습니다. Direct3D에 그것들이 필요하기 때문입니다. 자, Proton 게임입니다.
그 과정에서 Karol Herbst는 자신의 “rusticl” 프런트엔드 위에서 제 컴파일러를 실행하여 M1의 OpenCL 3.0 규격 준수를 통과했습니다.
한편 Vulkan 1.4 사양이 발표되었을 때, 우리는 준비를 마쳤고 같은 날 규격을 준수하는 구현체를 출시했습니다.
그 후 희소 텍스처 지원을 구현하여 Proton을 통한 Direct3D 12를 가능하게 했습니다.
…이제 무엇을 할까요?
훌륭한 드라이버 출시? 완료.
규격을 준수하는 OpenGL 4.6, OpenGL ES 3.2, OpenCL 3.0? 완료.
규격을 준수하는 Vulkan 1.4? 완료.
Proton 게임 지원? 완료.
이것으로 마무리입니다.
우리는 제 꿈을 뛰어넘는 성공을 거두었습니다. 제가 좇았던 도전 과제들을 해결했습니다. 드라이버는 Mesa에 완전히 상위 반영되었습니다. 성능도 나쁘지 않습니다. Apple에서의 Vulkan이라는 신화가 깨진 지금, 제 작업을 기반으로 하는 LunarG의 KosmicKrisp 프로젝트를 통해 규격을 준수하는 Vulkan이 macOS에도 도입되고 있습니다.
만족스럽게도, 이제 저는 Apple 생태계를 떠납니다. Asahi Linux 주변의 친구들이 여기서부터 횃불을 이어갈 것입니다. 그렇다면 저는요?