Commit graph

10549 commits

Author SHA1 Message Date
Marius Vlad
0201d5762e renderer-gl: Check for valid CVD uniform
We seem to initialize the uniform with -1 so check against as the test
branch will actually try to use the supplied matrix (although it is
zero in this case).

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-28 07:48:28 +00:00
Marius Vlad
7a51bc85f4 backend-drm: Revert "drm-backend: Reuse prior state where possible"
This seems to cause some misuse of buffer handling especially for cases
where the views are being promoted into HW planes. Vulkan clients seem
to crash at start-up while EGL clients seem to avoid being promoted to a
HW plane after changing window state (fullscreen to non-fullscreen).
Revert the now the change to better understand what is going on.

This reverts commit 119ce40714.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-28 07:33:54 +00:00
Marius Vlad
3ff64f5e3d man: Clarify where we can load the Lua script
Some minor clarifications that the Lua script can searched in the
current working directory or passed in as an absoluate path.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-27 13:21:38 -06:00
Pekka Paalanen
d26f1789fd clients/window: fix single_pixel_buffer_manager leak
Caught by ASan on weston-desktop-shell.

Fixes: 6cc8f48cd8
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-01-27 13:46:20 +02:00
Marius Vlad
f72dfdae4c build: bump to version 14.0.94 for the RC2 release
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-26 10:59:59 +02:00
Leandro Ribeiro
3de7c52942 libweston: collapse CVD correction into single matrix multiplication
CVD correction is composed by a linear transformation, so we should be
able to collapse it into a single matrix multiplication:

Y = M * X

Where Y is the result, X is the original color, and M is the CVD
correction matrix.

As we need to perform CVD correction for every pixel, this can be
beneficial for limited hardware.

In this patch we do that, updating the libweston core code and also the
GL-renderer and its fragment shader.

Suggested-by: Christopher Healy <healych@amazon.com>
Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
2026-01-22 18:24:29 +00:00
Leandro Ribeiro
10991a4c4a gl-renderer: do not compute straight alpha values for CVD correction
CVD correction have the following format. These are linear
transformations in which M is a 3x3 matrix and X is a RGB vector.

F(X) = M * X

It is well known that CVD simulation/correction is done using straight
alpha values. So when we have alpha premultiplied values, we compute
straight alpha values first, apply the correction and premultiply by
alpha again. But this is not necessary, as we can see mathematically:

a * F(X) = a * (M * X) = M * (a * X) = F(a * X)

So do not convert premultiplied alpha values to straight alpha values
before applying CVD correction. This saves a few operations per pixel.

Note that the same does not apply to color inversion:

F(X) = 1 - X
a * F(X) = a - a * X
F(a * X) = 1 - a * X
=>
a * F(X) != F(a * X)

Suggested-by: Christopher Healy <healych@amazon.com>
Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
2026-01-22 18:24:29 +00:00
Marius Vlad
03686c9f89 libweston: Adjust order for tracking dirty paint nodes
Commit 008884f28 ("compositor: Move dirty buffer handling to paint node
early update") makes the dirty paint node bit being
cleared in the update early function which makes t too late to check in
the paint node update late where we used to accumulate painted frames.

Just move it before the early update to make we still have a way to
print painted frames counter.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-22 18:14:36 +00:00
Pekka Paalanen
88863cf7f1 tests: fix RUNNER_TEST UBSan error
GCC 14.2 UBSan complained:

../../git/weston/tests/ivi-layout-test-plugin.c:73:15: runtime error:
load of address 0x7fbfd8d70ec0 with insufficient space for an object of
type 'const struct runner_test'

By printing the addresses, I concluded that the mentioned address is the
second element in the plugin_test_section. I guess UBSan believes that
only the first element exists. Why not, what's to tell what data
actually is inside the section or where it actually ends.

Strangely though, we use the exact same section trick in
weston-test-runner.c to iterate through all tests, and that one is
apparently fine. One difference is that weston-test-runner is built as a
static_library() while ivi-layout-test-plugin.c is a shared_library().

Anyway, ivi-layout-test-plugin is unlikely to see any development, so
let's just fix the problem in an ugly way, and get rid of the section
trickery. If someone were to add a new RUNNER_TEST() instance and forget
to add the magic into the index, the compiler would greet them with a
defined-but-not-used error.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-01-22 16:51:31 +02:00
Pekka Paalanen
30e7575096 tests: fix "%s" argument is null warnings
../../git/weston/tests/iterate-debug-scopes-test.c: In function ‘wrapiterate_default_debug_scopes’:
../../git/weston/tests/iterate-debug-scopes-test.c:70:53: error: ‘%s’ directive argument is null [-Werror=format-overflow=]
   70 |                 weston_log("\tscope name: %s, desc: %s\n", scope_name, desc_name);
      |                                                     ^~
../../git/weston/tests/iterate-debug-scopes-test.c:70:43: error: ‘%s’ directive argument is null [-Werror=format-overflow=]
   70 |                 weston_log("\tscope name: %s, desc: %s\n", scope_name, desc_name);
      |                                           ^~
../../git/weston/tests/iterate-debug-scopes-test.c:70:53: error: ‘%s’ directive argument is null [-Werror=format-overflow=]
   70 |                 weston_log("\tscope name: %s, desc: %s\n", scope_name, desc_name);

test_assert_*() do not abort, so we cannot rely on them sanitizing
program state.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-01-22 15:56:56 +02:00
Pekka Paalanen
6a96841fee backend-drm: fix maybe uninitialized num_planes
In function ‘drm_fb_maybe_import’,
    inlined from ‘drm_fb_addfb’ at ../../git/weston/libweston/backend-drm/fb.c:236:8:
../../git/weston/libweston/backend-drm/fb.c:210:31: error: ‘num_planes’ may be used uninitialized [-Werror=maybe-uninitialized]
  210 |         for (plane = 0; plane < num_planes; plane++) {

Direct-display is mutually exclusive with having GBM BO, because the
point of direct-display is to not import to GBM. We can use this to make
the logic more provable to the compiler, and be more obvious about the
expectation to the human reader.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-01-22 15:56:56 +02:00
Michael Olbrich
063a9a0240 surface: correctly apply scale/tranform changes when committed without buffer
{width,height}_from_buffer include the transformations from set_buffer_transform
and set_buffer_scale.
Currently {width,height}_from_buffer are only updated when a commit contains a
new buffer but not for commits with only transformation changes.

If a transform/scale change is commited without new buffer, the old values
remain, which results in incorrect rendering or the client is disconnected
because weston_surface_is_pending_viewport_source_valid() fails.

Make sure to update {width,height}_from_buffer for transformation changes only
to avoid this.

Add a test to verify that the transformations are handled correctly. It is
identical to previous test, except that is spits the buffer attachment and
transformation changes into two commits. So it can reuse the existing images for
validation.

Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
2026-01-22 10:12:33 +00:00
liang zhou
61e1b9c14a libweston: fix unexpect log when touch device has no output
In handle_touch_up, check whether the associated output is NULL before calling
notify_touch. This prevents unnecessary logging of "Unmatched touch up event
on seat" when a touch device is not bound to any output, as the absence of an
output is already handled gracefully in handle_touch_with_coords.

Signed-off-by: liang zhou <liang.zhou@gehealthcare.com>
2026-01-20 09:54:31 +08:00
Marius Vlad
07d9eb1f7e build: bump to version 14.0.93 for the RC1 release
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-19 09:39:03 +02:00
Daniel Stone
3f92ace59b backend-drm: Ignore invalid pixel format for wb connector
Signed-off-by: Daniel Stone <daniel.stone@collabora.com>
2026-01-15 16:34:15 +02:00
Derek Foreman
104779e744 manual: Explain how to have a black background in weston.ini
We used to state that backgrounds are 0xAARRGGBB format, then we stopped
because alpha on a background is bad.

However, to get a black background we need a value other than 0, or the
shell just treats it as "no background color" and can use a default image
instead.

Explain how to describe a black background.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-01-12 18:09:46 +00:00
Derek Foreman
2303b5c5f4 drm: Don't reuse state if state_invalid is set
We'll be rebuilding state assuming it's all broken, so we should probably
avoid the reuse path as a precaution.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-01-12 11:07:39 -06:00
Philipp Zabel
50a5132930 backend-vnc: Add missing aml/neatvnc cleanup in error path
Call nvnc_close() and aml_unref() when appropriate in the
error path of vnc_backend_create().

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
2026-01-12 16:53:12 +00:00
Marius Vlad
73f7bfc0af backend-drm: Don't schedule an output repaint on disabled outputs
Fixes: fdb4344 ("backend-drm: Explicitly set an invalid state")

Reported-by: Derek Foreman <derek.foreman@collabora.com>
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-12 10:28:52 -06:00
Marius Vlad
d2a959c1e3 build: bump to version 14.0.92 for the beta release
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-12 15:37:02 +02:00
Leandro Ribeiro
82a832ef38 tests: improvements to color effects tests
This fixes a huge bug: we were ignoring the return value from
verify_screen_content(), which meant that tests were always passing.

Also, this adds tests for single-pixel solid color buffers, which are
useful to verify that color effects are actually applied in such cases.
Renderers (as the GL-renderer) may simply use glClear() instead of going
through the full rendering pipeline when drawing solid colors, and we
need to ensure that color effects are applied in those cases as well.

Besides that, some refactoring was done to improve the code.

Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
2026-01-12 12:55:49 +00:00
Leandro Ribeiro
d3fee82090 gl-renderer: do not skip output color effect for solid color buffers
When repainting a paint node, if the buffer is a solid color buffer we
may skip the rendering pipeline and directly call glClear() with the
solid color, for optimization purposes.

Currently there's a bug where if the output has an output color effect
set, it is skipped when we have a solid color buffer (as we don't go
through the rendering pipeline, where the effects are implemented).

When we have color-management and the paint node contains a color xform,
we've opted for skipping this optimization and going through the
rendering pipeline for now. However, output color effects are simple,
so let's add the logic to apply them on CPU when we have a solid color
buffer.

Reported-by: Christopher Healy <healych@amazon.com>
Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
2026-01-12 12:55:49 +00:00
Marius Vlad
99f3a92f4a lua-shell: Use local pd to store background curtains
This avoids hitting the assert that we don't have any paint nodes in
available when the repaint loop starts.

As we only have just a single curtain, in multi-head/outputs case a new
output creation will destroy the previous curtain and we'll end up
hitting the empty paint nodes assert.

Note that this doesn't add any functionality it just makes sure we're actually
capable of running the lua-shell rather than dying.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-09 22:12:47 +02:00
Derek Foreman
2543ec3f54 compositor: Add paint_node_changes for paint node removal
When moving the views between two outputs, the view's paint node is
removed from an output's z order list, but no paint_node_changes are set.

The drm-backend uses paint_node_changes to determine if it can reuse state,
so could leave a stale image behind on a plane until something else
triggered new state generation.

Make z_order_link removal dirty the paint node changes to prevent stale
state reuse.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-01-07 10:44:27 -06:00
Marius Vlad
8ba7fb8195 simple-timing: Use don't use the frame callback mechanism
commit-timing uses presentation feedback to drive its repaint loop, no
need to keep the frame callback.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-06 09:10:53 -06:00
Marius Vlad
2f5ad2f046 simple-timing: Use the same name as client name for app_id/title
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-06 09:10:53 -06:00
Marius Vlad
be98923898 compositor: Skip logging scenegraph at compositor start-up
Users might start the compositor with the scene-graph debug scope which
requires having the clock set-up as implicitly one of the backends needs to be
loaded.

Just avoid doing that until we have one the backends loaded to prevent
a start-up crash.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-06 08:45:13 -06:00
Marius Vlad
4b8e10cf66 tests: Return RESULT_OK for color-representation-drm-test
This seems to cause a lot of stir in CI as it was failing for half of the
time.

Mark the test as succeeding for now and include the Mesa assert crash to
follow-up. We use that instead of SKIP to we have
WESTON_TEST_SKIP_IS_FAILURE.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-01-06 13:27:17 +02:00
Robert Mader
609dc4baa3 xdg-shell: Gate all configure events behind first commit
The protocol requires clients to perform an initial commit before they
receive configure events:
> After creating a role-specific object and setting it up (e.g. by sending
> the title, app ID, size constraints, parent, etc), the client must
> perform an initial commit without any buffer attached. The compositor
> will reply with initial wl_surface state such as
> wl_surface.preferred_buffer_scale followed by an xdg_surface.configure
> event. The client must acknowledge it and is then allowed to attach a
> buffer to map the surface.

Previous to this patch various calls such as set_fullscreen() or
set_maximized() would schedule configure events, resulting in clients
being able skip the initial commit. This again made it possible to write
clients that only work on Weston, in violation of the protocol.

For xdg-popups we already tracked the initial commit status. Move it
to xdg-surface, guard schedule_configure() on it and ensure to run the
later on the initial commit.

Incorporate tests that checks if we get configure events when calling
set_fullscreen/set_maximized and tests that uses the main xdg_surface as
a parent to a sub-surface (which initially triggered this issue).

Signed-off-by: Robert Mader <robert.mader@collabora.com>
2026-01-06 12:21:29 +02:00
Derek Foreman
1f642c8c10 compositor: Fix failure to start with multiple outputs
The change in 65227cb7d4 is actually destructive, as it causes multiple
drm-backend heads to no longer be repainted at the exact same time at
startup.

This frequently leads to a failure to flip when only one head is properly
set up and others have stale state.

Force stampless finish_frame to skip any time adjustments to restore proper
behaviour.

Fixes: 65227cb7 (compositor: Round repaint times down to possible presentation times)
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-01-06 08:39:21 +00:00
Derek Foreman
ba008fea76 compositor: Fix paint node debug print for new views
Make sure we check if a paint node has been assigned to a view before
trying to dump its contents.

The scene graph dump from the repaint loop should always be ok, but if
we're using weston-debug we could race with the repaint for a new view
and try to print the scene graph before the node is created.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-01-05 15:58:28 -06:00
Marius Vlad
b57169fc2b build: bump to version 14.0.91 for the alpha release
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2025-12-22 10:37:54 +02:00
Robert Mader
6389c1ce55 tests: color-representation: Skip dmabuf test if not supported
For systems where udmabuf is not available.

Fixes: 75d75ac6c (tests: Add color-representation tests for DRM and GL)
Signed-off-by: Robert Mader <robert.mader@collabora.com>
2025-12-19 19:00:25 +01:00
Robert Mader
9364282ebd gitlab-ci: Bump mesa from 25.3.0 to 25.3.2
The new color-representation-drm test occasionally crashes Mesa. Update
to the latest point release in case it helps.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
2025-12-19 18:52:26 +01:00
Robert Mader
af59ce4058 tests: Add color-representation protocol test
Ensuring that important errors are raised correctly.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
2025-12-19 17:08:39 +01:00
Robert Mader
75d75ac6cd tests: Add color-representation tests for DRM and GL
Test the various combinations of:
1. Renderer backends - currently GL only.
2. Renderer modes - plane-offloading/vkms, shaders in Mesa, internal
   shaders.
3. Buffer-types - SHM and DMABuf.
4. Coefficient/range combinations.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
2025-12-19 17:08:39 +01:00
Robert Mader
f709b8a798 tests: client-helper: Add color-representation protocol support
In order to test coefficients and ranges.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
2025-12-19 17:08:39 +01:00
Robert Mader
adaffa980e backend-drm: Set coefficients and range plane properties
Using values from the color representation protocol. Only supported for
YCbCr formats in KMS drivers for now.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
2025-12-19 17:08:39 +01:00
Robert Mader
104cd2e813 gl-renderer: Enable support for color representation protocol
All required features were implemeneted in previous commits - enable the
capability.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
2025-12-19 17:08:39 +01:00
Robert Mader
e8b7997223 gl-renderer: Add coefficients and range support to EGLImage paths
`EGL_YUV_COLOR_SPACE_HINT_EXT` and `EGL_SAMPLE_RANGE_HINT_EXT` have
to be set at image import, which again happens on wl_buffer creation.
This is problematic because in Wayland (and Vulkan) those values are
surface attributes and thus only known once the buffer gets attached
to a particular surface.

We solve that by first importing the dmabuf with default values and,
when attaching a buffer to a surface, creating additional EGLImages
as needed.

Note that we ignore `EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT` and
`EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT` for now, which are neither
required by the Wayland color-representation protocol nor supported by
Mesa shaders (as of 25.3).

Signed-off-by: Robert Mader <robert.mader@collabora.com>
2025-12-19 17:08:39 +01:00
Robert Mader
b736066dc9 gl-renderer: Simplify EGLImage paths
Unlike EGL image import, texture creation and binding is quite fast and
cheap. Thus, instead of doing it as early as possible in various places,
do it right before we actually need it in prepare_textured_draw().

This will follow-up changes easier and includes some preparations for
them.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
2025-12-19 17:08:29 +01:00
Robert Mader
2613db2426 gl-renderer: Add coefficients and range support to internal shader
Add matrix-coefficients and range tracking to more gl-renderer structures
and get the relevant values from the color-representation implementation
instead of hard-coding them in the shader.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
2025-12-19 17:08:29 +01:00
Robert Mader
32f6148afd libweston: Implement color-representation protocol
For now limited to coefficients and ranges that are typically
supported by KMS drivers. We notably leave out alpha modes and
chroma locations for now.

The protocol initialization is guarded by the WESTON_CAP_COLOR_REP
backend capability and thus not enabled anywhere yet.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
2025-12-19 17:08:29 +01:00
Robert Mader
f7aa35e9d2 gitlab-ci: Bump wayland-protocols to 1.46
Signed-off-by: Robert Mader <robert.mader@collabora.com>
2025-12-19 17:08:29 +01:00
Jonas Ådahl
cdb011ee53 libweston/desktop: Support constraining popups to monitor region
Doesn't yet deal with work area (monitor area excluding panels etc), or
reconstraining while moving, but it's a start.

It's more or less based on the mutter implementation. While the mutter
implementation is GPL, it was authored by me, thus grant permission to
relicense to MIT.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2025-12-19 09:07:27 -06:00
Derek Foreman
7c8b745249 compositor: Check for EINTR reading timerfd
It's technically correct this way, and it also squashes an unused result
warning.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2025-12-16 15:59:12 -06:00
Derek Foreman
85d8c7a5e5 clients: Add a commit-timing test client
Add a simple client that queues up a few future frames and logs how
accurately the requested presentation times were hit.

This used simple-shm as a skeleton, and those copyrights have been retained.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2025-12-16 10:58:01 -06:00
Derek Foreman
a3f0e97a71 compositor: Support the commit-timing protocol
Introduce support for the commit-timing protocol to allow applications
to attach a presentation time to a content update.

We use the repaint timer to schedule content updates in advance of
the frame time when they should be displayed.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2025-12-16 10:58:01 -06:00
Derek Foreman
65227cb7d4 compositor: Round repaint times down to possible presentation times
Currently this shouldn't result in any change, since the times we pass in
are real presentation times.

Later when commit-timing lets applications pass in arbitrary times, it
will be more interesting.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2025-12-16 10:58:01 -06:00
Derek Foreman
ed77aca2d8 compositor: check repaint_msec with a helper
Validate repaint_msec so it's not longer than a refresh interval.

Negative repaint windows will cause problems for frame scheduling in the
future, so remove them.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2025-12-16 10:58:01 -06:00