Linux AMFの更新でHEVC/AV1に対応1, RX7000シリーズにも

2023-07-23

LinuxでのAMFの利用は基本的に、Vulkan AMFを使う。 これは、Vulkan経由でAMFにアクセスするもので、amdgpu proドライバーに含まれている。

amdgpu proドライバーは、LinuxのRadeon用ドライバーのプロプライエタリ実装だ。 amdgpuはLinuxカーネルに含まれるオープンソースドライバーだが、amdgpu proはamdgpuの実装の一部にプロプライエタリの実装を使う。

これは、特殊な用途・目的のために提供されているものだと言う。特に性能が向上したりはしないそうだ。

だが、Vulkan AMFはamdgpuに含まれていないため、amdgpu proの実装が必要になる。 archlinuxだと、AURのvulkan-amdgpu-proamf-amdgpu-proパッケージが必要だ。

今回の更新

Vulkan AMF自体はRadeonに実装されているエンコーダー、つまりH.264, HEVC, AV1が使えるのだが、Linuxの実装はH.264に限られていた。

また、RX7000シリーズには対応していなかった。

今回の更新でRX7000シリーズへの対応に加え、H.264, HEVC, AV1のいずれも対応した。 ffmpegではh264_amf, hevc_amf, av1_amfとなる。

RX7900XTXだとh264_amf, hevc_amfともに4kソースに対して400fps程度が出る超高速エンコードが可能。

ただ、av1_amfに関しては、実行してもエンコードが進まず、システム全体がフリーズしてしまう。 こんな感じだ。

 7月 22 22:34:21 carnation kernel: amdgpu 0000:0c:00.0: amdgpu: SMU: I'm not done with your previous command: SMN_C2PMSG_66:0x00000028 SMN_C2PMSG_82:0x00000000
 7月 22 22:34:21 carnation kernel: amdgpu 0000:0c:00.0: amdgpu: Failed to enable gfxoff!
 7月 22 22:34:26 carnation kernel: [drm:amdgpu_job_timedout [amdgpu]] *ERROR* ring vcn_unified_1 timeout, signaled seq=30269, emitted seq=30271
 7月 22 22:34:26 carnation kernel: [drm:amdgpu_job_timedout [amdgpu]] *ERROR* Process information: process ffmpeg pid 158223 thread ffmpeg pid 158223
 7月 22 22:34:26 carnation kernel: amdgpu 0000:0c:00.0: amdgpu: GPU reset begin!
 7月 22 22:34:30 carnation kernel: amdgpu 0000:0c:00.0: amdgpu: failed to suspend display audio
 7月 22 22:34:31 carnation kernel: amdgpu 0000:0c:00.0: [drm:amdgpu_ib_ring_tests [amdgpu]] *ERROR* IB test failed on vcn_unified_0 (-110).
 7月 22 22:34:32 carnation kernel: amdgpu 0000:0c:00.0: [drm:amdgpu_ib_ring_tests [amdgpu]] *ERROR* IB test failed on vcn_unified_1 (-110).
 7月 22 22:34:37 carnation kernel: amdgpu 0000:0c:00.0: amdgpu: SMU: I'm not done with your previous command: SMN_C2PMSG_66:0x00000028 SMN_C2PMSG_82:0x00000000
 7月 22 22:34:37 carnation kernel: amdgpu 0000:0c:00.0: amdgpu: Failed to power ungate JPEG!
 7月 22 22:34:37 carnation kernel: [drm:jpeg_v4_0_set_powergating_state [amdgpu]] *ERROR* Dpm enable jpeg failed, ret = -62. 
 7月 22 22:34:38 carnation kernel: amdgpu 0000:0c:00.0: [drm:amdgpu_ib_ring_tests [amdgpu]] *ERROR* IB test failed on jpeg_dec (-110).
 7月 22 22:34:38 carnation kernel: amdgpu 0000:0c:00.0: amdgpu: ib ring test failed (-110).
 7月 22 22:34:39 carnation kernel: [drm] Register(0) [regUVD_POWER_STATUS] failed to reach value 0x00000001 != 0x00000002
 7月 22 22:34:39 carnation kernel: [drm] Register(0) [regUVD_RB_RPTR] failed to reach value 0x00000080 != 0x00000000
 7月 22 22:34:39 carnation kernel: [drm] Register(0) [regUVD_POWER_STATUS] failed to reach value 0x00000001 != 0x00000002

あるいは、こう

 7月 22 22:51:16 carnation kernel: amdgpu 0000:0c:00.0: amdgpu: SMU: I'm not done with your previous command: SMN_C2PMSG_66:0x00000028 SMN_C2PMSG_82:0x00000000
 7月 22 22:51:16 carnation kernel: amdgpu 0000:0c:00.0: amdgpu: Failed to enable gfxoff!
 7月 22 22:51:22 carnation kernel: [drm:amdgpu_job_timedout [amdgpu]] *ERROR* ring vcn_unified_1 timeout, signaled seq=7625, emitted seq=7627
 7月 22 22:51:22 carnation kernel: [drm:amdgpu_job_timedout [amdgpu]] *ERROR* Process information: process ffmpeg pid 4331 thread ffmpeg pid 4331
 7月 22 22:51:22 carnation kernel: amdgpu 0000:0c:00.0: amdgpu: GPU reset begin!
 7月 22 22:51:26 carnation kernel: amdgpu 0000:0c:00.0: amdgpu: failed to suspend display audio
 7月 22 22:51:27 carnation kernel: amdgpu 0000:0c:00.0: [drm:amdgpu_ib_ring_tests [amdgpu]] *ERROR* IB test failed on vcn_unified_0 (-110).
 7月 22 22:51:32 carnation kernel: amdgpu 0000:0c:00.0: amdgpu: SMU: I'm not done with your previous command: SMN_C2PMSG_66:0x00000028 SMN_C2PMSG_82:0x00000000