https://bugs.kde.org/show_bug.cgi?id=440386

--- Comment #5 from Fabian Vogt <fab...@ritter-vogt.de> ---
I did some more comparisions with weston.

perf shows that while weston runs into the "fs_variant_whole" path in llvmpipe,
kwin_wayland almost exclusively uses the slower "fs_variant_partial" functions.
With LP_DEBUG=counters, it's visible that weston triggers this because it
renders mostly opaque triangles, while kwin doesn't have any of them. With
apitrace, it's visible that Weston does rendering with GL_BLEND disabled, but
kwin_wayland has it enabled. While the surface(s) used by firefox are all RGBA,
it calls "set_opaque_region" to make them totally opaque:

[4161028,247]  -> xdg_surface@45.set_window_geometry(0, 0, 1920, 982)
[4161028,579]  -> wl_compositor@4.create_region(new id wl_region@54)
[4161028,740]  -> wl_reg...@54.add(0, 0, 1920, 982)
[4161029,064]  -> wl_surface@41.set_opaque_region(wl_region@54)
[4161029,197]  -> wl_region@54.destroy()

KWin seems to ignore this. With disabled blending, kwin uses "fs_variant_whole"
as well and CPU usage goes down ~10%.

What I also noticed is that firefox uses two surfaces for rendering. The main
surface is completely empty (all transparent) and only its subsurface has
content. While weston draws a single quad, kwin renders both. This doesn't seem
to make a big difference, it's probably discarded early on.

My current theory about the huge difference between DRM and other platforms is
that access to the mapped framebuffer is just slow (for blending that hits
twice), and on top of that it's mapped and unmapped for each frame, which
causes page faults.

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to