Commit graph

10683 commits

Author SHA1 Message Date
Leandro Ribeiro
ed29f588e4 gl-renderer: log inversion color effect to paint node scope
This was logging the CVD correction effects, but not the inversion one.
This commit adds this.

Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
2026-03-04 13:09:14 -03:00
Leandro Ribeiro
bb12c7225a man: better explain color inversion
The explanation of what a color inversion is was not clear. With this
commit we improve that.

Color inversion computes the RGB complement (i.e. 1.0 - color) of the
input.

Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
2026-03-04 12:27:19 -03:00
Leandro Ribeiro
a44d01b918 frontend: simplify wet_output_set_color_effect()
This function has a few leftovers. At first (downstream) it was
returning error, and callers would handle it. The effect would be a
black screen in case of failure.

Instead, when the MR was proposed we've decided to just log an error and
not set the effect, as it is easy to see that the effect is not applied.
It is better displaying the output without effects than a black screen.

We ended up with a function that always return success. So let's remove
the return value and simplify callers.

Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
2026-03-04 12:27:19 -03:00
Michael Tretter
d0d878972c backend-drm: prefer crtc with most supported planes
When selecting a crtc for an output, prefer the first available crtc that
supports the most hardware planes.

This increases the chance that the compositor can make use of hardware planes
for compositing instead of falling back to rendering just because it selected a
crtc that only supports one plane.

I found this on i.MX6, which has 4 crtcs and 6 planes. crtc 0 and crtc 2 have
two planes, and crtc 1 and crtc 3 have one plane. The current selection
algorithm selects the last matching crtc, which is crtc 3 and prevents the use
of planes.

Signed-off-by: Michael Tretter <m.tretter@pengutronix.de>
2026-03-04 13:27:07 +00:00
Derek Foreman
bbcd7d005b drm: Make underlay/overlay per output
Now that we have per output plane lists, we can make the overlay/underlay
subtype be part of the plane handle, and make the has_underlay property
part of the output.

This fixes bugs on platforms where not all CRTCs have the same
minimum zpos, and underlays can be broken for all outputs because
one output doesn't have any.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-03-04 13:17:49 +00:00
Derek Foreman
6527c586d3 drm: Use plane_handle in drm_plane_state
Instead of an output pointer, use a plane_handle from the output. This will
be more useful later when the plane_handle contains output specific
information.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-03-04 13:17:49 +00:00
Derek Foreman
c9a298b3df drm: replace scanout_plane and cursor_plane with handles
This is a step towards making the handle the thing we keep in plane state
later.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-03-04 13:17:49 +00:00
Derek Foreman
3b03aaa759 drm: Use the output plane handle list instead of the device plane list
Use the output specific plane handle list instead of the entire device
plane list.

For now this is a low benefit optimization.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-03-04 13:17:49 +00:00
Derek Foreman
3e2e54f032 drm: Introduce plane handles
Planes can sometimes be used on a subset of the CRTCs available, so add a
new structure that allows an output to have handles to the planes that are
available on the CRTC it can drive.

For now we just track the lists without using them.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-03-04 13:17:49 +00:00
Derek Foreman
c1fa2ebe5a drm: Don't set cursors_are_broken from output_init_planes
There might be existing outputs with perfectly functional cursors,
there's no reason to break all of that because the new output doesn't
have a cursor plane.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-03-04 13:17:49 +00:00
Derek Foreman
77156786f0 compositor: Remove weston_compositor_stack_plane
It's been a long time since the core has cared about plane z-order. Remove
this.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-03-04 13:17:49 +00:00
Derek Foreman
313ea43f35 compositor: Remove x,y co-ordinates from weston_plane
Turns out nothing actually uses these anymore.

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
2026-03-04 13:17:49 +00:00
Pekka Paalanen
4232db2864 shell-utils: delete weston_shell_utils_surface_get_label()
Unused. Replaced earlier by weston_desktop_surface_make_label().

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 09:40:32 +02:00
Pekka Paalanen
eefcd97e2a libweston: delete weston_surface::get_label as unused
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 09:40:32 +02:00
Marius Vlad
78d15a6f95 libweston: do not call weston_surface::get_label()
Use the new label field instead. The code becomes much simpler.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 09:40:29 +02:00
Pekka Paalanen
d40af215a3 tests: do not call weston_surface::get_label()
Part of migration away from get_label().

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Pekka Paalanen
81c9bca764 perfetto: do not call weston_surface::get_label()
Use the new label field instead. It's always non-NULL.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Pekka Paalanen
63e27f3af5 tests: use new label in test plugin
Part of migration away from get_label().

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Marius Vlad
128a88d1a8 shell-utils: Add labels for curtain created surfaces
struct weston_curtain_params is changed to match the new
weston_surface_set_label() API. For now, I did not bother hooking up the
static label flavor.

Part of migration away from get_label().

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Pekka Paalanen
081faafb92 lua-shell: use new label for desktop surfaces
Part of migration away from get_label().

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Pekka Paalanen
e09a57d91d ivi-shell: use new label
Part of migration away from get_label().

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Pekka Paalanen
f76e89d440 kiosk-shell: use new label for desktop surfaces
Part of migration away from get_label().

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Pekka Paalanen
758619c4ba kiosk-shell: include config.h
Every .c file must include config.h as the first thing.

Without this, when a later patch tries to use xstrdup() here, the build
will:

In file included from ../../git/weston/kiosk-shell/kiosk-shell.c:37:
../../git/weston/shared/xalloc.h: In function ‘abort_oom_if_null’:
../../git/weston/shared/xalloc.h:48:40: error: ‘program_invocation_short_name’ undeclared (first use in this function)
   48 |         written = write(STDERR_FILENO, program_invocation_short_name,
      |                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../git/weston/shared/xalloc.h:48:40: note: each undeclared identifier is reported only once for each function it appears in

This is caused by the lack of _GNU_SOURCE.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Marius Vlad
2ed03fcaea desktop-shell: use new label for helper surfaces
Part of migration away from get_label().

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Marius Vlad
e2766ca2f4 desktop-shell: use new label for input-panel
Part of migration away from get_label().

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Marius Vlad
4011de1e22 desktop-shell: set the new surface label field
To update the surface label based on client-controllable fields like
app_id and title we need to use a listener and update the label
accordingly using weston_surface_set_label() added previously.

The added weston_desktop_surface_make_label() will eventually supersede
weston_shell_utils_surface_get_label() by having a more fluent API.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Pekka Paalanen
83424f4025 libweston: use new label for pointer cursors
Part of migration away from get_label().

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Pekka Paalanen
f26ccbc3b2 libweston: use new label for drag icons
Part of migration away from get_label().

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Marius Vlad
286f58c3d2 libweston: Use the new label infra for subsurfaces
Subsurfaces labels do not have dynamic fields that change so we can just
use it as is.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Marius Vlad
2e61633b32 libweston: Use a string for storing surface label
This is an alternative to using set_label_func to avoid using get_label()
callback. get_label() is inconvenient to set up and to call. It incurs
the cost of creating the string every time it is needed. During
debug logging, the string is needed much more often than it changes.

The new label field simply stores the string, making it easy and cheap
to use. As the trade-off, components that set the label string must
re-create the string when it changes, whether it is needed or not.

For the migration to the new label field, get_label_member callback is
used. It will be deleted once the migration is done.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Pekka Paalanen
03a081f2c8 libweston: ensure weston_surface::get_label is non-NULL
On the quest to delete the get_label() vfunc completely, a temporary
default get_label implementation needs to be plugged in. This would
affect all the code that checks whether the get_label vfunc is NULL.

Let's make get_label vfunc non-NULL always intentionally first. We can
delete all the code that checked for NULL, and the bespoke label
replacements in that case. Now all those different "no label" cases are
unified.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-04 07:28:49 +00:00
Pekka Paalanen
f02c628ee0 libweston: drop a copy in debug_scene_graph_cb()
Doing

	weston_log_subscription_printf(sub, "%s", str);

would malloc a new buffer, copy str into it, flush it our to the
subscriber, and free the buffer before returning.

Using weston_log_subscription_write() instead there is no malloc and
copy. Only open_memstream() has a malloc'd temporary buffer.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-03 15:59:39 +02:00
Marius Vlad
9b0ac55880 tests/client-buffer: Add gl-renderer-paint-nodes scope
Smoke test to make sure we're actually executing those paths.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-03-03 13:24:22 +02:00
Marius Vlad
2d70cbf037 gl-renderer: Add a new gl-renderer scope to print repaint regions
Add a new gl-renderer scope (gl-renderer-paint-nodes) to print out
repaint (damage) regions, opaque and blended regions as well as other
optimizations we might be taking (clear region, color effects), and
skipping repaints.

It includes as well the elapsed time being used by GPU timeline
(GL_EXT_disjoint_timer_query) as well.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-03-03 13:24:22 +02:00
Marius Vlad
58a18e1a9f gl-renderer: Clarify gl-renderer-ext debug scope
Further clarify that is printing the GL/EGL-extension by renaming
the internal scope name to extensions_scope and the advertised name
is gl-renderer-ext.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
2026-03-03 13:24:22 +02:00
Pekka Paalanen
bf513a362a libweston: add weston_color_gamut_from_protocol()
Reduce 4 copies of a piece of code into one. Usable for both client and
server side.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-03 07:41:27 +00:00
Pekka Paalanen
71594a97f8 tests/color-management: commit the image description
Just for completeness sake, let's commit the image description. This
should poke at the surface state machinery with the image description.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-03 07:41:27 +00:00
Pekka Paalanen
1b05eddb75 tests/color-management: drop smoke_test
Every other test here does the same, and more.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-03 07:41:27 +00:00
Pekka Paalanen
18f6592c83 tests: rewrite more color-manager handling into client library
Enhancing the color-manager machinery in the client library to suffice
for color-management-test.c as well, we can remove a copy of the
boilerplate code.

The changes include renaming things, moving parameters from
image_description to image_description_info, deleting the list of image
descriptions and cleaning them up explicitly, and creating the
color-management surface and output objects on-demand.

image_description_get_information() explicitly waits for the done event
instead of relying on a ropund-trip.

Bit operations got helper functions. Gamut parameter printing was
re-written.

In spite of the massive changes, the tests themselves still work exactly
the same.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-03 07:41:27 +00:00
Pekka Paalanen
094499cf8c tests: consolidate create_parametric_image_description
Turns out that the fail-case code does everything the good-case code
does and more, so we can reduce the code duplication.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-03 07:41:27 +00:00
Pekka Paalanen
7cf39e41ff tests: move color-manager handling to client library
There are two partial implementations of the color-manager
protocol boilerplate, in color-management-test.c and
color-management-parametric-test.c. This patch moves the implementation
from the latter into the client library, and uses the helper bit().

This paves way for moving the other partial implementation as well,
de-duplicating the overlapping code, and allowing new test programs to
poke at color-manager.

The color-manager is initialized on-demand, because mosts tests in the
suite do not need it. This avoids a little of unnecessary work.

In anticipation of wp_color_management_v1 version 2, the interface
version is explicit and ensured.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-03-03 07:41:27 +00:00
Robert Mader
5c49563ef4 gl-shaders: Remove asserts relying on shader compiler behavior
yuv_coefficients and yuv_offsets should get optimized away by shader
compilers as the related code paths can never be reached. This seems to
work well on Mesa but not necessarily with other drivers.

While on it, assert that the uniforms *are* present, unless the
yuv-to-rgb conversion is handled by the driver.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
2026-03-02 14:04:48 +01:00
Wang Yu
2c73ce8bac backend-drm: fix read() parameters in libbacklight
The read() function expects a pointer to buffer, not address of
pointer. Three instances were incorrectly passing &buffer instead
of buffer to read().

Signed-off-by: Wang Yu <wangyu@uniontech.com>
2026-03-02 09:54:06 +08:00
Pekka Paalanen
d4d4dc6771 backend-drm: fix leak in drm_device_create()
Found by ASan, now that this function is used for the primary DRM device
as well.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-02-27 10:19:21 -06:00
Pekka Paalanen
dfb4be7904 backend-drm: destroy secondary KMS devices too
These were simply leaked before. Now they get destroyed together with
the primary DRM device, too.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-02-27 10:19:21 -06:00
Pekka Paalanen
f1380a3dc5 backend-drm: put the main device in the list too
Turns out the main device was not special after all, and we can drop
duplicate code.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-02-27 10:19:21 -06:00
Pekka Paalanen
f24ab9d7fe backend-drm: use drm_device_create()
Replace all the open-coding in drm_backend_create() with a call to
drm_device_create(). This is much more maintainable.

drm_source is not needed, it is tracked in struct
drm_device::drm_event_source.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-02-27 10:19:21 -06:00
Pekka Paalanen
e06b246c83 backend-drm: add event source to drm_device
Otherwise we cannot clean it up.

The special backend->drm device has the special backend->drm_source for
the same purpose.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-02-27 10:19:21 -06:00
Pekka Paalanen
20c951b3ee backend-drm: add drm_device_destroy()
Will need to destroy more than the special b->drm. All the additional
devices are currently leaked.

Move the code into a new function to re-use it.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-02-27 10:19:21 -06:00
Pekka Paalanen
853aa1c564 backend-drm: destroy_sprites() after outputs
I want to consolidate 'struct drm_device' destruction into a single
function in the next patch, and that function needs to be usable for
both the primary device drm_backend::drm, and the secondary KMS devices
drm_backend::kms_list.

Sprites, a.k.a drm_planes, are objects fundamentally owned by their
drm_device. To encapsulate drm_device destruction into a single function
(that assumes that all outputs on that device are already destroyed),
one cannot call destroy_sprites() from drm_shutdown() anymore - it
logically belongs in drm_device_destroy().

The problem is that that will reverse the order of destroying drm_planes
vs. output (GBM) surfaces. drm_plane_state holds a reference to drm_fb
which points to a GBM BO that was received from a GBM surface. When the
GBM surface is destroyed, all its GBM BOs are destroyed as well, which
will cause all drm_fb pointing to them to be destroyed as well
regardless of drm_fb reference count. Therefore, if any object was
thought to hold a reference to a drm_fb, it now holds a dangling
pointer.

Why is drm_output_deinit() not clearing the drm_plane state it used,
releasing all the drm_fb references? And do that before destroying the
GBM surface?

Because drm_output_deinit_planes() explicitly skips clearing the
drm_plane state during compositor shutdown, because during shutdown the
drm_planes have already been destroyed.

If we change both, we get a much simpler tear-down logic:

- drm_output_deinit_planes() will always clear drm_plane states, no
  special handling for shutdown (which is an elaborate way of saying
  "before outputs are destroyed").

- drm_output_deinit() calls drm_output_deinit_planes() before it
  destroys the GBM surface, which ensures no dangling drm_fb pointers
  are left.

- destroy_sprites() call is moved *after* destruction of outputs where
  it logically belongs.

This also means that the per-renderer fini functions do not need to
clean up manually when the compositor is not shutting down. They can
just assert the scanout_plane has already been cleaned up.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2026-02-27 10:19:21 -06:00