Commit graph

50 commits

Author SHA1 Message Date
Vlad Zahorodnii
017906541b Refactor compositing teardown in X11Window and Unmanaged
Currently, X11Window and Unmanaged call finishCompositing(), which tries
to destroy the window item and other associated compositing data.

Usually, it has no any effect on the window item and the effect window
because they are moved to the Deleted. However, it has some effect on
the XDamage handle.

If the X11 window is unmapped, it will destroy the XDamage handle. If
the X11 window is destroyed, it will do nothing. Why does it behave like
that? Because that's how the XDamage spec is written.

This change removes the call to finishCompositing() and refactors how
the XDamage is handled so Window::finishCompositing() is more generic.

If the X11 window is destroyed, SurfaceItemX11::forgetDamage() will be
called and SurfaceItemX11::~SurfaceItemX11() won't attempt to destroy
the damage handle.

If the X11 window is unmapped, SurfaceItemX11::destroyDamage() will be
called and destroyDamage() in SurfaceItemX11::~SurfaceItemX11() will
noop.

If compositing has been restarted, destroyDamage() in
SurfaceItemX11::~SurfaceItemX11() will destroy the damage handle.
2023-03-22 19:15:19 +00:00
Vlad Zahorodnii
2dca6cd003 Extend lifetime of decoration to lifetime of Deleted
When a window is closed, a Deleted object will be constructed and the
Window's properties will be copied over to it. The long term plan is to
stop doing that, i.e. keep the Window alive but just flip a few flags to
indicate that it's been closed.

In order to unify decoration management, this change ensures that it's
okay to have decorations live as long as the Deleted.
2023-03-22 11:25:58 +00:00
Xaver Hugl
e83c593fda adapt to kdecoration changes 2023-03-19 15:26:15 +00:00
Vlad Zahorodnii
c91b90c58a Tidy Window::windowClosed() signal
"window" is redundant, so remove it. Also remove the original window
argument to improve the API consistency.
2023-03-14 07:15:56 +00:00
Vlad Zahorodnii
b4413f4b8b scene: Rework window elevation
The order in which windows are painted is computed dynamically every
frame. On the other hand, with the introduction of items, it's desired
to avoid doing that so repaints can be scheduled as needed. The
unification also opens the possibilities for more rendering related
refactors to make the code nicer and more reusable.
2023-03-13 17:27:15 +00:00
Vlad Zahorodnii
2f56cdc3fe Replace Deleted with Window where possible
With this, Window and Deleted can be interchanged, which makes merging
the two easier.
2023-03-13 14:41:44 +02:00
Vlad Zahorodnii
995d509e45 Allow destroying Deleted immediately
Currently Deleted are destroyed with a delay to avoid dangling pointers
within the middle of painting.

On the other hand, it's reasonable to require not to delete windows when
kwin starts painting the screen.

Over the years, we refactored how deleted windows. They are always
unreferenced after finishing the current frame. So it should be fine to
destroy Deleted immediately now.
2023-03-13 14:41:41 +02:00
Vlad Zahorodnii
0fd4d821ca libkwineffects: Forward declare RenderTarget and RenderViewport in kwineffects.h
kwineffects.h is included in many files and not everyone needs the
RenderTarget and RenderViewport, so forward declare them to reduce the
amount of parsing work for the compiler.
2023-03-10 07:19:33 +00:00
Xaver Hugl
ba85512f21 effects: remove rendertarget scale from WindowPaintData
If an effect needs to override the rendertarget scale, it should use RenderViewport
to do that
2023-03-09 13:22:53 +00:00
Xaver Hugl
125c141b7d effects: remove ScreenPaintData
The only purpose ScreenPaintData had was to pass around a copy of the viewport
projection matrix and the effectscreen, which can be handled in a simpler
way separately.
2023-03-09 13:22:53 +00:00
Xaver Hugl
e4938297e6 scene: fix texture inversion with the drm backend
Specify the render target to buffer transformation and take that into
account in effects and when calculating the projection matrix.
2023-03-09 13:22:53 +00:00
Xaver Hugl
d737ed6687 effects: introduce RenderTarget and RenderViewport
Instead of calling effects->renderTargetRect() and effects->renderTargetScale(),
pass the actually used render target and viewport in all the necessary methods.
This ensures that if an effect renders a screen with a modified scale or
projection matrix, the modified values get used instead of the "global" ones
2023-03-09 13:22:53 +00:00
Vlad Zahorodnii
abaf55b2c4 Remove window arg in Window::{buffer,client,frame}GeometryChanged signals
Remove the window argument to improve the consistency of the signals.
2023-03-06 17:30:27 +00:00
Vlad Zahorodnii
ae72f61a4a scene: Use correct scale when computing world transform
If render target scale is set in WindowPaintData, use it. Otherwise
window screenshots with logical geometry can look wrong.
2023-03-06 10:36:45 +00:00
Vlad Zahorodnii
3b12058135 Move X11 specific logic from DecorationRenderer to X11DecorationRenderer 2023-03-06 07:21:04 +00:00
Xaver Hugl
43a9add5fe windowitem: properly handle sub-subsurfaces
The damage of the whole subsurface tree needs to be considered, not just the
topmost subsurfaces of a window.

BUG: 466747
2023-03-03 15:58:24 +01:00
Vlad Zahorodnii
fff462aed6 scene: Track stack position in WindowItem
If the WindowItem tracks the stack position, it will automagically
schedule repaints when a window is raised or lowered.
2023-02-27 14:57:48 +00:00
Vlad Zahorodnii
d79a4a1daa Make VirtualDesktopManager::currentChanged pass VirtualDesktop
It fixes the remaining usage of int desktop ids in Workspace, ignoring
Workspace::setInitialDesktop().
2023-02-25 21:22:40 +00:00
Vlad Zahorodnii
ad330924e2 Rename Window::desktopChanged()
We have Window::desktops(), so rename the signal to match it.
2023-02-25 13:15:06 +00:00
Vlad Zahorodnii
0e906ec182 scene: Decouple scene bits from Shadow class
Currently the Shadow class is scene specific, which adds coupling
between Window and scene bits.

This change introduces ShadowTextureProvider that contains scene
specific stuff so the Shadow acts like a data source and is not coupled
to concrete scene.
2023-02-22 10:07:41 +00:00
Vlad Zahorodnii
2de5236e3f scene: Ensure there's current opengl context when DecorationItem is repainted for last time
BUG: 466186
2023-02-21 13:22:15 +00:00
David Redondo
264a19247b Mark Window as damaged when decoration or shadow changes
Enforms thumbnails, screencasts and effects of these changes and
that the window needs repainting.
BUG:464417
FIXED-IN:5.27.1
2023-02-20 11:55:22 +01:00
Vlad Zahorodnii
83c38b0907 Drop Window.screen property
Use Window.output instead.
2023-02-11 12:16:46 +02:00
Vlad Zahorodnii
909e10dace effects: Drop PAINT_DISABLED_BY_TAB_GROUP 2023-02-07 18:10:52 +02:00
Vlad Zahorodnii
37c4a4536e scene: Sync Window::readyForPainting() to window item visibility
If a window is made ready for painting with some delay, the item won't
schedule an update. To fix that, sync the item visibility state with
Window::readyForPainting(). When the item visibility changes, a repaint
will be scheduled.

BUG: 464955
2023-02-03 14:09:27 +00:00
Xaver Hugl
3c059d3a24 scene/surfaceitem_x11: improve size mismatch warning 2023-02-02 09:14:50 +00:00
David Edmundson
99f433641a Add missing includes for KF6
This fixes includes that were implicitly brought in with KF5
2023-01-28 09:16:14 +00:00
Vlad Zahorodnii
7c58f169e0 Store shadow elements as QImages
At quick glance, it doesn't seem like there's any benefit from storing
the shadow elements as pixmaps. It saves us some QImage <-> QPixmap
conversions too.
2023-01-18 07:27:40 +00:00
Arjen Hiemstra
622114dfb5 Move texture coordinate post processing into a method of RenderGeometry
This allows us to reuse the code in other places.
2023-01-16 09:51:28 +00:00
Arjen Hiemstra
db7283ee5c Add default global vertex attribute layouts for GLVertex{2,3}D
This avoid some duplication when using GLVertex2D for geometry.
2023-01-16 09:51:28 +00:00
Vlad Zahorodnii
0bd4851326 effects: Fix projection matrix logic in OffscreenEffect
WindowPaintData contains two projection matrices -
screenProjectionMatrix and projectionMatrix. I'm not sure why we have
two.

screenProjectionMatrix is initialized by the scene. While
projectionMatrix is usually updated by the effects. The two are not in
sync.

On the other hand, OffscreenEffect takes into account only
screenProjectionMatrix. It means that if a window is transformed by two
offscreen effects, the final result is going to be broken because
an OffscreenEffect must use the projection matrix specified by another
OffscreenEffect, which it doesn't.

This change cleans up projection matrix properties in WindowPaintData,
so there's only one projection matrix property. With that, offscreen
effects can be properly nested.

BUG: 462876
2023-01-10 12:05:28 +00:00
Xaver Hugl
3c8d2d6f18 window: use std::unique_ptr to manage the shadow 2023-01-07 21:52:10 +01:00
Vlad Zahorodnii
b549776b68 scene: Avoid creating SurfaceItem for Xwayland's cursor surfaces
SurfaceInterface::scaleOverride() doesn't scale the bufferScale, so if the
scale override is 2, but the buffer scale specified by the client is 1,
bufferScale() will return 1.

Xwayland cursor surface implicitly relied on this behavior.

Porting cursor to SurfaceItem changed that. Now cursor surfaces honor
the scale override, which makes Xwayland cursors too small.

In order to properly fix, plasma has to scale Xcursor.size in xrdb. The
problem is that plasma also sets XCURSOR_THEME and XCURSOR_SIZE envvars
that take precedence. Plasma must stop setting those envvars, but it's
doable only with Qt 6.5, which got MouseCursorTheme and MouseCursorSize
hints in QPlatformTheme.
2023-01-04 11:10:32 +00:00
Vlad Zahorodnii
88563cbc8e scene: Remove addDamage() in SurfaceItem::discardPixmap()
Scene::Window::discardPixmap() used not to add damage. No idea how it
got in SurfaceItem::discardPixmap(). Perhaps a mishap when introducing
window items.

From logical point of view, adding damage when discard a pixmap is not
necessary too because a new pixmap is going to be created.
2023-01-03 11:55:36 +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
Vlad Zahorodnii
dda77f5942 scene: Introduce ImageItem
The ImageItem provides a way to integrate an image in the scene graph.
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
Vlad Zahorodnii
f37acaff54 scene: Split base Scene class from WorkspaceScene class
The main motivation behind this change is to share rendering code
between windows and the cursor, specifically the Item class which
requires a Scene.

Note that Scene subclasses are responsible for issuing
ItemRenderer::renderItem() calls. The main reason for that is the
current architecture of the effects system, specifically we need to call
some effects hooks before and after painting a window.
2022-12-21 12:20:23 +02: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
Xaver Hugl
f90ec209d4 core/renderlayerdelegate: remove QObject parent
Managing an object with both std::unique_ptr and a QObject parent at the
same time is unnecessary and potentially dangerous
2022-12-20 23:38:46 +01:00
Vlad Zahorodnii
977016b743 scene: Change clear color in ItemRendererQPainter
It makes the behavior of the ItemRendererQPainter compatible with the
behavior of the ItemRendererOpenGL. It is needed to ensure that the
cursor layer is properly cleared too.
2022-12-19 17:02:20 +02:00
Vlad Zahorodnii
30d856b9cb scene: Pass Scene to Item constructor
This is needed to establish explicit connection between an item and the
scene it belongs to. For now, the scene must be known at the item
construction time. Perhaps it can be improved in the future by items
inheriting their scene from the parent item, but the scene would need to
be refactored more so there's a root item or something like that.
2022-12-19 11:35:26 +00:00
Vlad Zahorodnii
2819a3cb4f scene: Decouple Item from Workspace and Output
Currently, Item schedules repaints taking output geometry into account,
but that's going to work poorly for cases other than workspace scene.

Moving from Output to SceneDelegate also allows us to unify some X11 and
Wayland specific code paths in Item.

Furthermore, it ensures that effects->paintScreen() won't remove pending
repaints for the output.
2022-12-18 20:25:40 +00: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
Vlad Zahorodnii
f2857d556f scene: Drop SceneOpenGL::openGLPlatformInterfaceExtensions()
It doesn't belong in the Scene, whose sole responsibility is to draw
windows.
2022-12-18 00:05:48 +02:00
Vlad Zahorodnii
23bef7601e core: Move surface texture factory functions to RenderBackend
The goal is to create surface items for things that are not in the
workspace scene. RenderBackend perhaps is not a great place for these
factory functions. On the other hand, this change merely rewires code
from Scene to RenderBackend. I think that in distant future we could
make surface items pick surface texture type on their own, for what it's
worth that's what we would do in QtQuick.
2022-12-17 21:35:40 +00:00
Vlad Zahorodnii
1ca263d588 scene: Move OffscreenQuickView painting to EffectsHandlerImpl
There's no any way to integrate OffscreenQuickView into the scene graph.
So make the EffectsHandlerImpl responsible for drawing quick views until
the corresponding item is introduced (requires a lot and a lot of
refactoring in effects) or the design of kwin changes so much that we
don't need this special code path.
2022-12-17 17:14:43 +00:00
Vlad Zahorodnii
4ded856fbf scene: Introduce ItemRenderer
ItemRenderer class provides Item rendering facilities. The main
motivation behind this change is to extract code that can be used to
render both normal windows as well as the cursor.
2022-12-17 17:14:43 +00:00
Xaver Hugl
3204d6ac3c port all headers to pragma once 2022-12-16 20:58:17 +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