I started reverse-engineering Intel Poulsbo's PowerVR SGX535 41 days ago, now it can run GLXGEARS at 1280x800!
Intel Poulsbo의 PowerVR SGX535를 역공학한 지 41일, 1280x800에서 GLXGEARS 실행
독립 Mesa/Gallium 드라이버 SGX535-reMESA가 Intel Poulsbo의 PowerVR SGX535에서 GLXGEARS를 1280x800으로 실행하고, 검증된 600프레임 구간에서 평균 16.1345 FPS를 기록했습니다. 다만 현재 지원은 제한된 테스트 경로에 한정되며, 재현에 필요한 커널과 빌드 묶음도 모두 공개되지 않았습니다.
- 주제
에디터 노트
16.1345 FPS라는 수치보다 중요한 조건은 600프레임 모두 실제 GPU 제출로 확인했다는 점과, 그 측정 경로가 아직 일반적인 OpenGL 지원을 뜻하지 않는다는 점입니다. 개발자는 색상과 깊이 값, X11 출력 픽셀까지 물리 장비에서 확인했지만 재현에 쓰인 커널과 빌드 묶음은 아직 완전히 공개하지 않았습니다. 그래서 현재 성과는 작동하는 드라이버의 범위보다 검증 가능한 좁은 실행 경로의 증거로 읽는 편이 정확합니다. 댓글에서는 프레임 시간의 상당 부분이 CPU 처리와 동기화, X11 출력에 든다는 설명이 나왔고, dma-buf로 버퍼 복사를 줄이라는 제안도 이어졌습니다. 개발자 역시 병목이 GPU보다 파이프라인에 있다고 답했습니다. 반면 OMAP DDK를 참고하라는 조언에는 공개 자료를 찾아봤지만 클린룸 구현을 위해 유출판은 피한다고 밝혔습니다. 따라서 다음 단계의 관건은 최고 FPS보다 재현 가능한 패키지와 더 넓은 애플리케이션 경로를 공개하고 검증하는 데 있습니다.
AI 요약
Intel Poulsbo(GMA 500)에 들어간 PowerVR SGX535를 위한 독립 Mesa/Gallium 드라이버 프로젝트 SGX535-reMESA가 실제 GPU 렌더링에 도달했습니다. 개발자는 공개 문서가 부족한 하드웨어를 분석하려고 과거 Windows 드라이버와 Intel EMGD, DDK 자료, 디스어셈블리, 레지스터 정의를 조사하고 실제 장비에서 실험했습니다. 테스트 장비는 Intel Atom Z520과 SGX535 rev121을 탑재한 Dell Inspiron Mini 12입니다.
진행 상황
10월 6일 실제 GPU에서 첫 삼각형을 그렸고, 이어 인덱스 삼각형 두 개로 16x16 정사각형을 렌더링했습니다. 10월 21일에는 Gallium 구현을 거친 OpenGL glDrawArrays 호출이 SGX535에 도달했습니다. 32x32 렌더 타깃을 읽어들인 결과 초록색 픽셀 136개와 변경되지 않은 픽셀 888개를 확인했습니다. 10월 25일에는 노트북의 기본 해상도인 1280x800에서 원본 glxgears를 실행했습니다.
10월 27일 검증 구간에서는 600프레임 동안 GPU 작업을 600회 제출했고, 안정 구간 여섯 곳의 평균은 16.1345 FPS였습니다. 직전 검증 스냅샷 경로의 평균 14.4983 FPS보다 11.29% 높습니다. 커널 경로와 메모리 처리, X11 출력에 여러 변경을 적용했기 때문에 특정 최적화 하나의 효과로 돌리지는 않았습니다. 직접 읽기 전용 GEM FD/XSHM 출력 경로도 제한적으로 검증했습니다. 별도 물리 테스트에서는 GPU 색상과 정의된 Z24 깊이 비트, 입력 이미지, X11에 표시된 결과 픽셀을 확인했습니다.
개발자는 이 성과가 완성된 OpenGL 드라이버를 뜻하지 않는다고 선을 그었습니다. 검증 결과는 제한된 렌더링 경로에 적용되며, 일반 애플리케이션 호환성, 장시간 실행, OpenGL 적합성은 계속 작업 중입니다. 측정에 사용한 특정 커널과 빌드, 비공개 테스트 묶음이 완전한 재현 패키지로 공개되지 않아 저장소를 복제하는 것만으로 같은 16.1345 FPS를 재현할 수는 없습니다.
역공학과 구현
프로젝트는 OpenGL 2.1을 우선 목표로 삼고 OpenGL 3.0도 조사하고 있습니다. 개발자는 구형 드라이버와 컴파일러 동작을 추적해 USSE 셰이더 인코딩의 일부를 복원했습니다. 레지스터 필드 배치, MOV 인코딩, 명령어 마무리 과정, 메모리 관리 동작을 확인하고 독립적으로 작성한 제한적 USSE 인코더와 디코더를 구현했습니다. 예를 들어 어셈블러 플래그의 0번 비트가 인코딩된 두 번째 명령어 워드의 23번 비트에 대응한다는 점을 확인했지만, 실제 GPU 실행에서 그 비트가 뜻하는 바는 아직 밝혀지지 않았습니다.
한 시점에 독립 코덱은 네이티브 Linux, UBSan, i386/QEMU 환경에서 각각 447개 오프라인 테스트를 통과했습니다. 이후 PDS 인코딩과 프로그램 저장, 재배치, 셰이더 준비, 실제 실행을 추가로 다뤘습니다. 다만 오프라인 테스트 통과와 GPU가 실제로 코드를 실행했다는 증거는 구분합니다. 레지스터 뱅크, 명령 종료, PDS 페치, 인코딩 등은 미해결 과제로 남았습니다.
개발자는 Galaxy Tab S7에서 Termux/PRoot로 Linux를 실행하고 i686 빌드를 크로스 컴파일한 뒤 Mini 12의 GPU에서 시험합니다. 장기적으로는 호환되는 32비트 Intel 기기로 지원을 넓히려 합니다. Minecraft Java, Counter-Strike 1.6, SuperTuxKart와 구형 브라우저 게임을 초기 대상 애플리케이션으로 꼽았지만, 먼저 셰이더 동작과 리소스 처리, 호환성, 장시간 실행을 확장해야 합니다.
Reddit 반응
- @nicman24 — 성능 병목은 어디에 있나요?
- @Affectionate-Meat500 — 주된 병목은 이제 GPU 자체가 아니라 파이프라인입니다. 현재 프레임 하나에 약 62.5ms가 걸립니다. 최적화 전 1,113ms에서 줄었습니다. 남은 오버헤드 대부분은 CPU 처리, 동기화, X11 출력, 플러시와 기타 파이프라인 작업에서 나옵니다. GPU 렌더링 자체는 약 16~19ms가 걸립니다.
- @monocasa — 플로피 버퍼를 복사하지 마세요. 커널 드라이버에서 drm-prime/dma-buf가 동작하게 해 X 서버와 메모리를 공유하고, 버퍼 완료를 기다리게 하세요.
- @Affectionate-Meat500 — 제안 감사합니다. GPU는 이제 잘 동작하고 파이프라인이 진짜 골칫거리입니다. 버퍼를 너무 많이 복사하지 않도록 해야 할 것 같습니다.
- @monocasa — 가능하면 역공학에는 OMAP 계열 DDK를 더 집중해서 살펴보세요. 예전 DDK 중에는 심볼이 포함된 .a 라이브러리를 공개 배포한 버전도 있었습니다. Intel 드라이버는 좋지 않기로 유명했고, 정점 셰이더를 USSE에서 실행하지 않았던 것으로 기억합니다. Atom에서 정점 셰이더를 실행하고 변환한 기하 정보를 TA에 제출했을 겁니다.
- @Affectionate-Meat500 — 정확히 짚으셨습니다. 정점 셰이더는 Atom Z520에서 실행합니다. 예전에 공개된 SDK를 미러에서 찾아 LD_PRELOAD 방식으로 ISA 디스어셈블러도 작동시켰습니다. OMAP에서는 얻은 게 많지 않았습니다. 공개된 오픈소스 버전은 약 106줄이고, 10,000줄이 넘는 유출판도 있지만 reMESA를 클린룸 구현으로 유지하려고 사용하지 않겠습니다.
- @monocasa — AI가 쓴 글처럼 보입니다.
- @Affectionate-Meat500 — 문서의 JSON은 Codex가 증거 형식으로 넣도록 요구된 내용입니다. README는 제가 직접 썼습니다. 하드웨어 테스트와 역공학은 실제로 진행했고 결과를 기록했습니다. 마크다운 서식에는 AI의 도움을 받았습니다.
원문: Reddit / 번역·요약: Trawling