AMD GPU Vulkan Drivers for Linux

AMD 在 Linux 下维护着两套开源 Vulkan 驱动:

  • AMDVLK
    • 从闭源 Windows Vulkan 驱动适配而来,主要不同在 shader 编译后端, AMDVLK 使用基于 LLVM 的 LLPC
  • RADV
    • 包含在 Mesa 内,有两套编译后端: 基于 LLVM 的后端和基于 NIR 的 ACO (AMD COmpiler),但默认的是 ACO

AMDVLK

AMDVLK 的 README 有一张架构图, 非常清晰地展示了整个驱动包含的组件和层次结构。

topLevelArch

AMDVLK 驱动由 5 个代码仓库构建:

  • LLVM
  • XGL Vulkan API Translator
  • LLPC LLVM-based Pipeline Compiler
  • GPURT GPU Ray Tracing Library
  • PAL Platform Abstraction Library

其中 XGL, LLPC, GPURT 都与 PAL 有关联。

RADV (Radeon Vulkan)

RADV 和其它 Mesa 的 GPU UMD 一样都是使用 libdrm 库与 KMD 打交道,但后来为了GPU 虚拟化(amdgpu-virto) 支持 Native Context 将大部分 libdrm_amdgpu 库的函数换成了 ac_drm_ 开头的函数, 后来为了GPU 虚拟化(amdgpu-virto) 支持 Native Context 也对 ac_drm 函数接口进行了的修改。 经过这两次修改,RADV 使用的 libdrm_amdgpu 函数基本分为两类:

  • 直接调用型
  • "inline"型
Function IOCTL CMD Read/Write
ac_drm_bo_set_metadata GEM_METADATA RW
ac_drm_bo_query_info GEM_METADATA, GEM_OP RW
ac_drm_bo_wait_for_idle GEM_WAIT_IDLE RW
ac_drm_bo_va_op_raw GEM_VA RW
ac_drm_cs_query_reset_state2 CTX RW
ac_drm_cs_query_fence_status DRM_IOCTL_AMDGPU_WAIT_CS N/A
ac_drm_cs_submit_raw2 CS RW
ac_drm_query_hw_ip_count INFO W
ac_drm_query_hw_ip_info INFO W
ac_drm_query_firmware_version INFO W
ac_drm_query_uq_fw_area_info INFO W
ac_drm_read_mm_registers INFO W
ac_drm_query_info INFO W
ac_drm_query_sensor_info INFO W
ac_drm_query_video_caps_info INFO W
ac_drm_query_gpuvm_fault_info INFO W
ac_drm_vm_reserve_vmid VM RW
ac_drm_vm_unreserve_vmid VM RW

关于 libdrm_amdgpu 里的函数,其实还有一类,就是 AMDVLK 用到的,而 RADV 没有用的:

  • amdgpu_bo_list_create
  • amdgpu_bo_list_create_raw