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>
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>
Some monitors expose a selector for the kind of content that will get
displayed, allowing them to optimise their settings for this particular
content type.
I got access to such a monitor, sadly even setting it to game mode
didn’t lower its atrocious latency, but drm_info[1] reports it to be set
correctly so hopefully it’ll work better with other monitors.
[1] https://github.com/ascent12/drm_info
Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
We're just going to crash at weston_view_from_global_fixed() anyway if
this is untrue, but we have a similar assertion elsewhere already.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Whether these coordinates are "invalid" (set to an unlikely sentinel value)
or not is based purely on whether pointer->view is valid.
Check pointer->view before using these values every time, and stop
using an "invalid" value entirely.
The reason for this is that in the future we're reworking how 2D
coordinates are handled, and removing the dubious conecept of an invalid
coordinate simplifies things a little.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Sometimes callers don't want them, and sometimes (when view is NULL) the
coordinate is invalid.
Waste a tiny bit of time calculating them as needed in the callers
instead.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
sx and sy are meaningless (-1000000) when view is NULL. The case this
is meant to catch is when the surface coordinates change while the
global coordinate doesn't, (eg: max/unmax a window with a keyboard
shortcut) - in that case view will always be set.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
We're always passing pointer->x, y converted to surface coordinates, or
garbage if view is NULL. Let's just stop passing those coordinates
entirely and calculate them in the function.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Not all callers of weston_pointer_set_focus use weston_compositor_pick_view
to get their coordinate, so let's log something if the coordinate doesn't
make sense.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Removes the need to fabricate a fake coordinate pair when calling
weston_drag_set_focus to clear focus.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
This lets us say what we really mean instead of passing a NULL output
and garbage co-ordinates.
This will help later when manufacturing garbage coordinates becomes much
harder to do.
The clear_pointer_focus() path continues to do nothing, and is just a FIXME
macro, as it has been for a very long time...
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
This adds basic VNC protocol support using the Neat VNC library
(https://github.com/any1/neatvnc). Neat VNC depends on the AML main
loop library. The backend makes use of AML's integrated epoll backend
and connects AML via file descriptor with the Wayland event loop.
This implementation does not support authentication and hardcodes the
pixel format currently.
Co-authored-by: Philipp Zabel <p.zabel@pengutronix.de>
Co-authored-by: Rouven Czerwinski <r.czerwinski@pengutronix.de>
Signed-off-by: Stefan Agner <stefan@agner.ch>
[r.czerwinski@pengutronix.de:
- use new (as of 0.5.0) Neat VNC buffer API, with a buffer pool]
Signed-off-by: Rouven Czerwinski <r.czerwinski@pengutronix.de>
[p.zabel@pengutronix.de:
- transform repaint damage to output coordinates
- transform pointer coordinates into global space
- check that outputs and heads are in fact ours, see aab722bb1785..060ef82d9360
- track damage across multiple frame buffers
- choose pixel format by drm_fourcc, see 8b6c3fe0ad
- enable ctrl and alt modifiers
- fix frame timing to achieve a constant repaint rate
- pass initial size explicitly, see f4559b0760
- use resize_output with pixman-renderer, see 55d08f9634e8..84b5d0eb4bee
- allow configuring the refresh rate]
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Deprecate launcher-logind and disable it by default.
launcher-libseat supports logind, so this shouldn't cause any
regression.
Signed-off-by: Simon Ser <contact@emersion.fr>
References: https://gitlab.freedesktop.org/wayland/weston/-/issues/488
This adds a destroy listener on the SHM buffer provided by our client.
It will unregister the frame notify listener in case our buffer is
destroyed before the frame signal is emitted and thus avoid a memcpy
to invalid memory.
Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
This patch adds the essential LittleCMS color pipeline optimizations and
analysis that is necessary for extracting matrices from pipelines
correctly. When we can extract a matrix and 1D curve sets, we can use
those with GL-renderer without needing an inherently heavy and imprecise
3D LUT. This should improve color transformation precision and
performance when a 3D LUT is not necessary.
The core of the optimization and analysis is a custom plugin for
LittleCMS. The optimization step comprises of repeatedly merging
sequential matrices and sequential curve sets into one and eliminating
identity elements which may allow for more merging. The analysis step
takes the optimized LittleCMS pipeline and attempts to fit all of its
elements into the weston_color_transform model. If it fits, we have an
optimized color transformation and do not need a 3D LUT. If it does not
fit, we use a 3D LUT as before.
Co-authored-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Signed-off-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Restructing cmlcms_color_transform_create for readibility.
Also dropped zalloc() check in favor of xzalloc() as per the recent
Weston development policy.
Signed-off-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
Co-authored-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Right now this function only creates a CMM pipeline and produces a 3D
LUT from it, but in the future it can produce other types of
transformations. The function is renamed to xform_realize_chain()
because it creates a chain of profiles, forms a multi-profile-transform
from them, and fits that into weston_color_transform.
The further refactoring supports the future changes, and attempts to
make the code more readable.
There is provision for easily adding more profiles into the chain.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Relax the types of color transformations categories where this function
can be used. Yes, it is only useful for BLEND_TO_OUTPUT, but that is for
the user of this function to take care of. This function always works as
named regardless. The only condition is that output_inv_eotf_vcgt has
been populated, so fill_in_curves() may as well assert that.
While at it, make the code a little more concise. The 'len' assertion
belongs in fill_in_curves() because that is where the problem would
appear if the assertion failed.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Rename cmslcms_fill_in_pre_curve to cmlcms_fill_in_output_inv_eotf_vcgt
due to importance what the function is fetching:
profile->output_inv_eotf_vcgt.
Signed-off-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
Eotf is the transfer function whose inverse must be used for
converting from output light-linear space to sink electrical space.
Signed-off-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
Add matrix in color.h
Matrix is used as an optimized method for
color mapping vs 3DLUT.
Nothing sets color mapping to matrix yet.
Signed-off-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
Add post-curve support in color.h.
Pre-curve and post-curve describe color pipeline components
in a single GL shader invocation.The GL shader is supposed
to match struct weston_color_transform exactly.
We have the following color pipeline:
shader A -> blending -> shader B -> KMS. Both A and B shaders
using the same source file :fragment.glsl.
Each shader has pre and post curve.
The typical color pipeline with 3DLUT:
Shader A: pre-curve identity->3DLUT->blending->post-curve identity
Shader B: pre-curve->3DLUT identity->post-curve identity->KMS
The typical color pipeline with matrix (in next commits):
Shader A: pre-curve->matrix->blending->post-curve identity
Shader B: pre-curve->matrix identity->post-curve identity->KMS
The pre-curve plays role of EOTF (shader A) or INV_EOTF
(shader B) becouse we are stiching the shaders.
We assume that someone in the future may use both pre-curve
and post-curve, for example, when it is not possible to combine
these curves into 3DLUT and we will do mapping elements based on
their location in ICC profile.
Signed-off-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
Currently the frame event gets lost: The touch focus is removed in the 'up'
event. So the focus is gone when the frame event arrives so it is never sent to
the clients.
To avoid this, keep the touch focus until the frame is handled.
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
Replace all the remaining weston_output::current_mode and borders[] uses
with the fb_size and the compositing area. The result is the same, but
we stop depending on weston_output, and border texture sizes which may
not be the same as border sizes.
This is more correct, semantically.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Do not use border texture size when we have the area stored. This
decouples border texture size further.
We also have buffer_height available directly from fb_size, so do not
reverse-engineer it.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Pure refactoring to make the code easier to read.
Also drop the redundant all-clean check.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Compute the border area from the framebuffer size and composited area
only.
Now the border textures can be freely sized while they will be stretched
to fill the respective border areas. In fact, this was already made use
of by having left/right image height=1 as special cases. Now all the
texture dimensions behave the same.
No change in behavior, the values are the same, just computed
differently.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This moves the identical code from draw_output_borders() and
output_get_border_damage() into a new shared function. Reduces code
duplication.
This is a pure refactoring, all the computations stay the same.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This step prepares to share the coordinate computations between
draw_output_borders() and output_get_border_damage(). The use of
weston_output is replaced with gl_output_state, so that when sharing the
code in a new function, it does not need a weston_output.
This stops the function from accessing output->current_mode and use the
gl-renderer tracked frambuffer size and compositing area instead. Not
using current_mode is a small step towards allowing gl-renderer to
render for other targets than an output.
No behavioral changes, all the values are still the same.
See the diagram in gl-renderer.h for the border areas.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
We get rid of unnecessary GL-renderer output state destroy and create,
meaning we don't destroy and create an EGLSurface either.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This is necessary if you want to resize an output that uses a shadow
framebuffer, instead of destroying and re-creating the renderer state.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>