Problems using QSV/iGPU for encoding - black screen recording, "app not on intel, fallback to old qsv" error

Orz

New Member
I have an Arrow Lake cpu which has an iGPU with the latest quicksync. I also have a 4070ti Super but I would like to use the iGPU for streaming as quicksync has come a long way since the old days and gives better performance (marginally) according to tests.

I've setup/selected Quicksync H.264 in OBS settings and it seems to record/stream just fine. Quality is seemingly exactly the same as H.264 via the dedicated GPU - so much so that I'm wondering if it is actually using the iGPU to stream, because the logs still state:

"app not on intel GPU, fall back to old qsv encoder"

It should be using "new qsv" as far as I am aware. Is there some kind of trick I'm missing?

I've tried setting OBS to use the iGPU in Windows Graphics Settings, but that results in a black recording with audio.

Here's a log. Note: you may see the log say "fallback to non-texture encoder" - that's just because I tried using a newer/different Quicksync DLL. Same issue though with the OBS-provided one.

 

koala

Active Member
Not sure how you measured performance. The best performance due to least system resource usage should be Nvenc in your hardware setup.

Offloading encoding to a different GPU means the image data has to be copied from the Nvidia memory space over to the iGPU memory space, and this needs vastly more system resources than directly encoding within the Nvidia GPU. This is what "texture encoder" means: this means the encoder is running on the GPU and is directly reading the frame buffer where the image is rendered.
Nvenc is on a dedicated circuit within the GPU, so it doesn't need 3D computing resources.

Assigning OBS to the iGPU doesn't work. OBS needs to run where your monitor is connected and where the things you capture are being rendered. It's the same as with the texture encoding: it works by directly accessing the frame buffer of the app it captures, and this is only possible if it runs on the same GPU.

So use Nvenc for encoding. It's also the best encoder quality from all the available hardware encoders according to many tests from the last years. If the brand new CPU+iGPU you have gives better Quicksync quality is yet to see and a task for upcoming benchmarking/comparison tests. It would be a surprise - until now, Nvenc has been improved every GPU generation and was always the best encoder in terms of quality.
 

Orz

New Member
Not sure how you measured performance. The best performance due to least system resource usage should be Nvenc in your hardware setup.

Offloading encoding to a different GPU means the image data has to be copied from the Nvidia memory space over to the iGPU memory space, and this needs vastly more system resources than directly encoding within the Nvidia GPU. This is what "texture encoder" means: this means the encoder is running on the GPU and is directly reading the frame buffer where the image is rendered.
Nvenc is on a dedicated circuit within the GPU, so it doesn't need 3D computing resources.

Assigning OBS to the iGPU doesn't work. OBS needs to run where your monitor is connected and where the things you capture are being rendered. It's the same as with the texture encoding: it works by directly accessing the frame buffer of the app it captures, and this is only possible if it runs on the same GPU.

So use Nvenc for encoding. It's also the best encoder quality from all the available hardware encoders according to many tests from the last years. If the brand new CPU+iGPU you have gives better Quicksync quality is yet to see and a task for upcoming benchmarking/comparison tests. It would be a surprise - until now, Nvenc has been improved every GPU generation and was always the best encoder in terms of quality.

Thanks for your detailed reply.

I'm basing my assumptions off a few comments I've found online like this where he states QSV has come far enough that it's now slightly better than NVENC, and he provides videos to help prove it: (most specifically the middle video here)

https://www.youtube.com/watch?v=H0pCpNT4b-Q&t=620s

https://www.youtube.com/watch?v=mi8xlCz42CM&t=361s

https://www.youtube.com/watch?v=mi8xlCz42CM&t=282s


What are your thoughts on this? That video is 2 years old - surely by now it has improved even further as each chip has a better iteration of Quicksync.

You're right that I have my monitor connected to my dGPU and not the motherboard's iGPU. However I can seemingly still get it to record with Quicksync H.264 - I mean, it seems to record videos fine, except for the logfile stating that "the app isn't actually on an Intel gpu" etc. So that makes me wonder what it's using to record if not Quicksync??
 

koala

Active Member
EposVox presents the only valid comparison, because he's comparing quality by vmaf. The other videos look as if they are some Intel promotional videos, and these seem to compare the speed of encoding, not the quality. But speed is irrelevant, as long as the encoder is able to encode 60 fps.
However, it's a a 2.5 year old comparison. It doesn't feature the newest Nvenc encoders on the RTX 30xx and RTX 40xx and not the current Quicksync encoder built in your CPU.

If you're recording by using Quicksync, you're using Quicksync. It's not required to run OBS on the iGPU to use the encoder from that iGPU. It's only problematic to capture footage from a different GPU.
If cross-GPU encoding works fine for you, then use it. However, texture encoding is less demanding on system resources. Capturing from an app on your Nvidia GPU and using Nvenc to encode keeps everything on one GPU, it's almost invisible in terms of system load. This can be relevant in tight situations where other setups could have occasional stutter or lags because of data throughput bottlenecks.
 

Orz

New Member
Well that's very interesting.

Here I was under the impression that one of the core benefits of quicksync via an iGPU was to help offload resources and split up the workload, with perhaps even a benefit to performance or quality if using a very recent Quicksync version.

Seemingly for me it isn't using it properly anyway (as otherwise surely the logs wouldn't say "reverting to fallback" and would instead say "using new QSV").

That's a shame, but maybe my understanding was completely wrong.
 

koala

Active Member
Offloading resources to unused hardware is a good idea in general, unfortunately it isn't working out as expected with video encoding.

The video data that needs to be encoded is huge. It's multi gigabit per second. It takes a huge amount of the available bandwidth of the pci-express bus, and it must be transferred 2 times through the pci-express bus. First, it needs to be copied from the GPU where the video data is generated. That's the Nvidia GPU, where the monitor is connected. It's copied to a buffer in CPU memory space. Then it is copied to the GPU where the encoding takes place, that's the iGPU with Quicksync. Then the encoded data has to be copied back to CPU memory space for saving to disk or for streaming.

All this takes place continuously, every second. This is a huge load for the whole PC. If you're playing a game and loading a map, loading new graphics assets into the GPU might be delayed, because the pci-express bandwidth is occupied with transferring video data to encode. The game may stutter or lag or have longer loading screens.
This additional system load is more or equal to the load you would save with offloading encoding. So offloading isn't useful, if you can have the encoder on the same GPU as where the rendering is performed.
By not using Nvenc on the Nvidia GPU, you would not even save 3D computing resources on this GPU, since Nvenc is a dedicated circuit on the GPU. Any game runs the same with Nvenc active or not.
 
  • Like
Reactions: Orz

Orz

New Member
Your wisdom and insight is much appreciated.

That all makes perfect sense - I guess I was just wrong about how I thought it worked with the iGPU. For some reason I always thought that was the core benefit of iGPU's with quicksync - either an additional set of muscle to help the dGPU, or as a separate arm entirely to offload from the dGPU.

In that case - I'll stick with NVENC for OBS.

Maybe the quicksync is better suited to things like Handbrake?
 

koala

Active Member
The iGPU is meant for systems without discrete GPU. It's for cheap and simple hardware design for Office PCs, servers, notebooks. In general: machines for a non gamer audience. If you by a desktop PC with a discrete GPU, features of the iGPU are mostly redundant since a modern discrete GPU usually provides more powerful similar features.

On notebooks, the iGPU is vital for power saving. It's always being used, even with a discrete GPU present. The discrete GPU is only switched on for demanding apps such as games.
 
Top