Commit graph

18843 commits

Author SHA1 Message Date
Vlad Zahorodnii
b5a1eba277 Properly schedule repaints with premature presentation timestamps
The last presentation timestamp might be in the future by a couple of
hundred microseconds.

This may break timestamp aligning code because it assumes that the
last presentation timestamp is less or equal to the current time.

In order to properly handle this case, we have to first compute the
next expected presentation timestamp by advancing the last presentation
timestamp by the amount of vblank interval. If that fails, we can safely
resort to aligning timestamps.

BUG: 431509
BUG: 431449
2021-01-14 20:45:20 +02:00
Vlad Zahorodnii
242439b8af Minor whitespace fixes 2021-01-14 11:40:22 +02:00
Vlad Zahorodnii
e5abd704de Remove stray file and unused variable
It seems like they were introduced by accident while resolving merge
conflicts.
2021-01-14 11:39:33 +02:00
David Edmundson
85d04cf60d Add ftrace markers
This logs to a tracefs filesystem which can be viewed in tools such as
gpuvis to see precise timings of activities in relation to other trace
markers in X or graphic drivers.

This patch is loosely based on D23114. Though modified with thread
safety, support for string building, and a RAII pattern for durations.
Ultimately that expanded it somewhat.
2021-01-14 09:31:59 +00:00
Méven Car
4f744d1bb6 Add TestOutputManagement::testOutputDeviceDisabled test
Allow VirtualBackend to supports Output changes.
2021-01-14 08:21:59 +00:00
l10n daemon script
866dfb4e89 SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2021-01-14 07:04:00 +01:00
Vlad Zahorodnii
eea823bb67 Remove unused field 2021-01-12 13:06:38 +02:00
Vlad Zahorodnii
0dd79ddb4a Revert "fix: Restore the default properties of dialog window so that the max and min buttons can be customized"
This reverts commit bf5155f82b.

Maximize and minimize function hints provided by some applications are
bogus. This in its turn breaks video games that minimize themselves when
they loose input focus.

Ideally, the window manager should not be concerned about Motif hints
provided by NetWM applications as they set the window type.

BUG: 431450
2021-01-12 10:25:41 +00:00
l10n daemon script
e938a569bc SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2021-01-12 06:49:28 +01:00
Andrey Butirsky
8d84fe4b6a fix: KeyboardLayoutTest fails
********* Start testing of KeyboardLayoutTest *********
Config: Using QtTest library 5.15.2, Qt 5.15.2 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 10.2.1 20201016 (Red Hat 10.2.1-6)), fedora 33
PASS   : KeyboardLayoutTest::initTestCase()
PASS   : KeyboardLayoutTest::testReconfigure()
FAIL!  : KeyboardLayoutTest::testChangeLayoutThroughDBus() 'layoutChangedSpy.wait()' returned FALSE. ()
   Loc: [/home/bam/kde/src/kwin/autotests/integration/keyboard_layout_test.cpp(218)]
FAIL!  : KeyboardLayoutTest::testPerLayoutShortcut() 'layoutChangedSpy.wait()' returned FALSE. ()
   Loc: [/home/bam/kde/src/kwin/autotests/integration/keyboard_layout_test.cpp(286)]
PASS   : KeyboardLayoutTest::testDBusServiceExport()
PASS   : KeyboardLayoutTest::testVirtualDesktopPolicy()
PASS   : KeyboardLayoutTest::testWindowPolicy()
FAIL!  : KeyboardLayoutTest::testApplicationPolicy() 'layoutChangedSpy.wait()' returned FALSE. ()
   Loc: [/home/bam/kde/src/kwin/autotests/integration/keyboard_layout_test.cpp(465)]
PASS   : KeyboardLayoutTest::testNumLock()
PASS   : KeyboardLayoutTest::cleanupTestCase()
Totals: 7 passed, 3 failed, 0 skipped, 0 blacklisted, 16447ms
********* Finished testing of KeyboardLayoutTest *********

- currentLayoutChanged signal has changed to layoutChanged
- per cfcf2baae7, the signal is now emitted
  on every layout change
2021-01-11 11:50:34 +00:00
Srevin Saju
68a7daff58
fix: do not use Implicit QML function call
Qt 5.15 introduced new syntax for defining Connections. Fix warnings like this one:
    QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }

follow up of d2f3372749
2021-01-10 13:35:23 +03:00
l10n daemon script
7205c85b98 SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2021-01-08 06:51:29 +01:00
Andrey Butirsky
c42525693b Remove a basic SNI for keyboard layout
Reverts major part of fe561c5c7d

We now have platform-agnostic QML applet with superior functional, so
this one doesn't needed any more.

CCBUG: 390079
2021-01-07 23:58:15 +00:00
Rosca Alex
c81fe56d7c effects: Add an animation curve to maximize and fullscreen
Replace the default linear easing curve with OutCubic.
2021-01-07 23:51:56 +00:00
Vlad Zahorodnii
49faf6790f Fix a typo 2021-01-07 21:28:00 +02:00
Vlad Zahorodnii
6d20d19fec platforms/x11: Always set swap interval to 1
With the new compositing scheduling, we want the screen to be redrawn as
close as possible to the next vblank. Furthermore, compositing is no
longer driven by a timer. This change removes the NoSwapEncourage swap
strategy as it doesn't make sense now, in addition to that it just does
not work on Wayland.
2021-01-07 13:10:59 +00:00
Vlad Zahorodnii
2e3a6b7253 cmake: Minor cleanups in X11 platform CMakeLists.txt 2021-01-07 12:13:14 +02:00
Vlad Zahorodnii
5bf421ef83 cmake: Specify min version for wayland-protocols 2021-01-07 09:50:55 +00:00
Vlad Zahorodnii
5302094f30 cmake: Link against imported Xinput target 2021-01-07 09:50:24 +00:00
Vlad Zahorodnii
b67f743795 cmake: Drop libkwin's unused Xlib dependencies 2021-01-07 09:50:24 +00:00
Vlad Zahorodnii
c5d97ba04a cmake: Clean up CMakeLists.txt for QPA plugin 2021-01-07 09:49:54 +00:00
Vlad Zahorodnii
3dc00de812 platformsupport: Set PUBLIC include directories
This makes using platform support libs easier.
2021-01-07 09:49:26 +00:00
Vlad Zahorodnii
605988d2a1 platformsupport: Rename some headers to make them less ambiguous 2021-01-07 09:49:26 +00:00
Aleix Pol
199860a007 Fix tests build, provide mocks for libinput functions 2021-01-07 02:56:19 +01:00
Aleix Pol
617651d93e tablet_v2: Use libinput device groups to deduce the device's tablet
We can have pads without tools, tools without pads. This changes how we
figure out which tablet belongs to the input device.
2021-01-06 18:47:59 +01:00
Aleix Pol
3b807e482d tablet: do not show a cursor if no cursor surface was provided 2021-01-06 18:47:59 +01:00
Aleix Pol
1a32c64603 tablet_v2: Support remaining controls
Adds support for tablet buttons, rings and strips.
2021-01-06 18:47:59 +01:00
Vlad Zahorodnii
8f9fcd7eb3 Replace window repaints with layer repaints
Windows have two kinds of repaints - window repaints and layer repaints.
The main difference between the two is that the former is specified in
the window-local coordinates while the latter is specified in the global
screen coordinates.

Window repaints are useful in case the position of the window doesn't
matter, for example for repainting damaged regions, etc.

But its biggest issue is that with per screen rendering, it's not
possible to determine what screens exactly have to be repainted. The
final area affected by the window repaint will be known only at
compositing time. If a window gets damaged, we have to schedule a
repaint on ALL outputs. Understandably, this costs a little bit in terms
of performance.

This change replaces the window repaints with the layer repaints. By
doing so, we can avoid scheduling repaints on outputs that don't
intersect with the dirty region and improve performance.
2021-01-06 16:59:30 +00:00
Vlad Zahorodnii
41718a1d8f scene: Schedule a repaint only for outputs affected by layer repaint
If an output is not affected by a layer repaint, then we don't have to
schedule a repaint. This improves the overall performance.
2021-01-06 16:59:30 +00:00
Vlad Zahorodnii
4a879379b3 scene: Schedule a repaint only if the output is affected by workspace repaint
If an output is not affected by a workspace repaint, then we don't have
to schedule a repaint on that output. This improves the overall performance.
2021-01-06 16:59:30 +00:00
Vlad Zahorodnii
ee3515680a platforms/drm: Make frame scheduling robust
If there is a pending frame, the RenderLoop will delay all schedule
repaint requests to the next vblank event. This means that the render
loop needs to be notified when a frame has been presented or failed.

At the moment, the RenderLoop is notified only about successfully
presented frames. If some frame fails, no repaints will be scheduled
on that output.

In order to make frame scheduling robust, the RenderLoop has to be
notified if a frame has failed.
2021-01-06 16:59:30 +00:00
Vlad Zahorodnii
ad5f8c5c59 Introduce RenderJournal
Currently, we estimate the expected render time purely based on the
latency policy.

The problem with doing so is that the real render time might be larger,
this can result in frame drops.

In order to avoid frame drops, we need to take into account previous
render times while estimating the next render time. For now, we just
measure how long it takes to record rendering commands on the CPU.

In the future, we might want consider using OpenGL timer queries for
measuring the real render time, but for now, it's good enough.
2021-01-06 16:59:29 +00:00
Vlad Zahorodnii
b8a70e62d5 Introduce RenderLoop
At the moment, our frame scheduling infrastructure is still heavily
based on Xinerama-style rendering. Specifically, we assume that painting
is driven by a single timer, etc.

This change introduces a new type - RenderLoop. Its main purpose is to
drive compositing on a specific output, or in case of X11, on the
overlay window.

With RenderLoop, compositing is synchronized to vblank events. It
exposes the last and the next estimated presentation timestamp. The
expected presentation timestamp can be used by effects to ensure that
animations are synchronized with the upcoming vblank event.

On Wayland, every outputs has its own render loop. On X11, per screen
rendering is not possible, therefore the platform exposes the render
loop for the overlay window. Ideally, the Scene has to expose the
RenderLoop, but as the first step towards better compositing scheduling
it's good as is for the time being.

The RenderLoop tries to minimize the latency by delaying compositing as
close as possible to the next vblank event. One tricky thing about it is
that if compositing is too close to the next vblank event, animations
may become a little bit choppy. However, increasing the latency reduces
the choppiness.

Given that, there is no any "silver bullet" solution for the choppiness
issue, a new option has been added in the Compositing KCM to specify the
amount of latency. By default, it's "Medium," but if a user is not
satisfied with the upstream default, they can tweak it.
2021-01-06 16:59:29 +00:00
Vlad Zahorodnii
a3ec0c9a57 Delegate repaint scheduling to the Scene
In order to unlock per screen rendering, we need to track repaints for
every screen individually. While we could do this in the Compositor class,
tracking repaints in the Scene seems a better alternative in long run
because we will have to instantiate a Scene for each composited screen
one day.
2021-01-06 16:59:29 +00:00
Vlad Zahorodnii
992e88de50 Perform compositing even if there is nothing to repaint
In rare cases, the Compositor has to perform a compositing if there is
nothing to repaint. For example, if a client has committed a frame
callback to get notified about the next vblank event without damaging
the surface.
2021-01-06 16:59:29 +00:00
Vlad Zahorodnii
fc60e8f1e3 platforms/x11: Present buffers even if nothing has been changed
This is needed to ensure that the compositor always receives swap events
even if nothing has been changed on the screen.
2021-01-06 16:59:29 +00:00
Vlad Zahorodnii
bc9df67c79 platforms/wayland: Present buffers even if nothing has been changed
Present buffers event if nothing has been changed on the screen because
we want to receive the frame callback.
2021-01-06 16:59:29 +00:00
Vlad Zahorodnii
58cb4de1b8 platforms/drm: Present buffers even if nothing has been changed
We want to get notified when the next page flip occurs. The problem is
that kwin will avoid queueing a page flip if nothing has been changed on
the screen. From performance point of view, that is expected behavior,
but for frame scheduling and some wayland clients that create frame
callbacks to get notified about the next vblank, it's not suitable.
2021-01-06 16:59:29 +00:00
Vlad Zahorodnii
ef6fa25d90 platforms/x11: Split out the EGL for X11 backend
EGL for X and EGL for Wayland backends are quite different. The main
motivation behind this change is to prepare the EGL backends for
monitoring vblank events. Things work quite differently depending on
if the EGL backend renders onto a toplevel window or overlay window.
2021-01-06 16:59:29 +00:00
Vlad Zahorodnii
4f3adbb520 Drop SGI_video_sync based method for vsync
With the new compositing timing, we want to start compositing some time
later after a vsync event. This doesn't go along with the video sync
based method to synchronize buffer swaps with vblank.

Since practically all drivers nowadays provide support for the swap
control extensions (GLX_EXT_swap_control, GLX_SGI_swap_control, or
GLX_MESA_swap_control), it's safe to rely on them for the purpose of
synchronizing buffer swaps to vblank.
2021-01-06 16:59:29 +00:00
Vlad Zahorodnii
7a3fa88f02 Drop flag to indicate if swap buffers is blocking
We want the new compositing timing algorithm to be invariant regarding
whether glXSwapBuffers() or eglSwapBuffers() block.
2021-01-06 16:59:29 +00:00
Vlad Zahorodnii
2152598cc4 Drop the swap profiler
In hindsight, we want to swap buffers after finishing a compositing
cycle, therefore there is no need for the swap profiler.
2021-01-06 16:59:29 +00:00
Vlad Zahorodnii
0ceff5fd24 Swap buffers after finishing a compositing cycle
The compositing timing algorithm assumes that glXSwapBuffers() and
eglSwapBuffers() block. While this was true long time ago with NVIDIA
drivers, nowadays, it's not the case. The NVIDIA driver queues
several buffers in advance and if the application runs out of them,
it will block. With Mesa driver, swapping buffer was never blocking.

This change makes the render backends swap buffers right after ending
a compositing cycle. This may potentially block, but it shouldn't be
an issue with modern drivers. In case it gets proven, we can move
glXSwapBuffers() and eglSwapBuffers() in a separate thread.

Note that this change breaks the compositing timing algorithm, but
it's already sort of broken with Mesa drivers.
2021-01-06 16:59:29 +00:00
Vlad Zahorodnii
ed88cbfb65 cmake: Remove FindFontconfig.cmake
It's in extra-cmake-modules now.
2021-01-06 11:21:03 +02:00
Nate Graham
3800181ac2 Revert "cmake: Remove redundant include_directories()"
This reverts commit 9b1ea1c7f7.

This breaks compilation; apparently the include is not implicit and is
thus needed after all.
2021-01-05 19:29:15 -07:00
Jan Blackquill
a92b465f8f Implement xdgshell v3 2021-01-06 01:08:25 +00:00
Vlad Zahorodnii
26b249061e cmake: Remove FindUDev.cmake
It's in extra-cmake-modules now.
2021-01-05 23:08:47 +02:00
Vlad Zahorodnii
9b1ea1c7f7 cmake: Remove redundant include_directories()
libkwin is linked against imported XKB::XKB target. Thus the
include_directories() is redundant.
2021-01-05 22:58:04 +02:00
Vlad Zahorodnii
7e5c16989e Drop hwcomposer backend
Plasma Mobile announced that they plan to drop support for Halium
devices, see the announcement blog post [1] for the reasons that led to
such a decision.

But just to summarize, here are some of the key points from the post:

 * Some of our team members no longer have access to reference LG Nexus
   5X device anymore
 * After KDE Neon switched to using Ubuntu 20.04 we no longer are
   updating the rootfs for halium devices
 * After several important architecture changes in upstream KWin, the
   hwcomposer backend might be broken and we have no way of verifying it

If the community members are interested in reviving the hwcomposer
backend,

  * it pretty much needs rewrite/re-thinking given differences of hwc1
    and hwc2 API for hwcomposer part of it, see also [2]
  * It also needs removal of Android 5 based libhardware API as we don't
    think code can be kept sane with 3 different levels of ifdefs
  * This backend needs better way of fixing difference between
    CAF/non-CAF devices then just recompiling with different headers,
    maybe env vars?
  * This backend does not support various things like transformation/
    rotation etc, and is not exactly feature complete as the DRM backend

[1] https://www.plasma-mobile.org/2020/12/14/plasma-mobile-technical-debt.html
[2] 83f563c339
2021-01-05 17:38:36 +00:00
David Edmundson
ae440bdc25 Bump libkwineffects so version
There was an ABI breaking change when presentation times were added.
It has not been bumped since Plasma 5.20
2021-01-05 14:14:28 +00:00