[go: up one dir, main page]

Skip to content

Monday, 3 August 2026

In the feedback about dropping X11 support, one very surprisingly common comment is from users saying they "need" kgamma, a simple tool that allows the user to adjust the gamma, red, blue and green that gets drawn to the screen operating directly on the X server.

On our Wayland session we have colour management that blows simple gamma adjustment out of the water, so on the face of it it seems weird that this would come up. However at the same time, I get it. ICC profiles are very confusing and it's not the same as a few basic sliders that anyone can understand.

We want people to have the best transition to Wayland we can offer and this is a relatively easy fix.

The new tool

I have made a simple tool that edits the relevant part of an ICC profile - VCGTs.

"VCGT (Video Card Gamma Table): An optional, private tag inside an ICC file that stores 1D grayscale/gamma curves loaded directly into your graphics card's hardware Look-Up Table (LUT)."

That's a lot of fancy terms, but the key point is it's a tiny subset of the thing Kwin already supports. We can add a UI around those few values and not need to add a second code path in kwin or kscreen.

The UX is deliberately similar to the old UI.
Obviously it needs a round of polish (volunteers welcome!), but it's functional.

Why this is even better than on X11

Unlike KGamma on X11, this new tool:

  • Supports multiple monitors with independent values

  • Works with night colour rather than fighting over the same settings, Kwin will blend the two sets on top of each other

  • Gets applied by Kwin on startup so the first frame is perfect, rather than glitching during loading

What next

Whilst changing your red/green settings wtih sliders might be something a few users do, and we got a few comments it remains a niche case.
My intention is to post it as a standalone application on Flathub and not as part of Plasma. I think that strikes the right balance of providing support without holding ourselves back longterm.

Getting it

The new tool is available at:

https://invent.kde.org/davidedmundson/kgamma2

Usual CMake + build instructions apply.

Feel free to make pull requests and let me know if it helps solve your issue!

… is now hosted on KDE infrastructure, instead of this blog! Check out the July 2026 post, or the entire series here.

Welcome to the inaugural edition of This Month in KDE Linux hosted on blogs.kde.org!

Previously, these posts lived on Nate Graham’s personal blog. But KDE Linux is growing up and becoming a more important part of KDE, larger than its individual contributors! So it’s time to move the public communication to KDE infrastructure, and that’s where you’ll be able to read these posts going forward.

Without further ado, here’s how KDE Linux evolved in July:

QA & testing

This month, Thomas Duckworth and Bhushan Shah integrated the next-gen QA system they’ve been building!

It’s now testing tons of conditions to make sure KDE Linux continues to work as expected, and it also acts as a full-stack integration test suite. To illustrate the utility of such a thing, it’s already identified and protected users from two significant issues:

  1. A login-breaking KWin crash caused by a regression in gcc from Arch Linux (already fixed).
  2. A regression in automatically unlocking your wallet at login (also already fixed).

These tricky problems could only have been caught by the kind of full-stack integration test suite that KDE Linux has now.

If you’re interested in the details, Thomas Duckworth’s blog post on how the system works is worth a read. Thanks very much to Thomas and Bhushan for building this lovely system!

Security

Hadi Chokr implemented some kernel-hardening tweaks we learned about from the SecureBlue project that were relevant to KDE Linux and wouldn’t noticeably burden users.

Efficiency & performance

Nate Graham removed the kernel modules for various hardware watchdogs that aren’t relevant for desktop use, which slightly reduces CPU usage and improves boot times.

Thomas Duckworth switched the CUPS printing system to use socket activation, which allows its services to only run when needed.

Software support package downloader + support for Java and DOS apps

Hadi Chokr implemented a major improvement to the “Package Compatibility Helper” tool that now allows it to — with the user’s consent — download software from Flathub to handle files that the user tries to open, but that nothing on the system can currently open.

Hadi then made this work for Java apps; the first time you try to launch one, the tool will ask you if you want to download a Java Runtime Environment (JRE). If you approve, it will do so and then launch the app using the JRE:

After that, Hadi implemented support for DOS apps; trying to launch one will offer up DOSBox. Now you can have that authentic 1993 Doom experience:

This system can be extended to support even more things in the future! And it’s been written in a generic enough way that it would be useful for any other image-based OS using Flatpak, as well.

Bugs fixed

Philip Grant fixed the mechanism that ensures that existing KDE Linux systems have the same Flatpaks installed as are pre-loaded on new systems, as it had various bugs that prevented it from working properly.

David Fundament fixed the script that disables USB auto-suspend for input devices so that it works with devices lacking a product name.

WenChao Zhang restored the esp4 and esp6 kernel modules that had been removed to mitigate the “DirtyFrag” vulnerability. The vulnerability has been fixed now, and missing those modules had broken IPsec VPNs, so they’re back now.

Hadi Chokr made WWAN modems work out of the box.

Documentation

Thomas Duckworth documented how to use and extend the new QA system.

Nate Graham documented how to make the Fcitx 5 input method (for CJKV input) work with apps still using the XWayland compatibility layer.

Hadi Chokr documented how to set up bootloader menus so you can choose between booting KDE Linux or another OS on the same computer. However, setting up such a system is left as a manual exercise for the reader, as currently the KDE Linux installer does not yet formally support complex disk setups. This will come later.

Grab bag

Prajna Sariputra pre-installed vulkan-virtio, improving performance in VMs whose graphics drivers support Vulkan.

Thomas Duckworth made the set-up-systemd-extension and toggle-developer-mode tools only prompt for authentication once.

Nate Graham removed the “Push Services” library and System Settings page, because it’s not mature enough for shipping yet.


How you can help

KDE Linux is making steady progress towards its Beta milestone, and is now 83% of the way there.

There’s lots to do! If you’re a fan of the project, please help out; there are many ways:

Sunday, 2 August 2026

for the past few months i have been working on implementing rich text in drawy as part of google summer of code 2026.

Overview on the old implementation:

The old text logic depended on a manual implementation, almost everything was built from scratch using a string. Placing the cursor, caret movement, selection operations, line and word boundary detection, editing operations were all implemented from scratch.

I found implementing all of this impressive, but while it worked for plain text editing, this code was hard to maintain / extend, and it would have been nearly impossible to add the features that were added.

Phase 1: Refactoring
Goal: Rewrite without breaking anything

I replaced the string with QTextDocument , all the things that were written manually before was gone and now editing operations are handled by QTextCursor.

OperationHow it was doneHow it is done now
Placing cursorBinary search over the line, measuring substring widths with QFontMetrics to find which character the click landed on.documentLayout()->hitTest()
Caret movementManual index calculation increment/decrement; up/down walked to the previous/next \ncursor.movePosition(Left/Right/Up/Down/WordLeft/WordRight)
SelectionTwo indices, with selection rectangles rebuilt line-by-line using QFontMetricsQTextCursor anchor/position, drawn via QAbstractTextDocumentLayout::Selection
Word/line boundary detectionManual scan for separator characters or \ncursor.select(WordUnderCursor / LineUnderCursor)

Phase 2: Rich Text

1. adding IME support
An Input Method Editor (IME) is how the OS handles input for languages that can't be typed with a single key press per character without it user can't type with Arabic, Japanese, Chinese, dead keys, etc The OS sends this as a QInputMethodEvent, which Drawy previously didn't handle. IME now works correctly here is demonstration of how it works with CJK input:

https://youtu.be/2W2R9udyKKU?si=BLwUmLpcg_E9XE9T

2. Properties:
user now have much more control over properties i added support for choosing font family, font style, text alignment, list format.

per range formatting is also now implemented meaning user can set different colors, size, font, style to different parts of the text.

3. Word Wrapping:

When the text box is resized, text now wraps to fit within its bounds.

https://www.youtube.com/watch?v=AqGJd5Bf6sw

4. undo / redo:

text history is managed by two stacks: drawy global stack, and QTextDocument's internal one. Only one is active at a time. While the user is editing text, the global stack is disabled and QTextDocument's internal stack takes over, handling text edits and property changes, etc. Once the user exits edit mode, the internal stack is disabled again, any changes go through Drawy's global stack instead, stored as HTML.

5. Spell checking

In my proposal, I didn't plan much time for spell checking, I thought that I'd just wire Sonnet in and be done with it. I later found out that Sonnet's ready-made integrations are built for QTextEdit and QML, so I had to write my own spell-checking pipeline instead.

  1. Each block (paragraph) is passed to Sonnet::gusser to guess its language and determine which dictionary to use.

  2. Text is split into words using QTextBoundaryFinder.

  3. Sonnet::Speller checks whether each word is misspelled.

  4. Misspelled words are highlighted using QSyntaxHighlighter.

added new menu to settings using Sonnet::ConfigWidget to allow customizing spell checking:

Note: Everything mentioned in this blog is on the gsoc2026 branch currently and will be merged once GSoC is completed.

Gratitude:
I am very grateful to my mentor Laurent Montel for his time and effort guiding me throughout this project.

Saturday, 1 August 2026

Time for another bi-monthly update on what happened around Itinerary! Since the previous report there’s a new combined journey view, support for ride sharing services and new Apple Wallet pass formats, among many other things.

New Features

New combined journey view

With more and more journeys being backed by online realtime and schedule data, access to the journey details (intermediate stops, journey map view, etc) via nested actions has become increasingly cumbersome. Therefore Jonah redesigned the details pages for all transport entries (trains, buses, ferries, flights) to have a new bottom toolbar to easily access that information.

Screenshot of Itinerary showing intermediate stops of a train trip.
New tabbed journey details view.

The journey details view now also allows to query public transport departures at any intermediate stop, which is useful e.g. when doing manual rerouting in case of more complex disruptions.

Ride sharing

After Transitous got support for ride sharing earlier this year, this has now also reached out client applications. Both Itinerary and KTrip have a mode filter for this now, and Itinerary can add ride sharing trips to the timeline.

Screenshot of Itinerary's mode of transport filter options for journey searches, with the newly added option for ride sharing services.
Mode of transportation filter options.

New Apple Wallet pass formats

Itinerary can now display a new variant of the Apple Wallet pass format, so-called “poster event tickets”. Conceptually those are similar to the existing event tickets but have very different layout and content, which wouldn’t render at all so far.

Screenshot of Itinerary rendering an Apple Wallet poster event ticket test pass.
Test pass with the so-called poster event ticket layout.

The background blur effect and some of the font sizes are still off, but at least the relevant content is now displayed correctly.

There’s also a few format additions affecting all pass types that are now supported:

  • Four additional barcode types (EAN13, Code 39, Codabar and ITF).
  • Multi-row auxiliary fields.
  • RGBA color values.

A few gaps in the existing format support were also fixed while at it:

  • Correctly displaying date-only and time-only fields.
  • Finding image assets only existing in a higher pixel ratio variant.
  • Fixed organization and description fields not being translated.

Besides the visual representation Apple Wallet passes can in newer versions also contain machine-readable semantic information about their content, something that is now used in the travel document extractor as well.

Infrastructure Work

Thanks to Jonah’s work, MOTIS, the routing engine behind Transitous got support for the GTFS Transit Ticketing Extension. This makes booking links available for more operators, which are then shown by Itinerary or KTrip.

Android and Linux platform integration

There has been generic work on platform integration for all of KDE’s (mobile) apps, which of course also benefits Itinerary.

For Android there’s a dedicated blog post. Since then locale-aware comparisons have been fixed in Qt (for 6.13), and Itinerary got built-in crash reporting that is already helping during development. Some necessary changes to finally fix not being able to open files from cloud shares is still stuck in review though.

For Linux the focus has been on permission checks and GPS access in a Flatpak sandbox (blog post). The foundation for the Qt permission API to support the Flatpak persmission system has been integrated meanwhile, for Qt 6.13.

Indoor OSM standardization

There also have been efforts on evolving and standardizing modelling and mapping of indoor spaces in OpenStreetMap. While that is of course done with the entire OSM ecosystem in mind, it also benefits Itinerary, Transitous and Kongress. There it helps with improving routing through buildings and with visualizing building interiors.

GBFS v3 support continued

The previous report had mentioned work on improving the support for GBFS v3 sharing vehicle data. This continued and now also has some more visibile results:

  • The GBFS feed database has been updated to contain about 1.500 feeds from all over the world, and can now be online updated independent of the application itself.
  • Rider capacity for vehicles is shown when available (mainly relevant for cars).
  • Opening hours of rental vehicle stations or rental vehicle networks can now be displayed.
Screenshot of Itinerary's station map showing the opening hours of a bike rental station.
Opening hours of a rental service.

Events

A few members of the Transitous community will be at State of the Map 2026 in Paris end of August, and I’ll be speaking about Transitous there.

State of the Map 2026 logo

In September there’s KDE Akademy 2026 in Graz, which is probably one of the largest gatherings of the Itinerary community. I’ll be presenting how continuous delivery helps Itinerary with QA.

I'm going to KDE Akademy 2026 banner

Beginning of October we have the second Open Transport Community Conference in Bern, both the Transitous and the Itinerary community will be present there. A few tickets are still available.

Fixes & Improvements

Travel document extractor

  • New or improved extractors for 12go, Accor, BDŽ, Collegeboard, Doodle, DRK, Flixbus, HVV, IRCTC, KTMB, PKP, Polferries, Sportio, SRT, Ticketspot and VR.
  • Fixed extracting return descriptions from standard UIC FCB NRT ticket barcodes (bug 520826).

This has been made possible thanks to your travel document donations!

Public transport data

  • Allow location searches without explicitly selecting a country.
  • Improved aggregation and sorting of stop search results.
  • Added support for Amtrak onboard API.
  • Added support for resolving locations from coordinates and booking URLs for LTG Link.
  • Fixed sorting of countries on the backend configuration page.
  • Fixed DB booking URLs for connections where they don’t actually sell tickets.
  • Fixed displaying text on light line colors with light color schemes.

All of this also directly benefits KTrip.

Itinerary app

  • Allow to add transfers between multi-day events.
  • Fixed activating booking links on details pages.
  • Fixed too narrow global drawer.
  • Fixed timer overflow on timeline updates for trips too far in the future.
  • Fixed notification configuration when running in a Flatpak sandbox.
  • The time picker on Linux now has a button to easily select “now”.
  • Fixed France accidentally not being considered part of the EU roaming area.
  • Show all reserved seat numbers on the vehicle layout page.

How you can help

Feedback and travel document samples are very much welcome, as are all other forms of contributions. Feel free to join us in the KDE Itinerary Matrix channel.

Welcome to a new issue of This Week in Plasma!

…but before we start, here’s a quick reminder that we’ve entered the last week to submit your proposal for the next KDE Goals cycle! If you’re not ready to champion a goal, you can still get involved by joining one of the existing proposals as a contributor or supporter.

And now, without further ado…

In addition to the headliner feature and expected UI improvements and bug fixes, this week features some promising technical and performance improvements. Have a look:

Notable new features

Plasma 6.8

You can now make the emojis in the Emoji Selector window bigger or smaller. (Jason Uithol, plasma-desktop MR #3878)

On System Settings’ Display Configuration page, you can now move screens pixel-by-pixel using the arrow keys while in layout editing mode. (Antti Savolainen, kscreen MR #476)

Notable UI improvements

Plasma 6.7.4

The Emoji Selector window is now always tall enough to accommodate its sidebar without scrolling. (Christoph Wolk, KDE Bugzilla #523090)

Spectacle now detects QR codes in screenshots that you take in such a manner that the main UI is never shown; if you click “Annotate” from the notification about it, the QR code will be detected there. (Kai Uwe Broulik, KDE Bugzilla #521097)

Plasma 6.8

In Spectacle’s settings window, image quality controls are now only available for image types whose quality level is adjustable. (Zhora Zmeykin, spectacle MR #568)

Clarified the instructions on System Settings’s Remote Desktop page a little bit. (Nate Graham, krdp MR #224 and krdp MR #225)

Kup 0.11.0

Modernized the UI for the Kup backup system’s System Tray widget, so now it matches other Plasma widgets that can similarly show multiple items, each with their own actions. (Bharadwaj Raju and Tomáš Hnyk, kup MR #53 and kup MR #54)

New New
Old Old

Notable bug fixes

Plasma 6.6.7

Fixed a case where the ksystemstats background service could crash seemingly randomly. (Méven Car, KDE Bugzilla #523562)

Fixed a recent regression that made blank document icons appear in the notification history view. (Kai Uwe Broulik, KDE Bugzilla #522846)

Fixed a bug that could make extremely long words in Plasma tooltips overflow rather than wrapping. (Nate Graham, KDE Bugzilla #523614)

Fixed a bug that made third-party widgets fail to inhibit power management more than once. (Vincent de Robert, KDE Bugzilla #523605)

Plasma 6.7.4

Fixed a visual glitch where the highlight area for expanded list items in various System Tray widgets would sometimes be too small to fit its contents. (Bharadwaj Raju, KDE Bugzilla #506295)

Plasma 6.8

Fixed an issue that could sometimes corrupt very large screenshots taken in Spectacle when they were pasted elsewhere. (Cezar Craciunoiu, spectacle MR #566)

Frameworks 6.29

Opening various windows and dialogs using Kirigami components no longer makes the content scroll into view for no particularly good reason. (Manuel Alcaraz Zambrano, KDE Bugzilla #515811)

ddcutil 2.2.8

Fixed multiple issues that could make the powerdevil background process freeze or crash. (Sanford Rockowitz, ddcutil issue #581 and ddcutil issue #587)

Notable in performance & technical

Plasma 6.8

Significantly improved performance with external GPUs. Read more about this on Xaver’s blog! (Xaver Hugl, kwin MR #7101)

You can now change the size (and effective resolution) of virtual screens created for screencasting, rather than them being fixed to a resolution of 1920 × 1080 pixels. (David Edmundson, KDE Bugzilla #512620)

Panel floating-ness can now be changed using Plasma desktop scripting. (Ramil Nurmanov, KDE Bugzilla #521549)

KWin now recognizes the “Pick up phone” and “Hang up phone” keys on some keyboards, allowing them to be used in keyboard shortcuts to trigger actions. (Méven Car, kwin MR #7892)

Frameworks 6.29

Fixed a performance issue that could make Plasma freeze when it sent a notification with a lot of emojis in it. (Devin Lin, KDE Bugzilla #508070)

How you can help

KDE has become important in the world, and your time and contributions have helped us get there. As we grow, we need your support to keep KDE sustainable.

Would you like to help put together this weekly report? Introduce yourself in the Matrix room and join the team!

Beyond that, you can help KDE by directly getting involved in any other projects. Donating time is actually more impactful than donating money. Each contributor makes a huge difference in KDE — you are not a number or a cog in a machine! You don’t have to be a programmer, either; many other opportunities exist.

You can also help out by making a donation! This helps cover operational costs, salaries, travel expenses for contributors, and in general just keeps KDE bringing Free Software to the world.

To get a new Plasma feature or a bug fix mentioned here

Push a commit to the relevant merge request on invent.kde.org.

Friday, 31 July 2026

Let’s go for my web review for the week 2026-31.


Sovereignty is a substrate

Tags: tech, hardware, supply-chain, complexity

Interesting piece which shows very well the complexity of the hardware supply chain. The parts which matter the most are largely ignored by everyone.

https://negroniventurestudios.com/2026/07/28/sovereignty-is-a-substrate/


Do LLMs know how to make software? (No.)

Tags: tech, ai, machine-learning, gpt, copilot

Funny, I was using that exact same term recently: “brute-force driven development”. It describes fairly well how the harnesses work.

https://mir.aculo.us/do-llms-know-how-to-make-software-no/


Getting access to the /tmp of a systemd service with PrivateTmp=yes

Tags: tech, systemd

Don’t forget, it’s all namespaces!

https://utcc.utoronto.ca/~cks/space/blog/linux/SystemdPrivateTmpWhere


The Hamburger Database Design Pattern

Tags: tech, databases, design, pattern

Interesting pattern for managing materialized views over a long time.

https://pagedout.institute/download/PagedOut_009.pdf#[{“num”:100,“gen”:0},{“name”:“XYZ”},null,null,null]


Memory-level parallelism: AMD is the king

Tags: tech, cpu, amd, performance

They’re definitely handling this part right, they seem well ahead everyone else.

https://lemire.me/blog/2026/07/25/memory-level-parallelism-amd-is-the-king/


C++26: Reducing undefined behaviour

Tags: tech, c++, standard, safety, reliability

More signs of C++26 being an important new standard for reliability and safety.

https://www.sandordargo.com/blog/2026/07/29/cpp26-reduces-undefined-behaviour


C++ float-to-int conversion can be undefined behavior

Tags: tech, c++, safety

This is a bigger trap than it sounds. It is very easy to fall into it.

https://kttnr.net/blog/cpp-float-to-int-conversion-undefined-behavior/


Learn WebGPU for C++ documentation

Tags: tech, web, webgpu, graphics

Curious about WebGPU? This looks like it’ll become a very good resource for that.

https://eliemichel.github.io/LearnWebGPU/


The Website Specification

Tags: tech, web, standard

This is very comprehensive! It is also overwhelming… So many things to think about when making a website nowadays.

https://specification.website/


What even are microservices?

Tags: tech, architecture, microservices

Since I still hear about “microservices” more often than I’d like to. Here is another piece which points the trade-offs and that really there’s no one size fits all.

https://var0.xyz/posts/what-even-are-microservices.html


Code Review Responses: Add Context When It Counts

Tags: tech, codereview

There are indeed cases where it’s important to provide more context on the code which changed following up a comment by the reviewer.

https://testing.googleblog.com/2026/05/code-review-responses-add-context-when.html?m=1


How I Find Problems to Solve as a Staff Engineer

Tags: tech, engineering, leadership, problem-solving

Good approach, you indeed need to immerse yourself in the context and see the recurring patterns. That’s the best way to figure out impactful solutions to recurring issues.

https://lalitm.com/post/find-problems-staff-engineer/


Your harddrive is probably full

Tags: tech, storage, resources, procrastination

Interesting take, it’s more than just about hard drives being full. Indeed, there are many things on which we tend to procrastinate. But on the other hand… so many budgets to track otherwise!

https://www.marginalia.nu/log/a_139_hdd/


The Crossover Project

Tags: tech, software, engineering, agile, craftsmanship

Very interesting series I previously missed. It explores if software engineering is really engineering, and the differences with other engineering fields. Quite a few nice lessons to draw from it.

https://www.hillelwayne.com/tags/crossover-project/


Kaizen Board: A Reply on Every Sheet

Tags: tech, quality, kaizen, japan

Wondering how that works when it runs properly? Here is an example of a Kaizen board in a japanese factory.

https://www.leanblog.org/2026/07/kaizen-board-manager-comments/



Bye for now!

Performance on “secondary” GPUs has historically been suboptimal on Linux, especially with external GPUs. Let’s take a look at why it’s slow, and how we’re finally fixing it.

How Multi-GPU even works

To know how things work with multiple GPUs, we first need to look at how applications present images in single GPU systems.

With Wayland, the linux-dmabuf protocol is used for sharing images from applications to the compositor. The compositor advertises which GPU it’s using, and a list of drm formats1 and format modifiers2 it can make use of.

The application then allocates a dma-buf (direct memory access buffer) for each image with one of the supported formats + modifiers on the GPU of the compositor, and sends the compositor file descriptors for these buffers to share them.

This works quite well, but only for single GPU systems. In linux-dmabuf version 5, the compositor can only advertise one GPU as being usable! The app could still attempt to pass the buffer of any GPU to the compositor, but that can fail, requiring fallbacks, and it can cause really big performance issues.

Why it’s slow

When you import a dma-buf to a GPU, the kernel tries to be helpful and automatically ensures for you that the GPU you’re using can access the buffer. This sounds nice, and can be useful, but it’s also the source of all our performance problems.

Let’s say you have a laptop with an integrated GPU, and a dedicated GPU. When you start a game on the dedicated GPU, what would happen is

  1. the game allocates a buffer on the dedicated GPU
  2. it passes that buffer to the compositor
  3. the compositor imports the buffer into the integrated GPU

To make step 3 work, the kernel would move3 the buffer to system memory. This can be really terrible for performance, since system memory is terribly slow in comparison to video memory, and the dedicated GPU has to go through the PCIe bus to access it, which has high latency.

To solve that problem, Vulkan and OpenGL drivers compare the GPU the application is using with the one the compositor advertises. If they’re not the same, then the driver will not share the buffers on the GPU with the compositor, but actually create a copy in system memory and share that copy with the compositor instead. So this would be

  1. the game allocates a buffer on the dedicated GPU
  2. the driver copies the buffer to another buffer in system memory
  3. it passes that other buffer to the compositor
  4. the compositor imports the buffer into the integrated GPU

Now imagine you’re not playing the game on your laptop display, but you have an external display connected to the dedicated GPU. The HDMI port on a lot of laptops is wired to the dedicated GPU, so this is a really common scenario. What happens in that case is

  1. the game allocates a buffer on the dedicated GPU
  2. the driver copies the buffer to another buffer in system memory
  3. it passes that other buffer to the compositor
  4. the compositor imports that other buffer into the integrated GPU
  5. the compositor composites with the integrated GPU
  6. the compositor copies the composited result to the dedicated GPU

So your game gets copied to system memory and back to video memory, for no real reason. The performance hit caused by that isn’t great in general, but it gets so much worse with external GPUs.

When all you have is one USB C cable to transfer data from and to the GPU, with high resolution monitors the bandwidth of that cable can be too small even for copying in one direction! Going in both directions completely kills performance. For example, I have a setup with

  • a Framework laptop 13
  • a rx 5700 XT in an external GPU enclosure
  • a 5120x1440 monitor at 120Hz connected to the external GPU

If I start vkcube (a super simple test app) on the external GPU, move it to the monitor and make it fullscreen, it only reaches 55fps!

How to fix it

In principle, we “just” need to stop the driver from copying the buffer around, and instead have it pass the original buffer from the dedicated GPU to the compositor. That’s exactly what I proposed version 6 of the linux-dmabuf protocol for: The compositor can support a list of GPUs instead of just one, and the application can tell the compositor which GPU it should import a given buffer into.

This all sounds nice and simple in theory, but as always, it wasn’t quite that simple in practice. There are basically three problems that needed to be solved for this change to be useful:

  • the driver needs to not do the copies unless actually necessary
  • the compositor needs to do the copies when required
  • to actually get any performance gains, the compositor needs to skip the copies whenever possible

Thankfully, I didn’t need to do this alone. Victoria Brekenfeld from System76 implemented support for the protocol in Mesa and Smithay, the library used by the cosmic compositor.

Unfortunately, it took a long time to support the protocol in a useful way in KWin. I needed to make it

  • aware of multiple GPUs beyond just displaying on them
  • properly handle GPU hotplug with that new infrastructure
  • deal with all the weird GPU setups in embedded systems
  • track which GPU each buffer is on
  • have generic multi GPU copy infrastructure
  • make those multi GPU copies actually as fast as the copies Mesa does internally
  • deal with GPU resets correctly while doing multi GPU copies
  • actually implement the Wayland protocol bits

Some of this was just moving code from out drm backend to more generic places, but a lot of it required doing things from scratch. Especially GPU reset handling was challenging because KWin’s effects APIs make a lot of assumptions about OpenGL contexts and didn’t support just stopping rendering a frame once it started.

While working on this, I also added Vulkan support to KWin specifically to make the multi GPU copies as fast as possible, which also took some time. As a positive side-effect though, we now have basic Vulkan infrastructure in KWin that can be used for a future Vulkan renderer.

Finally, just over 2 years after I first proposed the protocol, we had complete enough implementations to prove it works as expected and the protocol was merged. Since then, the KWin implementation was merged, the Mesa implementation should be merged soon and Nvidia has an (as of time of writing, unreleased) implementation of the protocol in their driver as well.

The actual performance gains

So, how much does this actually help? With vkcube, we go from 55 fps to the full 120 fps of the monitor, but that’s hardly a practically relevant test.

So I fired up Cyberpunk 2077 with the “low” graphics preset and it went from 27 fps with Mesa main to 50 fps with linux-dmabuf v6. That’s more than 80% better performance!

Mesa mainMesa with dmabuf v6
Mesa maindmabuf v6

From playing around a bit with the graphics settings, it seems likely that the game is bottlenecked by the USB C bandwidth, so the performance uplift could be even better with additional driver optimizations.

I haven’t been able to benchmark the impact of dmabuf v6 on “normal” laptop setups, because I don’t yet have access to a Nvidia Vulkan driver version implementing the protocol, and I don’t have a laptop with a dedicated AMD GPU. If I had to guess though, I’d expect improvements there to be much more moderate, probably something in the 5-10% range. I’ll update this post once I know more.

However, this performance uplift comes with two big caveats…

When does this work?

With the current KWin implementation, compositing always happens on the “primary” GPU. On laptops, by default that’s whatever GPU the internal display was connected to when KWin started. This means you can only get those large benefits if the game gets direct scanout.

My rx 5700 XT doesn’t have support for color pipelines, so I only get the performance benefit if HDR is disabled, night light is disabled and no color profile is used. I already have a merge request to lift that restriction though, stay tuned for part 2 to find out more about that!

There is another caveat though, and that’s a far bigger challenge: Most games still run on X11, and implementing the protocol (in a useful way) in Xwayland is incredibly challenging because of some assumptions X11 makes. I don’t know how that could be fixed, or even if it’s feasible at all, so for now, you can only get these benefits with games using Wayland directly.

For a lot of native games, using SDL_VIDEODRIVER=wayland does the trick, and for most Windows games, you can use Proton forks with the Wine Wayland driver. In my experience, Wine Wayland works really well and even HDR just works™ with it nowadays.


  1. drm formats describe how the memory in the buffer is used, like “16 bits red”, “8 bits red, 8 bits green, 8 bits blue, 8 alpha bits” or similar 

  2. format modifiers (more or less) describe how the pixels are laid out in memory 

  3. meaning, it will create a copy, and then delete the original 

Thursday, 30 July 2026

We are happy to announce the release of Qt Creator 20.0.1!

The release improves tool detection and the default session directory for chats in the AI Agent Client Protocol integration, fixes various issues with CMake Presets as well as some crashes, and contains various other improvements.

Wednesday, 29 July 2026

GSoC Alumni Camp Delhi 2026 – My Experience

I attended the GSoC Alumni Camp in Delhi, it was an amazing opportunity to make people who are already familiar with open source aware of KDE Community and I was actually able to do that. The event itself was from 8:00 A.M. to 10:30 P.M. at night. The event started off with a formal opening session. Soon after was the scavenger hunt (we were hunting people!) it was a 5x5 grid where you needed to get signatures of people who fit the question in the box. A few of them were :

  • I was born in July (I signed a lot of them )
  • I have held a koala
  • I know 3+ languages
  • I can juggle
  • I prefer go/Rust and so on. In all honesty it was an amazing ice breaker and something to get to know people. After that there were a few unconferences followed by lunch and then more unconferences till 6:00 P.M. after that lightning talk sessions started and fortunately I got to represent KDE.

Unconference Session – From GSoC Student to Maintainer/Mentor

I also hosted one of the first unconference sessions titled:

From GSoC Student to Maintainer/Mentor

I wasn't expecting a large audience, but at one point the room was at its capacity around 40 attendees.

The audience included:

  • GSoC Organization Administrators
  • Mentors
  • Open source employees
  • Existing contributors
  • Google code-in students

The discussion focused on contributor retention after GSoC and how organizations can better support contributors beyond the program. It led to some interesting discussions where we found out what some organisations are doing.

Discussion Points (Noted by an org admin)

Leverage Contributors as Subject Matter Experts

GSoC contributors naturally become subject matter experts for the components they build. When new issues, bug reports, or pull requests relate to their work, proactively invite them to participate in the discussion or review. This helps contributors feel that their expertise is valued and keeps them engaged with the project beyond GSoC.


Improve Communication Around Pull Request Reviews

Complex pull requests often require focused reviews and may take longer than isolated bug fixes. While taking the necessary time for a thorough review is important, mentors should acknowledge review requests and, where possible, communicate an expected timeline. Even a brief acknowledgment improves the contributor experience.


Using Organization Stipends for Contributor Retention

Explore using the GSoC organization stipend to support promising contributors after the program ends. This could fund continued maintenance or feature development through a transparent platform such as Open Collective, allowing contributors to invoice for their work and remain actively involved with the project.


Recognizing Mentor Contributions

Mentoring requires a significant investment of time in reviewing code, guiding contributors, and providing technical support. Consider allocating a portion of the organization stipend to compensate mentors, recognizing their efforts and encouraging long-term participation.

KDE's Community Support

Another topic that generated considerable interest was KDE's support for its contributors.

I talked about how KDE sponsors some students to attend Akademy, and how I was also sponsored to attend the event, which a lot of people agreed organizations should've done (some did, a lot didn't) but a lot of people agreed that when an organization consider these things contributors stay.

After all the unconferences ended a lot of people came up to me saying mine was the best and I managed and engaged everyone in the best way possible ( I was on cloud 9).

Lightning Talk

One of the highlights was being selected to give a lightning talk. Only 18 participants were chosen, and I was one of them.

My GSoC project Join KDE is an advertisement for KDE itself, so the project itself became an easy conversation starter. It was a great opportunity to introduce KDE and make more people aware of the organization.

Although I did fumble the last part of my presentation it was more of me being confused where my slide went (some slides were misplaced) aside from that it went as any other informative talk but hey I was funny on the stage (refer to the pics) so people remember me! You win some you lose some, oh well.

Conversations Throughout the Event

Outside the sessions, I had some interesting discussions with contributors from different organizations. Some contributors showed interest in working wwith us while some showed interest in our eduction/science side but honestly it's hard to bring contributors over as they're in different domains, org admins/mentors or they're busy with their careers.

SU2 Foundation

I had a conversation with a maintainer from the SU2 Foundation, whose work focuses on computational fluid dynamics.

We discussed KDE's scientific and educational initiatives, including KDE for Scientists and several education-related projects. I also shared the KDE For You website as an introduction to the wider KDE ecosystem.

After Party

The conversations continued during the after-party on the following day.

I met a group of students who had become interested in open source after interacting with contributors throughout the event. They had originally attended as friends of another contributor.

One of them is now actively looking for a project to begin contributing to within KDE. YAYYY!

New Contributors

Several first-time contributors approached me asking about projects suitable for beginners.

I introduced them to a number of KDE projects and explained possible contribution paths.

But the same issue they're busy with the beginning of their careers.

Overall Thoughts

The Alumni Camp was one of the best ways to make people aware of KDE and I tried my best while i had fun ( we played uno there! Will bill the cards to the organization jkjk), a lot of people seemed intrigued and asked me to share some stuff about KDE to them or they'll try it on their own. Met someone from GNOME (they didn't get any lightning talk HA! I know, I know no inter project fighting that's bad) had some good conversations, teased the person from GNOME, had breakfast with them, and tried to make the most of the unconference session and the lightning talks to at least get people to know the name KDE!

Solo Photo
cakes
Gifts
Group photo
after party
Lightning talks
card