Commit graph

578 commits

Author SHA1 Message Date
Vlad Zahorodnii
301e57169d backends/drm: Fix surface and buffer damage order in qpainter output layers
The prototype of OutputLayer::endFrame() looks as follows

    virtual bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) = 0;

On the other hand, qpainter output layers use a different order in the
header file and the cpp file.
2023-01-11 11:14:59 +02:00
Vlad Zahorodnii
91bef430bf backends/virtual: Move glFlush() to endFrame()
It makes more sense in endFrame() rather than present().
2023-01-11 08:09:19 +00:00
Vlad Zahorodnii
ff53950a6d backends/virtual: Drop KWIN_WAYLAND_VIRTUAL_SCREENSHOTS
Virtual backend is used primarily by tests, there are plans to use it
for virtual outputs too. But in either case we don't need screenshots.

I also can't imagine how it can be useful as a debugging tool. It's more
convenient to spin a windowed kwin instance.

The main motivation behind this change is to get rid of custom code in
virtual output layers and simplify it a bit more.
2023-01-11 08:09:19 +00:00
Kai Uwe Broulik
af99b4e98c backends/x11: Present surface even with empty damage
All the other backends present their surface regardless.
If the surface isn't presented, the scheduled frame is never
finished, and rendering gets stuck indefinitely.

This is also consistent with x11 standalone backend
which forgoes this check.

Signed-off-by: Victoria Fischer <victoria.fischer@mbition.io>
2023-01-10 15:18:13 +01:00
Han Young
d57495c8df Remove tablet tool when the tablet device is removed
Explicitly remove the tablet tool device when the corresponding sys event interface is removed.
2023-01-05 14:40:46 +00:00
David Edmundson
0167b7d7b0 libinput: Ignore touch events without outputs
A touch device could have no output object assigned due to the screen
being disabled, queued events or malconfiguration.

Using output would crash. Touch up is guarded so that we have matching
pairs.

BUG: 463385
2023-01-05 08:29:06 +00:00
Vlad Zahorodnii
c10b35facb backends/wayland: Pass linux-dmabuf buffers for cursor layer
This lets us avoid reading fbo data back.
2023-01-04 09:19:12 +00:00
Vlad Zahorodnii
9f100e8292 core: Make Output::setCursor() take CursorSource
It decouples the contents of the cursor from QImage.
2023-01-04 09:19:12 +00:00
Vlad Zahorodnii
fb1a6ecd8d backends/drm: Fix buffer centering with active hardware transform
Prior to beb6cca65d, the drm backend used
to specify QRect(0, 0, modeSize.width(), modeSize.height()) CRTC rect,
so we didn't have to care about buffer transforms, but now that we
compute the CRTC rect from the buffer size, we have to take the buffer
transform into account.

It fixes squashed output contents when the output is rotated 90 or 270
degrees and it uses hardware transforms.
2023-01-03 17:36:21 +00:00
Vlad Zahorodnii
3725d67ee1 scene: Introduce cursor item and scene
The cursor scene contains the contents of the cursor. It contains a
CursorItem. The CursorItem either creates a SurfaceItem or an ImageItem
based on the currently attached CursorSource.

The cursor item is rendered by the cursor scene. For now, wherever the
cursor must be rendered, a dummy scene delegate is constructed. It's not
nice but it's a pretty cheap operation. There's a lot of potential for
clean up by moving cursor layer handling from output backends to
compositor. The main reason why there are no persistent scene views is
that it's just easier than tracking when they are actually used, e.g.
after switching between hw and sw cursor.

The software cursor fallback is a bit tricky case. It made to work by
constructing a scratch fbo. The cursor scene is rendered in the scratch
fbo, which is then rendered on the screen. Similar to the case above,
there's space for improvements, but I don't think it has to block the
effort for reusing Items to render the cursor.
2023-01-03 09:33:17 +00:00
Xaver Hugl
d49cb64231 scene: ensure OpenGL texture is updated after direct scanout
While direct scanout happens, the damage of the SurfaceItem is reset, which
can cause the OpenGL texture to not be updated once direct scanout ends,
and leave the texture outdated until the surface is damaged again.
In order to fix that, make sure the texture is always fully updated after
the SurfaceItem has been used in direct scanout.
2023-01-02 12:57:13 +01:00
Parag W
6352173651 Fix compile failure without XINPUT
Declare and reference m_xinputIntegration only if HAVE_X11_XINPUT is defined and enabled.
2022-12-31 11:19:45 +00:00
Xaver Hugl
beb6cca65d backends/drm: support hardware scaling with direct scanout 2022-12-30 18:16:26 +00:00
Xaver Hugl
239207c5ee backends/drm: extend connector lifetime to match their outputs
As disconnected outputs outlive DrmGpu::updateOutputs, the DrmConnector
and DrmPipeline must also be kept valid for that time

BUG: 463334
2022-12-30 14:53:45 +00:00
l10n daemon script
e98282a8a6 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"
2022-12-26 02:05:01 +00:00
Xaver Hugl
1a8c796536 backends/fakeinput: fix time 2022-12-21 21:07:15 +01:00
Xaver Hugl
f6b6d3051b use std::chrono::microseconds for time in input events 2022-12-21 21:07:15 +01:00
Asahi Lina
a508149882 dmabuf: Create buffers without the SCANOUT flag
gbm_bo_create_with_modifiers implies the GBM_BO_USE_SCANOUT flag, which
disables complex (tiled or compressed) formats that cannot be used for
scanout. This reduces performance. We don't need to scan out buffers
created for sceencasting/etc., so this is suboptimal.

By switching to gbm_bo_create_with_modifiers2, we can explicitly pass
the flags and avoid falling back to lower performance formats. Also add
a config check and fall back to the old version, to retain compatibility
with older mesa versions.
2022-12-21 12:34:24 +00:00
Vlad Zahorodnii
6c71bfd800 scene: Rename Scene to WorkspaceScene
Currently, the Scene class is used to represent the contents of the
Workspace so rename it to match its usage.
2022-12-21 11:49:07 +02:00
Vlad Zahorodnii
ccf5623f34 backends/wayland: Flush rendering commands in endFrame()
eglSwapBuffers() used to flush rendering commands but now that we render
to dmabufs, we need somehow to flush the rendering commands to the dmabuf.

It fixes some of the weird rendering issues that I see sometimes.
2022-12-21 09:16:50 +00:00
Vlad Zahorodnii
09e0fa5eb8 backends/wayland: Request wl_shm_buffers with RGB32 format 2022-12-19 16:40:39 +02:00
Vlad Zahorodnii
fc36affdee backends/wayland: Specify correct format for remapped primary layer buffers
We don't need the alpha channel and WaylandQPainterBufferSlot specifies
RGB32 format in its constructor.
2022-12-19 14:50:40 +02:00
Xaver Hugl
b95c93517b backends/drm: fix VRR detection
The pending value always retains the value initially read and is not updated
when the driver changes the property value.

BUG: 463172
FIXED-IN: 5.26.5
2022-12-18 18:29:32 +01:00
Vlad Zahorodnii
8071ade9a8 scene: Make ItemRenderer responsible for pushing fbo
It makes more sense for an output layer to return the render target fbo.
The user of the render target will then take appropriate steps to bind
the fbo. It reduces the amount of boilerplate code in output layers too.
2022-12-18 00:44:51 +00:00
Xaver Hugl
9078d916c2 backends/drm: fix error in finding the best plane 2022-12-17 15:40:43 +01:00
Xaver Hugl
3204d6ac3c port all headers to pragma once 2022-12-16 20:58:17 +00:00
Xaver Hugl
3335716d7b backends/drm: reset cursor texture on compositing reset
When a GPU reset happens, the old texture and vbo become invalid
2022-12-16 20:04:37 +00:00
Vlad Zahorodnii
f7a8635b10 Move scene related bits into src/scene/ directory
We've got quite a few scene related files, move them in a directory to
group related code together.
2022-12-16 19:15:35 +00:00
Vlad Zahorodnii
2d71eb720b backends/wayland: Allocate buffers with GBM_USE_SCANOUT too
It most likely doesn't matter in real life as many compositors don't use
direct scanout for windowed surfaces, but it won't hurt.
2022-12-15 17:53:07 +00:00
Vlad Zahorodnii
a14998b790 backends/wayland: Port away from gbm_bo_create_with_modifiers2()
gbm_bo_create_with_modifiers2() is quite new and there are still distros
that ship 21.2 and older.
2022-12-15 17:53:07 +00:00
Vlad Zahorodnii
d740fca68c backends/x11: Port to SHM
The main motivation behind this change is to let kwin use the PRESENT
extension to present output contents when using QPainter backend, so we
get PresentCompleteNotify events.

Besides that, we could potentially make X11 windowed backend forward
wl_shm_buffers to Xorg.
2022-12-15 08:09:22 +00:00
Vlad Zahorodnii
ae4c3c1a65 backends/x11: Use PRESENT extension to get notified about frame completion
Currently, we use a timer to get notified when a frame is presented, but
there's a better way using PRESENT extension's PresentCompleteNotify events.

Note that we implicitly rely on the fact that EGL implementation uses
the PRESENT extension to present pixmaps, which is usually the case.
QPainter backend needs some adjustments.
2022-12-15 08:09:22 +00:00
Xaver Hugl
2a6e3b7ad8 core/outputconfiguration: use std::weak_ptr for storing the mode
Otherwise an unplugged output can cause use-after-free problems on OutputChangeSet
destruction
2022-12-14 15:33:02 +01:00
Vlad Zahorodnii
77570c0667 backends/{x11,wayland}: Avoid painting null cursor image
GLTexture(QImage()) may construct an invalid texture, which is going to
make GLTexture::bind() and other requests fail.
2022-12-14 09:03:05 +00:00
David Edmundson
c4b134da8d Implement wp-fractional-scale-v1
This allows clients to provide buffers at native resolutions when
fractional scaling is used.

Virtual backend is adjusted to support scales as floats
2022-12-12 12:16:18 +00:00
l10n daemon script
14b48796ee 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"
2022-12-12 01:56:33 +00:00
Xaver Hugl
ffad2dd7ad backends/drm: don't break crtc<->plane connections
The kernel rejects such commits without the crtc being completely turned
off first.

BUG: 462214
2022-12-11 15:01:28 +00:00
l10n daemon script
f2bca662da 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"
2022-12-11 01:54:54 +00:00
Vlad Zahorodnii
555c208b87 backends/x11: Drop X11WindowedBackend::window() 2022-12-10 12:22:58 +00:00
Vlad Zahorodnii
a10193ab4d backends/x11: Drop X11WindowedBackend::windowForScreen() 2022-12-10 12:22:58 +00:00
Vlad Zahorodnii
bb83d66508 backends/x11: Move some method implementations to cpp files 2022-12-10 12:22:58 +00:00
Vlad Zahorodnii
39607a7457 backends/x11: Drop unused X11WindowedBackend::sizeChanged signal 2022-12-10 12:22:58 +00:00
Vlad Zahorodnii
e37fd13bb3 backends/wayland: Remove more unused stuff 2022-12-09 20:01:38 +02:00
Vlad Zahorodnii
182026a4bd backends/wayland: Use linux-dmabuf directly
The main motivation behind this change is to get rid of the dependency
on EGLSurface so the order in which output layers are presented or
updated doesn't matter.

At the moment, if both the cursor and the primary layers are updated
within same frame, the read and draw surfaces in present() will be wrong
for the primary layer.

With fbos, the read and draw surfaces won't matter.
2022-12-09 15:23:27 +02:00
Vlad Zahorodnii
52f6829d6c backends/x11: Introduce cursor layers 2022-12-08 17:37:36 +00:00
Vlad Zahorodnii
3a861640c2 backends/wayland: Simplify initialization of primary layer
Neither wl_egl_window_create() nor eglCreatePlatformWindowSurfaceEXT()
are likely to fail. If they fail, it's okay-ish to let kwin crash.
2022-12-08 17:37:36 +00:00
Vlad Zahorodnii
dbd574ec05 backends/wayland: Introduce cursor layers
It's a necessary step to let kwin repaint the cursor from Compositor.

Unfortunately, it also means that we need to add more (temporary) code
to paint the cursor in backends.
2022-12-08 17:37:36 +00:00
Vlad Zahorodnii
35a99ec9ad Add explicit output cursor manipulation api
Currently, output backends track the cursor behind the scenes. This
results in some amount of code duplication, for example the handling of
hidden cursors, every backend handles in its own unique way, some don't
do it correctly. Another issue is that output backend interact with
other components behind the back. This can be a problem for tasks such
as backing the cursor with an output layer.

This change introduces explicit output cursor manipulation APIs in the
Output class. There's a good chance that it's going to be revised more
in the future as part of streamlining output layer manipulation apis.

With the proposed changes, the workspace would need to call
Output::setCursor() or Output::moveCursor() to set/unset or move the
cursor, respectively.
2022-12-07 12:05:26 +02:00
Vlad Zahorodnii
f191efb39e backends/drm: outputLayer -> primaryLayer
It makes terminology consistent.
2022-12-07 08:59:41 +00:00
Xaver Hugl
3d9ccaf742 backends/drm: fix modifier check
If we force a linear modifier, the modifier list can't match up with the
display, which causes the surface to be recreated every frame.

CCBUG: 462625
2022-12-06 19:55:19 +00:00