About QtQuick and RHI
QtQuick, in one word, is amazing.
QtQuick, in slightly more words, is a scene graph implementation. At a developer level we create abstract "Items" which might be some text or a rectangle etc or a picture. This in turn gets transformed into a tree of nodes with geometry, "materials" and transforms. In turn this gets translated into a big long stream of OpenGL instructions which we send to the graphic card.
Qt6 will see this officially change to sit on top of the "Render Hardware Interface" stack, that instead of always producing OpenGL, will support Vulkan, Metal and Direct3D natively. The super clever part about it is that custom shaders (low level fast drawing) are also abstracted; meaning we will write some GLSL and generate the relevant shader for each API without having to duplicate the work.
This blog series gives a lot more detail: https://www.qt.io/blog/qt-quick-on-vulkan-metal-direct3d.
Plasma code primarily interacts with Items and occasionally nodes, slightly above the level being abstracted.
Current State
Qt 5.15 ships with a tech preview of RHI and the Vulkan interface. I spent some time to set it up and explore what we need to do to get our side fully working. With some packages installed, a few plasma code fixes and some env vars set, I have a fully working Vulkan plasmashell.
Screenshot
Unsurprisingly it looks the same, so a screenshot is very unexciting. I enabled the Mesa overlay as some sort of proof.
The reason it shows 2fps is because plasmashell only updates when something has changed; in this case the textcursor blinking every 500ms.
Despite it being a preview it is in a damn good state! Things are usable, and really quite snappy, especially notification popups.
What needs work
Some things need work on our side, in particular:
- All of our custom shaders need porting to the updated shader language.
- Taskbar thumbnails use low level GL code that needs one extra layer of implementation.
- Use of QtQuickWidget in systemsettings.
It means some elements are invisible or don't render with the full graphical effects, or in the last case, crash.
But in the whole scheme of things, everything is in a very encouraging state
What about KWin?
Whilst QtQuick is the cornerstone of plasmashell, systemsettings and so many applications, for historical reasons KWin made use of OpenGL before it was a mainstream part of Qt. Therefore this setup is mostly unrelated to KWin. Fortunately there's no reason these two have to be in sync.
Wrap up
This isn't usable for end users, and given it's only a tech preview upstream, this is not something we can ever expect to officially support within Plasma 5.
But we can start doing the prep work, also the current state is so promising I think we can deliver a native Vulkan experience to users on the first day of Plasma 6.
“But we can start doing the prep work, also the current state is so promising I think we can deliver a native Vulkan experience to users on the first day of Plasma 6.”
Amazing. I can’t wait for it.
Could you share the steps needed to enable that?
If you have shaders you want to port, ping me on IRC with which ones you’re doing so that we don’t duplicate work.
Great work, looking forward to plasma 5 with vulkan or as you stated plasma 6!!
This is so cool! I really enjoy reading this kind of blogs, it shows us a road ahead with even brighter days than the already now bright days 🙂 keep it up!
Will using Vulkan for Plasma fix this bug?
https://bugs.kde.org/show_bug.cgi?id=415853