Commit graph

72 commits

Author SHA1 Message Date
Vlad Zahorodnii
006ab40e44 wayland: Make LinuxDmaBufV1ClientBuffer private
dmabuf related code can rely on DmaBufAttributes instead, so let's make
LinuxDmaBufV1ClientBuffer private to make graphics buffer handling
generic.
2023-05-23 09:39:19 +00:00
Xaver Hugl
afc5567651 Implement initial support for color management and HDR
This is done by converting from the sRGB + gamma 2.2 input from clients
to linear with the color space of the output (BT.709 or BT2020 atm) in
a shadow buffer, and then convert from the shadow buffer to the transfer
function the output needs (sRGB or PQ).
2023-05-15 17:01:03 +00:00
Vlad Zahorodnii
380aaab2cc Fix deleting GraphicsBuffer twice
When GraphicsBuffer::dropped() is emitted, the buffer can be
unreferenced. If that's the case, the GraphicsBuffer will be deleted
twice: first in GraphicsBuffer::unref(), the second time in drop().

In order to address the issue, this change gets rid of the
GraphicsBuffer::dropped() signal, so it's always guaranteed that the
buffer stays alive until the reference count is checked.

The GraphicsBuffer::dropped() signal is used to remove the mapping
between wl_resource and ShmClientBuffer when the corresponding
wl_shm_buffer object is destroyed. On the other hand, we could perform
such cleanup when calling drop() too. This code can be further improved
by reimplementing wl-shm, which we need to do at some point in the
future.
2023-05-09 16:29:00 +00:00
Vlad Zahorodnii
e6b5cf283e core: Batch pointer input device events
This change introduces InputDevice::pointerFrame(). The main motivation
behind it is to allow batching multiple pointer events within a single
event frame.

BUG: 454428
2023-05-05 10:27:08 +00:00
Vlad Zahorodnii
ce2b4c0bee {core,backends/wayland}: Refactor shm buffer allocator 2023-05-02 13:14:30 +00:00
Vlad Zahorodnii
f410819fff Remove "Default implementation ..." comments
These methods are not virtual anymore.
2023-04-28 14:51:01 +00:00
Alexander Volkov
64ce247104 Use non-rotated physical size of an output when required
1. In wl_output and kde_output_device_v2 protocols.
This should fix dpi calculation in
KScreen::Generator::bestScaleForOutput() when panel_orientation
is set to rotate a screen by 90 or 270 degrees.

2. When comparing with physical size of libinput device.

3. In calculations with mode sizes which are not rotated.

This change makes Output::physicalSize() return the raw
physical size, which is used in most of cases. It should
be rotated manually if needed.
2023-04-28 13:41:00 +00:00
Vlad Zahorodnii
e9feaefa4b Handling failing to export GEM handle to prime fd
If gbm_bo_get_fd_for_plane() or gbm_bo_get_fd() fails, ensure that the
gbm buffer allocator properly handles it and doesn't return a
GraphicsBuffer object.
2023-04-24 11:08:04 +03:00
Vlad Zahorodnii
67b898b803 Move DmaBufAttributes struct to GraphicsBuffer header
The main motivation is to avoid scattering graphics buffer things around
kwin.

DmaBufParams struct has been moved to the OutputBackend, but with the
introduction of buffer allocators, we need to port screencasting code to
the new abstractions some time in the future.
2023-04-21 06:38:58 +00:00
Vlad Zahorodnii
232bcc5d82 wayland: Drop support for linux dmabuf buffer flags
A client can specify the following flags when creating a linux dmabuf
client buffer:

- y_invert
- interlaced
- bottom_first

Only the y_invert flag is supported by kwin. The interlaced and the
bottom_first flags are ignored. On the other hand, most clients don't
specify the dmabuf flags. For example, neither EGL nor Vulkan WSIs
use the y_invert flag.

The y_invert flag is undesired because it also blocks optimizations such
as direct scanout because DRM assumes that the origin is in the top left
corner.

Therefore, this change drops the support for linux dmabuf flags. From
the protocol perspective, this is fine. It can be viewed as buffer
import failing with the specified flags.
2023-04-19 12:29:33 +03:00
Vlad Zahorodnii
99af2aa726 core: Move DmaBufAttributes getter to GraphicsBuffer
LinuxDmaBufV1ClientBuffer contains properties (formats, and flags) that
are not available in the base GraphicsBuffer type and there's no reason
to move it there.

In order to get rid of those properties (and eventually hide the
LinuxDmaBufV1ClientBuffer type from the public api), this change adds a
DmaBufAttributes getter in the GraphicsBuffer.
2023-04-19 07:29:38 +00:00
Vlad Zahorodnii
103d8d8abe {core,backends/wayland}: Refactor gbm buffer allocator 2023-04-15 10:21:42 +00:00
Vlad Zahorodnii
3ac4f8a7dc core: Introduce base GraphicsBuffer
Currently, there exists the separation between the buffers provided by
the clients and the buffers created by the compositor.

In hindsight, this separation is not great because it leads to
specialized code paths in the output backend. For example, we have a
separate code path for direct scanout and presenting composited frame.
But you could view the latter case as "direct scanout of a compositor
buffer".

The main idea behind the buffer type is to provide a base buffer type
for client buffers and composited frame buffers (not drm fbs) that we
could pass around, import as textures, etc.
2023-04-15 10:21:42 +00:00
Xaver Hugl
ab7286fad1 platformsupport/scenes: move egl context into a separate class 2023-04-12 15:01:51 +02:00
Xaver Hugl
48fb07b367 platformsupport/scenes: move egldisplay code into a helper class 2023-04-12 14:57:49 +02:00
Vlad Zahorodnii
466868f5d4 wayland: Refactor linux-dmabuf buffer management
At the moment, the render backend provides its specific implementation
of LinuxDmaBufV1ClientBuffer. This has some of its limitations. For
example, due to the strong coupling, compositing restarts must be
handled carefully. It's hard to have a generic code path to import
dmabufs, which would be nice to have in order to unify graphics buffer
allocation across various backends; currently, it's all scattered.

To make the code simpler, this change drops the commented out YUV import
code path for now. Given that Mesa implicitly handles it, the need for
it is no longer so urgent.
2023-04-11 07:59:28 +00:00
Xaver Hugl
c51824b535 Add OutputManager for taking care of output settings in KWin
As a first step to move away from having an external service remember output settings
for KWin, this commit introduces an output manager that can load configuration files
and generate new output configurations.
2023-03-28 16:19:09 +02:00
Xaver Hugl
6b8e08dfa9 core/outputconfig: store output properties with std::optional 2023-03-28 16:19:09 +02:00
Vlad Zahorodnii
e88a4e34a3 Remove some include_directories()
It seems we've settled on dir/dir/header.h includes, so let's use them
consistently.
2023-03-23 14:37:48 +02:00
Xaver Hugl
2417a0381f backends/drm: port from gbm_surface to a custom swapchain using gbm buffers 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
Xaver Hugl
f2417a8523 backends/drm: support CTM for simple color transformations
In order to work around hardware and drivers that aren't capable of applying
a LUT, calculate a per-channel factor for brightness and color temperature
modification. While this ignores color calibration, this makes night color
work until a proper shader based color pipeline is implemented.

BUG: 455720
2023-03-07 17:03:40 +01:00
Aleix Pol
150b098ba7 screencasting: Minimise pixel format conversions while streaming
Instead of best-guessing, at BGR (which in retrospect was a bad guess),
offer whatever resembles most the internal representation. This way the
frame gets to be least treated as it goes into the client.
2023-02-23 14:11:41 +00:00
Xaver Hugl
4cd25cf571 cursor: make position, hotspot and size floating point
This allows all pixel positions to be used on high dpi screens,
and corrects damage tracking with Xwayland cursors

CCBUG: 466094
2023-02-20 21:01:39 +00:00
Vlad Zahorodnii
e83af181f7 Remove some code duplication in cursor layer code
Move some generic properties to the OutputLayer class and add a cursor
layer getter in the RenderBackend class. That allows us to get rid of
some code duplication. And we could use this work to move more cursor layer
code from backends to Compositor.
2023-01-20 08:22:18 +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
Xaver Hugl
f6b6d3051b use std::chrono::microseconds for time in input events 2022-12-21 21:07:15 +01: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
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
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
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
Xaver Hugl
20b94c9025 wayland/outputmanagement: reject configurations if outputs change
The meaning of the request is questionable after an output gets added
or removed, and it's an easy way to prevent dangling pointers.

BUG: 460953
2022-12-10 00:39:19 +01: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
Xaver Hugl
bd26f57e18 backends/drm: allow using both adaptive sync and tearing at the same time
The driver will translate that to adaptive sync in the vrr range, and tearing
above it
2022-12-06 11:49:59 +00:00
Xaver Hugl
909378e6fd kcmkwin/kwincompositing: add option to toggle tearing on Wayland 2022-12-05 12:52:18 +00:00
Xaver Hugl
b85550ab41 backends/drm: use tearing presentation where possible and appropriate 2022-12-05 12:52:18 +00:00
Aleix Pol
df77fcd9e0 x11window: Calculate the native floor from the begining of the output
If this function is useful to make sure we are properly aligned with the
output's pixels, we should start with the output's 0, otherwise we'll be
carrying over the rounding errors increasingly as our workspace grows.

BUG: 459373
2022-11-21 14:16:33 +00:00
Xaver Hugl
cdeacdbdad backends/libinput: update screens on Workspace::outputsChanged
Using OutputBackend::outputsQueried can cause problems because it's emitted
before output settings like enablement get adjusted to the new output configuration.
It also doesn't react to output changes initiated by KScreen and is in the
way of plans to use multiple output backends at the same time.

BUG: 461901
2022-11-21 14:25:24 +01:00
Vlad Zahorodnii
8655cc76e8 core: Drop initial window state properties in OutputBackend
Relevant output backends take these properties using their (xyz)Options
struct now.
2022-11-17 14:20:44 +00:00
Vlad Zahorodnii
be3146873f core: Drop OutputBackend::isReady()
OutputBackend has a concept of readiness. When the host compositor goes
down, the OutputBackend will be marked as not ready, and when it
reappears, the output backend will be marked ready again.

On the other hand, host compositor going down is a niche case, it's not
something that often happens and it's hard to justify adding more moving
parts to the startup code. It's easier to call initialize() and check
whether it fails rather than call initialize() and then monitor isReady.

Therefore, this change drops OutputBackend::isReady() to make startup
simpler.
2022-11-16 14:47:25 +00:00
Xaver Hugl
65e886cde2 backends/drm: support the panel orientation property 2022-11-15 13:25:19 +00:00
Vlad Zahorodnii
b830d408af core: Rename Platform to OutputBackend 2022-11-10 10:10:28 +02:00
Vlad Zahorodnii
72883df2aa core: Move workspace bits from Platform to Application
Platform will become OutputBackend so some workspace bits, e.g. the
effects handler, have to move a layer above.
2022-11-10 10:10:28 +02:00
Vlad Zahorodnii
f1369a40f9 core: Drop Platform::supportsNativeFence()
Use Scene::supportsNativeFence() directly.
2022-11-10 10:10:28 +02:00
Vlad Zahorodnii
5762b9a4cc core: Drop Platform::supportsGammaControl()
If the platform doesn't support setting gamma ramps, let the request
fail. In long term, we need a software fallback too so this property is
not that relevant.
2022-11-05 09:03:39 +00:00
Vlad Zahorodnii
084f92bd7a backends/x11: Make OverlayWindow factory function private to the backend
The concept of an overlay window is specific to X11 and it's not present
on other platforms.
2022-11-05 08:44:58 +00:00
Vlad Zahorodnii
78ed1e2add Move OpenGL safe point handling to Compositor/CompositorX11
It's not something that output backends care about, so move it to
Compositor.
2022-11-03 12:09:16 +00:00
Vlad Zahorodnii
364c2f3a14 Drop Platform::requiresCompositing()
It doesn't seem to be used elsewhere other than
Options::isUseCompositing(), which is quite X11-specific.
2022-11-03 12:09:16 +00:00
Vlad Zahorodnii
c76563b174 core: Drop Platform::warpPointer()
It's odd to manipulate host cursor position and it's not highly
important, for example we haven't had a need to warp the cursor on
wayland.

The main motivation behind this change is to slim down the Platform to
make it more output oriented.
2022-11-03 10:35:30 +00:00