Migrate the tst suite to using the new screenshooting protocol. This
ensures the new protocol and implementation work, and removes a user of
the old protocol so that the old protocol can be removed in the future.
Now that the compositor chooses the pixel format,
capture_screenshot_of_output() needs to convert to the expected format
in the tests when necessary.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Instead of starting yet another hand-crafted pixel format mapping table,
use the one we have.
Following patches want to be able to create XRGB8888 buffers, and later
even other formats.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Replicating the policy of the old screenshooting interface, allow all
screenshot to anyone with the new interface as well when --debug is
used.
Looks like there was one stray trailing space in unrelated code that my
editor deleted. Better this way.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This services output capture tasks for the 'framebuffer' and 'full
framebuffer' pixel sources.
Both pixel sources come from the same source: the EGLSurface. The only
difference is the area. The EGLSurface contains the borders used for
output decorations, hence 'full framebuffer' is possible to capture.
We use GL_ANGLE_pack_reverse_row_order extension to make glReadPixels
return the image data in the layout we need for wl_shm buffers directly.
Without the extension we have to flip manually.
Another extension to the same effect is MESA_pack_invert, but this is
not specified for GL ES. It also uses a different token value, so it
cannot be directly substituted even if supported.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This services output capture tasks for the 'framebuffer' and 'blending'
pixel sources.
Just like the old screenshooting path, the 'framebuffer' pixel source is
the hardware buffer, whether a shadow is used or not. This may not be
the best for performance, but you do get the real framebuffer contents.
Maybe it's rgb565, or even less.
When the shadow buffer is used, I realized it is effectively the same as
the intermediate blending buffer in GL-renderer when color management is
used. Pixman-renderer does non-linear blending only, so the shadow
buffer is in the blending space. The shadow buffer is also always 8 bpc
regardless of the hardware framebuffer, so the read-back may be
different from the hardware framebuffer. Read-back from the shadow is
optimal for performance, but not what the hardware gets.
'full-framebuffer' source cannot yet be implemented, because backends do
not tell Pixman-renderer about the margins where the wayland-backend
blits the output decorations. The target "hardware" buffer handed to
pixman-renderer does not allow accessing the decorations area.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This will be useful for client code that wants to create a wl_shm buffer
with a DRM format code.
The test suite will be using this.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This implements the basics of the new screenshooting protocol. The
actual pixel operations will be implemented separately in the renderers
and DRM-backend.
See the previous commit "protocol: new screenshooter protocol" for why.
If DRM-backend needs more from weston_capture_task when it implements
writeback screenshooting, it will be easy to add user_data or expose
weston_capture_task::link for the backend to use. Those were not added
yet because it is uncertain what is actually needed.
The DRM-backend no-damage optimization requires special handling here as
well. See also 7f1a113c89 .
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This is a completely new screenshooting protocol designed to support:
- color management testing by adding the "blending" source
- KMS testing by adding the "writeback" source
- output decorations testing by adding the "full_framebuffer" source
- proper buffer size negotiation instead of guessing from wl_output
- compositor chosen pixel format, primarily for "blending" source
- proper indication of screenshot failure
- dmabuf target buffers, linear only
This new protocol should be good enough to publish as a Weston public
extension. Hence install it.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
We now depend on the matrices in weston_view being correct even when the
transform isn't enabled.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Add tests to validate that weston_matrix_to_transform() works properly
on the matrices generated by weston_surface_build_buffer_matrix() and
weston_output_update_matrix()
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Instead of basing this on simple checks, we can test the matrix. This
should result in more opportunistically picking fast nearest neighbour
filtering when it won't result in visible distortion.
For now we only use this in the gl renderer, as paint nodes aren't
plumbed into the pixman renderer yet.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Instead of bailing based on our loosely tracked matrix "type" (that won't
recognize when an operation is reversed by its inverse) use the new
weston_matrix_to_transform to determine if the matrix reasonably matches.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
This can be helpful in testing if a paint node needs linear vs nearest
neighbour filtering, or if a view can be placed on a plane.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
When we build up a matrix from a series of operations, it's very useful
to know if the combined operations still result in something that matches
a wl_output_transform.
This adds a function to test if a matrix leads to a standard output
transform, and returns the transform if it does.
Tests are provided that check if complex series of operations return
expected results - the weston_matrix_needs_filtering function is tested
at the same time.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
If a transformation matrix causes a scale, a rotation not a multiple of 90
degrees or a non-integral translation then textures rendered with
it would benefit from bilinear filtering.
This test is done in a lazy fashion by examining elements of the matrix
to check for a simple pattern that indicates these conditions are met.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
After commit 2dc8680d71 this started crashing. We need to update the
view transform here too.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Let VNC clients authenticate using the local username and password of
the user weston is running as. To avoid transmitting the password in
cleartext, make TLS security mandatory.
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Add user authentication support for remote backends via PAM.
This requires a configuration file /etc/pam.d/weston.
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
A couple of additional assert()s for transforms being dirty in places
where it could lead to unexpected results.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Let's simplify this code by asserting, and letting it explode naturally
(return Inf, possibly SIGFPE depending on external factors) if compiled
NDEBUG, instead of a contained explosion (safely returning 0).
If this actually happens it's Really Bad, so we'd like to catch is ASAP,
especially in CI.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
We always set it up correctly, even if transforms are disabled. The code
is simpler if we always use the matrix instead of having two cases.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
If the view transform is dirty it might be incorrect. Also, we normally
set up the view transform matrix properly regardless of whether the
transform is enabled or not - but if we've never run
weston_view_update_transform() it will be all zeros.
This is a step towards removing view->transform.enabled checks and just
using the transform matrix in all cases.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
These places all eventually lead to calling weston_view_to_global_float()
or weston_view_from_global_float() on a view with a dirty transform.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
I inverted the direction of this transform when I stopped doing it from
weston_compositor_pick_view()
Fixes 4d141a788
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
There are two problems here, one is that the surface jump logic only makes
sense if the view remains the same.
The more important fix is that pointer coordinates are in global coordinates
and we want view coordinates, so this test was always wrong and led to an
xdg ping storm due to spurious focus changes.
Fixes 4d141a788
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
weston_pointer_move() can change the pointer->focus, so we have to ensure
we're only testing old_sx and old_sy if we had a focus set before that
point.
Fixes 9b5a525a3d
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
This introduces a few getters to retrieve the pending state from
libweston-desktop, now just libweston, and makes use of it,
specifically get_pending_maximized to avoid sending invalid
dimensions to the client in the particular use case
set_maximized/unset_fullscreen.
These pending state getters are useful to query/poke a not-applied
yet state, and could be useful where we don't have a buffer attached
where the client might be set-up as maximized, but internally libweston
hasn't yet applied that pending state.
Fixes#645
Suggested-by: Morgane Glidic <sardemff7+git@sardemff7.net>
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Listening the shell destroy instead of compositor destroy signal.
This show how to in case the controller depends on shell resource.
The order destroying had changed in this commit, the controller
is destroyed first now
Signed-off-by: Tran Ba Khang(MS/EMC31-XC) <Khang.TranBa@vn.bosch.com>
The surface listeners must remove when hmi-controller destroying.
To avoid to use after free.
Suggested-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Tran Ba Khang(MS/EMC31-XC) <Khang.TranBa@vn.bosch.com>
In the case the controlelrs are depended on ivi-shell resource,
it must be destroy before the ivi shell destroy. To do this,
add new ivi shell destroy signal on ivi shell, emit it on
the begining of the shell destroying
Suggested-by: Harsha M M <harsha.manjulamallikarjun@in.bosch.com>
Suggested-by: Michael Olbrich <m.olbrich@pengutronix.de>
Suggested-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Tran Ba Khang(MS/EMC31-XC) <Khang.TranBa@vn.bosch.com>
This is particularly useful when using the weston-editor which seems to
cause an issue with cairo_debug_reset_static_data(), as that still seems
to find out there are references laying around, causing a crash when
exiting:
../../../../src/cairo-hash.c:217: _cairo_hash_table_destroy: Assertion
`hash_table->live_entries == 0' failed
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Rather than creating a new PangoContext each time the menu redraw
handler is triggered re-use it if one was created previously.
All toytoolkit clients do create a layout (and implicitly a
PangoContext) but only those that have menu redraw
handler installed will create a new layout for each redraw of the menu,
effectively creating a new PangoContext each time.
Reported-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
We are already doing that before calling theme_render_frame() so no need
to do it again in layout creation.
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
These have been in wayland a while back with version 1.20.0.
We also need to update the test client helper with this bump, as
those bind to version 4.
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Before this patch, when a new head is found its information is printed
first as "updated" and then as "found" in the log.
The reason is that drm_head_create() calls drm_head_update_info() which
printed the head as "changed". Then drm_head_create() itself prints it
as "found".
This fixes it to print only once as "found".
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Mimic the existing behaviour of logging once, but make it once
per output instead of per run.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Mimic the existing behaviour of logging 5 times, with no reset, but
change it so it's per device instead of using a static variable.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
The current code only prints this once, and this is a probably a sensible
thing to do, as a clock read failure is probably not a condition that will
correct itself.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Ideally we'd like to see this more than just a single time, but we'd also
like to prevent it from triggering endlessly. Let's also make this happen
per output.
While we're here, use the word "abnormal" instead of "insane"
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
We have a few places where we log messages only the first time they occur.
Provide a log throttling implementation so we don't have to open code this
in all the places that need it.
Instead of just logging a single time, allow some finer control. We allow
logging of a specified number of events. Additionally, we have an optional
timeout after which the event count is reset so we can log at most N
events in M ms.
The first new event printed after the timeout expires will also include a
count of suppressed events.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
To avoid the following UAF:
Invalid read of size 8
at 0x4AE5EFF: weston_desktop_get_display (libweston-desktop.c:110)
by 0x4AEB2C9: weston_desktop_xdg_surface_schedule_configure (xdg-shell.c:1160)
by 0x4AEA77A: weston_desktop_xdg_toplevel_set_size (xdg-shell.c:711)
by 0x4AE839D: weston_desktop_surface_set_size (surface.c:504)
by 0x63F7D43: ivi_layout_surface_set_size (ivi-layout.c:1599)
by 0x63F949F: transition_move_resize_view_destroy (ivi-layout-transition.c:311)
by 0x63F9397: layout_transition_destroy (ivi-layout-transition.c:259)
by 0x63F8E0B: ivi_layout_remove_all_surface_transitions (ivi-layout-transition.c:121)
by 0x63F4BC1: ivi_layout_surface_destroy (ivi-layout.c:258)
by 0x63F38AF: layout_surface_cleanup (ivi-shell.c:162)
by 0x63F3D2D: shell_destroy (ivi-shell.c:359)
by 0x4AF059A: weston_signal_emit_mutable (signal.c:62)
Address 0x174202d0 is 0 bytes inside a block of size 152 free'd
at 0x484617B: free (vg_replace_malloc.c:872)
by 0x4AE5EDC: weston_desktop_destroy (libweston-desktop.c:97)
by 0x63F3CF2: shell_destroy (ivi-shell.c:355)
by 0x4AF059A: weston_signal_emit_mutable (signal.c:62)
by 0x4ACBC2C: weston_compositor_destroy (compositor.c:8629)
by 0x4864A4B: wet_main (main.c:3908)
by 0x10915D: main (executable.c:33)
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Shutting down the compositor gives us:
Invalid write of size 8
at 0x4B1AEDB: wl_list_remove (wayland-util.c:56)
by 0x4AF05BF: weston_signal_emit_mutable (signal.c:66)
by 0x4ACBC2C: weston_compositor_destroy (compositor.c:8629)
by 0x4864A4B: wet_main (main.c:3908)
by 0x10915D: main (executable.c:33)
Address 0x17435f20 is 224 bytes inside a block of size 384 free'd
at 0x484617B: free (vg_replace_malloc.c:872)
by 0x17718C7E: hmi_controller_destroy (hmi-controller.c:761)
by 0x4AF059A: weston_signal_emit_mutable (signal.c:62)
by 0x4ACBC2C: weston_compositor_destroy (compositor.c:8629)
by 0x4864A4B: wet_main (main.c:3908)
by 0x10915D: main (executable.c:33)
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Similar to changes in simple-dmabuf-egl, this perform a x-axis
reflection as it has the same NDC values as simple-dmabuf-egl and we get
an inverted image. We do it straight in the shader this time.
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
The motivations for this are:
- Y_INVERT is not used by most real-world clients.
weston-simple-dmabuf-egl and weston-simple-dmabuf-v4l are one only
known users. Thus this creates a special case just for these demo
clients.
- Some compositors (wlroots) have dropped support for DMA-BUF flags,
so the client no longer runs there.
- Dropping the flag allows compositors to use a KMS hardware plane to
display the buffer.
It keeps the same axis orientation we had in place where we had the
y-invert flag enabled by default, by doing a reflection about x-axis.
Signed-off-by: Simon Ser <contact@emersion.fr>
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Closes: https://gitlab.freedesktop.org/wayland/weston/-/issues/675