
강의 Termux 리눅스 강좌 4부 : 아드레노 GPU Vulkan 드라이버 설치
- 흡혈귀왕
- 조회 수 1448
- 2023.07.29. 22:45
https://meeco.kr/Review/37391093
https://meeco.kr/Review/37393039
https://meeco.kr/Review/37397353
Termux 리눅스 강좌에 많은 관심 보여주셔서 감사합니다.
최근 Freedreno Turnip을 설치해서 이것저것 테스트 하였고
꽤 큰 성과가 있어서 강좌를 올리게되었습니다.
Q. Freedreno Turnip이 뭐임?
A. 아드레노의 오픈소스의 Vulkan 드라이버 입니다. 퀄콤이 보증하는 드라이버는 아니지만
리눅스에서 Vulkan 하드웨어 가속이 가능합니다.
Q. 설치 후 뭘 할 수있음?
A. box64+wine에서 DXVK, VK3D3를 통해 게임 구동이 가능해집니다.
또한 zink를 통해 OpenGL4.6 구현도 가능합니다.
Q. 성능은 어떤가?
A. 성능만 놓고보면 virgl과 큰 차이가 없습니다. 그 이유는 WSI 호환성 때문입니다.
그럼에도 virgl보다 훨씬 나은 호환성과 안정성을 보여줍니다.
각설하고 바로 설치 들어가겠습니다.
우선 아드레노5xx/6xx 시리즈 기준의 설치 방법입니다.
디바이스는 갤럭시S20(스냅드래곤865 : 아드레노650)에 설치된 Ubuntu 22.04 LTS 기준입니다.
$ sudo apt install vulkan*
$ sudo apt remove mesa-vulkan-drivers
터미널을 실행 후 위의 명령어를 차례로 입력해주세요.
mesa-vulkan-drivers을 설치한 이력이 없을 경우 두번째 명령어는 입력하지 않으셔도 됩니다.
https://drive.google.com/file/d/1zQnXSDI9LbE_FP8HAb63rC-F9Jx_JLCd/view?usp=sharing
위의 mesa-vulkan-kgsl.deb을 다운로드 받습니다.
해당 deb은 freedreno turnip이 활성화된 mesa vulkan driver입니다.
$ cd 다운로드경로
$ sudo dpkg -i mesa-vulkan-kgsl_23.3.0-devel-20230714_arm64.deb
터미널로 다운받은 경로로 이동 후 deb 설치 명령어를 입력해주세요.
※ 해당 강좌는 바탕화면에 deb이 있다는 전제로 하였습니다.
$ TU_DEBUG=noconform MESA_VK_WSI_DEBUG=sw VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/freedreno_icd.aarch64.json vkcube
vulkan 하드웨어 가속이 제대로 돌아가는 테스트를 위해 위의 명령어를 입력해주세요.
turnip이 제대로 설치가 되었다면 vulkan api로 구동되는 vkcube가 실행되고 (vkcube가 마구마구 회전함)
GPU가 아드레노로 표시됩니다.
$ MESA_LOADER_DRIVER_OVERRIDE=zink TU_DEBUG=noconform MESA_VK_WSI_DEBUG=sw VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/freedreno_icd.aarch64.json glmark2
zink+turnip으로 OpenGL4.6 테스트 해보겠습니다.
위의 명령어로 glmark2를 실행해주세요.
GL 렌더러가 zink (Turnip Adreno (TM) 650)으로 표시되고
GL 버전도 4.6으로 표시됩니다.
이상으로 아드레노500/600 디바이스에서 Vulkan 하드웨어 가속을 성공했습니다.
제일 큰 체감은 게임입니다.
위가 virgl 환경에서 실행한 리눅스용 카트라이더라고 불리우는 SuperTuxKart 입니다.
이전부터 계속 언급했듯이 virgl은 호스트 GPU를 가상화하여 게스트 OS에서 2D/3D 가속을 하는 기술로
OpenGL ES를 가상화 할 경우 OpenGL2.1이 한계이고 오만가지 문제가 발생할 수 있습니다.
SuperTuxKart에서 확인된 문제는 다음과 같이
캐릭터 3D 모델링이 깨지고 (굉장히 그로테스크 ㄷㄷㄷㄷ)
애니메이션이 표시되지 않고
배경에 이펙트가 표시되지 않는
등등
오만가지 문제가 발생합니다.
하지만...
$ MESA_LOADER_DRIVER_OVERRIDE=zink TU_DEBUG=noconform MESA_VK_WSI_DEBUG=sw VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/freedreno_icd.aarch64.json supertuxkart
zink+turnip 환경 변수로 SuperTuxKart 실행하니 OepnGL ES3.2으로 구동되고
캐릭터 깨짐도 없고 애니메이션이랑 이펙트도 아주 잘 출력됩니다.
퍼포먼스도 미세하게 virgl 대비 나은 느낌입니다.
또다른 큰 변화는 Blender 3D 입니다.
virgl 환경에서 Blender 3D 실행 시
저렇게 UI 텍스트들이 로드되지 않고 3D 오브젝트 선택 시 프로그램이 프리징되버리면서
사용이 불가능합니다.
$ MESA_LOADER_DRIVER_OVERRIDE=zink TU_DEBUG=noconform MESA_VK_WSI_DEBUG=sw VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/freedreno_icd.aarch64.json blender
zink+turnip 환경 변수로 Blender 실행하니 UI의 텍스트들도 잘 표시되고
3D 오브젝트를 터치해도 프리징되는 이슈도 없습니다!
하지만 프로그램을 전체화면으로 실행하면 타이틀 바 하단에 저렇게
여백이 생기고 UI가 틀어지는 이슈가 발생합니다.
그럴때는 전체화면을 풀고 그냥 창 사이즈를 꽉차게 한 상태로 사용하면 됩니다.
스냅드래곤865 디바이스 기준으로 생각보다 잘 돌아갑니다.
하이폴리곤 모델링은 힘들겠지만 로우폴리곤 모델링으로 가지고 놀기 아주 좋아보이네요.
그런데 매번 저렇게 환경 변수로 프로그램 실행하기가 상당히 불편합니다.
해결 방법으로
터미널에 아예 환경 변수를 고정시켜주는 방법이 있습니다.
하단 패널의 터미널 아이콘 오른쪽 클릭 후 '속성'을 클릭하세요.
실행 아이콘 팝업에서 '편집' 버튼을 클릭해주세요.
bash -c "env DISPLAY=:0 MESA_LOADER_DRIVER_OVERRIDE=zink TU_DEBUG=noconform MESA_VK_WSI_DEBUG=sw VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/freedreno_icd.aarch64.json exo-open --launch TerminalEmulator"
터미널 아이콘 명령어에 위의 명령어를 입력 후 저장해주세요.
이제 하단 패널에서 실행하는 터미널 아이콘에
zink+turnip 환경 변수가 적용되었습니다.
$ glxinfo -B
하단에서 실행한 터미널에서 위의 명령어를 입력해주세요.
환경 변수가 제대로 적용되어 있으면 GPU 정보가
zink (Turnip Adreno (TM) 650)로 표시됩니다.
이제 환경 변수를 넣지않고 터미널에서 프로그램을 실행하면
turnip이 자동으로 적용되어서 실행됩니다.
터미널에서 프로그램 이름으로 실행하는 것도 불편하다면 하단 패널에 프로그램 실행 아이콘을
추가 후 오른쪽 우클릭 -> 속성 -> 편집에서 터미널 아이콘에 환경 변수 넣어주듯이
bash -c "env DISPLAY=:0 MESA_LOADER_DRIVER_OVERRIDE=zink TU_DEBUG=noconform MESA_VK_WSI_DEBUG=sw VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/freedreno_icd.aarch64.json 프로그램이름"
위의 명령어를 입력해주시면 됩니다.
여기까지나 아드레노5xx/6xx 시리즈에 대한 설정입니다.
아드레노7xx GPU를 쓰는 디바이스에선
위의 과정을 거쳐도 turnip이 전혀 작동하지 않을겁니다.
다음은 아드레노7xx GPU에서 turinp 드라이버를 설치하는 방법입니다.
디바이이스는 갤럭시S22 울트라에서 진행했습니다.
우선 위의 과정을 동일하게 진행 후
https://drive.google.com/file/d/14TZiV7afkyA2yGY1F6d5p_ohynRG14lT/view?usp=sharing
zip파일 리눅스에서 다운로드 받아주세요.
제가 직접 빌드한 a7xx 지원 turnip 바이너리입니다.
libvulkan_freedreno.so파일을 /usr/lib/aarch64-linux-gnu/ 경로로 복사해주세요.
터미널에 환경 변수가 적용되어 있는 상태에서
vkcube나 glmark2를 실행하면 정상적으로 구동되고 GPU 정보도 Adreno 730으로 표시됩니다.
스냅드래곤8 Gen2 탑재의 갤럭시S23 울트라에서도 잘 작동합니다.
리눅스에 설치된 mesa가 23.0.0 버전 이상이라면 GPU 정보가
zink (Turnip Adreno (TM) 740)가 아니라
zink Vulkan 1.3 (Turnip Adreno (TM) 740 (MESA TURNIP)으로 표시됩니다.
저의 경우 갤럭시S23 울트라에서 mesa 23.3.0 devel을 설치해서 사용중이고
a7xx 시리즈 지원 turnip도 23.3.0 debel 브렌치에서 빌드하였습니다.
https://meeco.kr/Review/37393039
mesa 컴파일은 위의 GPU 가속 강좌의 하단을 참고해주세요.
이상 아드레노 GPU에서 Vulkan 드라이버를 설치해보았습니다.
리눅스 환경에서 게임을 돌릴 준비가 모두 끝난 셈입니다.
zink+turnip도 완벽하지 않아서 테스트하면서 여러 문제가 확인되었습니다.
제가 정밀 테스트를 통해 발견된 이슈들은 다음과 같습니다.
[발견된 공통 이슈]
1. XFCE4 세션 자체를 zink+turnip으로 실행 시 UI 깨짐 증상 발생
(그래서 XFCE4는 virgl로 실행 후 프로그램은 개별로 환경 변수 zink+turnip 적용)
2. zink+turnip 환경 변수로 VLC 실행 후 영상을 풀스크린으로 전환하면 영상이 센터에 표시되지 않고
상단에 쏠려서 표시
3. zink+turnip 환경 변수로 Kdenlive 실행 후 창 크기를 조절하면 UI 깨짐 발생
4. zink+turnip 환경 변수로 Blender 3D 실행 시 타이틀 이미지 깨짐 발생
(mesa 22.0.0에선 해당 증상이 없고 mesa 23.0.0에서 증상 발생)
5. zink+turnip 환경 변수로 Blender 3D 실행 시 프로그램이 전체화면일 경우 UI 좌표 틀어짐 발생
(전체화면이 아닐 경우 증상 없음)
6. zink+turnip 환경 변수로 Firefox-esr 실행 시 WebGL이 실행되지 않는 문제 발생
[아드레노730 한정 이슈]
1. zink+turnip 환경 변수로 Blender 3D 실행 시 3D 오브젝트를 선택하면 프리징되면서
프로그램이 크래시남
(zink 에러로 보임......S23U와 S20에선 발생하지 않는데 아드레노730인 S22U와 탭S8에서만 발생;;)
저 이슈들 빼고 다른 문제는 전혀 없었습니다.
저것들 해결되면 스냅드래곤 탑재 디바이스는 완벽한 리눅스 환경이 될듯합니다.
Kdenlive UI 깨짐 빼면 1080p@60fps랑 4K@30fps도 편집 가능한 수준으로 돌아가고
Blender 3D도 전체화면이 아닌 상태에서 창 크기로 전체화면 수준으로 키워서 사용하면
아~~~~무 문제없이 작동합니다.(아드레노740과 아드레노650에선 정상 작동 확인)
위의 이슈들만 해결되고 WSI 호환성 개선되면 스냅드래곤 디바이스는 완벽한 리눅스 환경이 될듯합니다.
그럼 여기서 마치겠습니다
뿅!










아아 그게 원인이었네요
mesa를 다시 컴파일 하시면될듯합니다.
우분투에서 기본 제공되는 mesa 패키지는 zink가 활성화되었지만
2부 mesa 컴파일에선 zink 옵션이 빠져있거든요. (이게 필수가 아니다보니....)
다운로드 받으셨던 mesa 23.1.3 소스를 다시 압축 푸셔서 경로로 진입 후
$ meson build -Dgbm=enabled -Dopengl=true -Degl=enabled -Degl-native-platform=x11 -Dgles1=disabled -Dgles2=enabled -Ddri3=enabled -Dglx=dri -Dllvm=enabled -Dshared-llvm=disabled -Dplatforms=x11,wayland -Dgallium-drivers=swrast,virgl,zink -Dvulkan-drivers=swrast -Dosmesa=true -Dglvnd=true -Dxmlconfig=disabled
$ sudo ninja -C build install
윗 명령어를 차례로 입력해주세요
(meson -Dgallium-drivers= 옵션에 zink가 추가되었습니다.)
혹시 모르니
컴파일 후 turnip 드라이버를 경로에 다시 넣어주세요

최근에 탭S9플러스를 드디어 질렀습니다. 탭S9 시리즈도 S23시리즈와 같은 방법으로 설치하면 되죠?