Turing VP9 decode acceleration not working on Linux?

I posted this at the Geforce forums initially, as I didn’t know the devtalk board existed. I have been using a 1050Ti for a while on Linux (variously using Ubuntu 18.10, Ubuntu 19.04, Arch Linux, etc) and to the best of my memory VP9 acceleration - i.e. YouTube - has been working very well using vaapi patched Chromium (chromium-vaapi, ungoogled-chromium, etc).

This week I got sick of seeing 50-60fps in Steam so I decided to upgrade. I initially grabbed a Vega 56 on special offer (£270 with £75 worth of games) but then realised it didn’t support VP9 offloading, at all. I exchanged the card for an EVGA RTX 2060 XC Gaming 6GB ‘knowing’ that my 1050Ti had worked flawlessly so far.

Unfortunately, despite a lovely bump in FPS on Steam, VP9 isn’t accelerated at all in Chromium any more. Every time I play a YouTube video with VP9, Chromium reports that it’s using vpxdecoder and CPU usage is around 12%. If I switch to x264/mp4 Chromium reports MojoDecoder or GPU Decoder and CPU usage drops to around 1%-2%.

I have tried everything I can think of. The three newest Nvidia drivers (i.e. since support was added for the 2060), switching browser (chromium-vaapi to saiarcot895’s patched chromium-dev, to ungoogled-chroimum. I tried Ubuntu 18.04, Ubuntu 18.10, Pop!_OS 18.04 and 18.10 (it comes pre-installed with the proprietary Nvidia drivers), Arch Linux with nvidia-418, Manjaro, you name it. All bare metal installs, all set up the same way that works with the 1050Ti. Nothing works, and I’m starting to doubt my sanity.

Does anyone have any ideas please?

Machine specs:

Intel Core i7 8700k running at 5GHz all core @ 1.325v
32GB TeamGroup 8Pack Edition DDR4 3400MHz cl16 RAM running at 4133MHz @ 1.4v
Asus RoG Maximus X Hero
EVGA GeForce RTX 2060 XC GAMING, 6GB GDDR6, HDB Fan Graphics Card
Samsung Evo 960 250GB NVMe SSD

Output from vainfo:

$ vainfo
vainfo: VA-API version: 1.4 (libva 2.4.0)
vainfo: Driver version: Splitted-Desktop Systems VDPAU backend for VA-API - 0.7.4
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            :	VAEntrypointVLD
      VAProfileMPEG2Main              :	VAEntrypointVLD
      VAProfileMPEG4Simple            :	VAEntrypointVLD
      VAProfileMPEG4AdvancedSimple    :	VAEntrypointVLD
      <unknown profile>               :	VAEntrypointVLD
      VAProfileH264Main               :	VAEntrypointVLD
      VAProfileH264High               :	VAEntrypointVLD
      VAProfileVC1Simple              :	VAEntrypointVLD
      VAProfileVC1Main                :	VAEntrypointVLD
      VAProfileVC1Advanced            :	VAEntrypointVLD

Output from vdpauinfo:

$ vdpauinfo
display: :0   screen: 0
API version: 1
Information string: NVIDIA VDPAU Driver Shared Library  418.56  Fri Mar 15 12:31:51 CDT 2019

Video surface:

name   width height types
-------------------------------------------
420     8192  8192  NV12 YV12 
422     8192  8192  UYVY YUYV 

Decoder capabilities:

name                        level macbs width height
----------------------------------------------------
MPEG1                           0 65536  4096  4096
MPEG2_SIMPLE                    3 65536  4096  4096
MPEG2_MAIN                      3 65536  4096  4096
H264_BASELINE                  51 65536  4096  4096
H264_MAIN                      51 65536  4096  4096
H264_HIGH                      51 65536  4096  4096
VC1_SIMPLE                      1  8190  2048  2048
VC1_MAIN                        2  8190  2048  2048
VC1_ADVANCED                    4  8190  2048  2048
MPEG4_PART2_SP                  3  8192  2048  2048
MPEG4_PART2_ASP                 5  8192  2048  2048
DIVX4_QMOBILE                   0  8192  2048  2048
DIVX4_MOBILE                    0  8192  2048  2048
DIVX4_HOME_THEATER              0  8192  2048  2048
DIVX4_HD_1080P                  0  8192  2048  2048
DIVX5_QMOBILE                   0  8192  2048  2048
DIVX5_MOBILE                    0  8192  2048  2048
DIVX5_HOME_THEATER              0  8192  2048  2048
DIVX5_HD_1080P                  0  8192  2048  2048
H264_CONSTRAINED_BASELINE      51 65536  4096  4096
H264_EXTENDED                  51 65536  4096  4096
H264_PROGRESSIVE_HIGH          51 65536  4096  4096
H264_CONSTRAINED_HIGH          51 65536  4096  4096
H264_HIGH_444_PREDICTIVE       51 65536  4096  4096
HEVC_MAIN                      153 262144  8192  8192
HEVC_MAIN_10                   --- not supported ---
HEVC_MAIN_STILL                --- not supported ---
HEVC_MAIN_12                   --- not supported ---
HEVC_MAIN_444                  --- not supported ---

Output surface:

name              width height nat types
----------------------------------------------------
B8G8R8A8         32768 32768    y  Y8U8V8A8 V8U8Y8A8 A4I4 I4A4 A8I8 I8A8 
R10G10B10A2      32768 32768    y  Y8U8V8A8 V8U8Y8A8 A4I4 I4A4 A8I8 I8A8 

Bitmap surface:

name              width height
------------------------------
B8G8R8A8         32768 32768
R8G8B8A8         32768 32768
R10G10B10A2      32768 32768
B10G10R10A2      32768 32768
A8               32768 32768

Video mixer:

feature name                    sup
------------------------------------
DEINTERLACE_TEMPORAL             y
DEINTERLACE_TEMPORAL_SPATIAL     y
INVERSE_TELECINE                 y
NOISE_REDUCTION                  y
SHARPNESS                        y
LUMA_KEY                         y
HIGH QUALITY SCALING - L1        y
HIGH QUALITY SCALING - L2        -
HIGH QUALITY SCALING - L3        -
HIGH QUALITY SCALING - L4        -
HIGH QUALITY SCALING - L5        -
HIGH QUALITY SCALING - L6        -
HIGH QUALITY SCALING - L7        -
HIGH QUALITY SCALING - L8        -
HIGH QUALITY SCALING - L9        -

parameter name                  sup      min      max
-----------------------------------------------------
VIDEO_SURFACE_WIDTH              y         1     8192
VIDEO_SURFACE_HEIGHT             y         1     8192
CHROMA_TYPE                      y  
LAYERS                           y         0        4

attribute name                  sup      min      max
-----------------------------------------------------
BACKGROUND_COLOR                 y  
CSC_MATRIX                       y  
NOISE_REDUCTION_LEVEL            y      0.00     1.00
SHARPNESS_LEVEL                  y     -1.00     1.00
LUMA_KEY_MIN_LUMA                y  
LUMA_KEY_MAX_LUMA                y

I have nvidia-settings, nvidia-utils, libva-vdpau-driver-chromium (for Arch only) installed, and the ‘usual’ extras like ffnvcodec-headers (Arch), libvdpau-va-gl, libvdpau, mesa-vdpau etc.

On Windows, incidentally, Task Manager shows video decode at ‘something’ percent while playing H264 on YouTube but video decode at 0% when playing the same video with VP9.

Is this a driver issue (missing compiler flag etc), are the drivers just ‘too new’ and not fully ready yet? Or something else I’m oblivious to? Please don’t assume I’m anything but vaguely familiar with Nvidia. I passed up on a Vega 56 at half the price of the 2060 because ‘hey, Nvidia decodes VP9 in hardware’… I’m feeling somewhat frustrated atm. I could plug back in my 1050Ti, return the 2060 and this problem goes away. I could also go back to Vega at half the price (almost) and still have no hardware VP9 if this isn’t something I can fix. That surely isn’t right! I’m hoping it’s something simple like drivers, but as I said the release notes suggested they’d been fully implemented which isn’t filling me with hope.

Thanks in advance for reading, and to anyone who can help with replies.

Vdpau doesn’t decode VP9, therefore vaapi over vdpau also doesn’t decode VP9. You have never seen hardware-accelerated VP9 playback with chromium-vaapi and your old 1050Ti.

VDPAU (deprecated 2015 afaik) doesn’t, but everything I read says that the Nvidia driver does. For example the Arch Wiki lists nvidia (via nvidia-utils) as able to decode VP9 since Maxwell. I think where I have become confused is that I’d assumed (we all know what that did) a Turing card with the nvidia driver will be able to play VP9 in Chromium. However since Chromium relies on libva/vaapi via vdpau (not nvidia) it’s obviously not going to work. Have I (finally) gotten that right?

If so I think I’ll cut my losses and either go back to the Vega 56 at the significantly cheaper price point (200 vs 360 local currency), or bite the bullet and grab a Radeon VII. At least with the latter I’ll have the best of both worlds; an open source driver supporting VP9 across the board, and even better FPS on Steam - albeit a slightly more sore wallet for a few days haha. Thanks for your reply.

Edit: BTW I always had intel-media-driver or i965 installed, and my BIOS is set to multi-monitor, meaning all installed GPUs are available to the OS. I wonder whether that allowed Linux to play back VP9 videos via the Intel GPU without me realising, when I had the 1050Ti installed? That or I had an old h264ify hanging around without noticing (I hide such things in the drop down menu so don’t tend to see them from one month to the next). shrug

Both nvidia cards you mentioned can decode VP9 in hardware. But there is no software path starting with vaapi that can make use of this. Vaapi isn’t supported natively by nvidia and vaapi over vdpau doesn’t work because vdpau doesn’t do VP9. Only nvdec works. But there is no vaapi over nvdec.

I’m not even sure if chromium-vaapi + vaapi over vdpau works at all. Last time I tried with h264 it didn’t.

No idea if your Intel GPU was of any help. Probably not. You might have seen ghosts. ;)

Chromium-vaapi + vaapi over vdpau definitely works, I’ve been watching YouTube all day (vdpau videos mostly lol) using mp4a@1080p via h264ify. Not only does chrome://media-internals confirm Mojo video decoder (hardware) or GPU Decoder - depending which flavour Chromium I use - but CPU usage on the box is around 2% tops. Conversely the same video at the same res with vp9 is using around 10% CPU, and chrome://media-internals shows vpxdecoder. Thanks again for the insight.

Check this out. VP9 support is being added to VDPAU:
https://lists.freedesktop.org/archives/vdpau/2019-July/000442.html