When a view is destroyed then the views of subsurfaces remain until the view
list is rebuilt for the next repaint.
During that time view->parent_view contains an invalid pointer and weston will
crash when it tries to access the view.
This happens for a surface with subsurfaces with views on two different outputs
with the ivi-shell:
When the surface is destroyed then the destroy handler of the ivi-shell
(shell_handle_surface_destroy()) may be called first. It will (indirectly)
destroy the view of the main surface with weston_view_destroy().
Next the surface destroy handler of the subsurfaces
(subsurface_handle_parent_destroy() is called. It will unmap the first view of
the subsurface. Here weston_surface_assign_output() is called which tries to
find the output of the second view and accesses the now invalid
view->parent_view in the process.
There are probably other ways to trigger similar crashes.
To avoid this, clear view->parent_view when the parent view is destroyed.
Fixes 0669d4de4f ("libweston: Skip views without a layer assignment in
output_mask calculations")
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
The pixel format stored in backends->format[0] is effectively looked up
via pixel_format_get_info(DRM_FORMAT_ARGB8888). Reuse that instead of
looking up the same via pixel_format_get_info_by_pixman(PIXMAN_a8r8g8b8)
in multiple places.
There are still two instances of hard-coded CAIRO_FORMAT_ARGB32 in
wayland_output_get_shm_buffer() that currently can not be obtained from
pixel_format_info.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
If the wl_surface resource has version 5 or newer, we should always
ignore the offset parameters in wl_surface.attach.
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Push weston_coord into the notification functions instead of passing
two doubles.
The touch handlers are passed a pointer to a weston_coord, which is
unusual. This is done so we can pass a NULL pointer instead of a
fabricated invalid coordinate when the touch type is TOUCH_UP.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
This creates a global coordinate from a device coordinate.
Replace it with weston_coord_global_from_output_point() which
does the same thing and returns a weston_coord_global.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Remove the independent x, y floats from the clipping code and replace them
with struct weston_cord. This includes the polygon8 structure as well.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
If a window is clicked with a mouse while it's being interacted with via
touch input, the assert from 2dc8680d will fire.
This is a leftover from d611ab24
Update the transform before converting the coordinate to fix this.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Starting with commit 4cde507be6 "backend-drm: fix plane sorting" the
plane list will have a descending order of the planes rather than ascending.
This reversed order had the side-effect of exposing the fact that we
don't set-up a plane index when creating the drm_plane using the DRM
virtual API. Without settting a plane index for that drm_plane we
effectively overwrite the plane index which has the 0 (zero) entry.
This wasn't an issue before commit 4cde507be6 "backend-drm: fix
plane sorting" as it seems we never picked up that plane index as
being a suitable one due to the fact that those were assigned to primary
planes, but after that commit, the cursor plane will be one getting
the 0 (zero) plane index.
Finally, this would trip over because we attempt to place a (cursor)
view on a primary plane (where it would've normally be a cursor
plane) and we end up with no framebuffer ref.
This is fixed trivially by assigning a plane index, different than the
ones already created by create_spirtes().
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Split x11_output_get_pixel_format() out of x11_output_init_shm() so the
pixel format can already be known when calling pixman->output_create().
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Reorder pixman renderer output state and SHM renderbuffer creation and
removal to make sure the pixman renderbuffer list is empty when the
output state is destroyed.
Fixes: 4d96635a3f ("pixman-renderer: track damage in weston_renderbuffer")
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Pixman output state creation requires a valid pixel format to be set for
weston_output_update_capture_info().
Fixes: c67773bc5c ("pixman-renderer: use pixel_format_info instead of pixman_format_code_t")
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Reorder pixman renderer output state and SHM renderbuffer removal to
make sure the pixman renderbuffer list is empty when the output state
is destroyed.
Fixes: 4d96635a3f ("pixman-renderer: track damage in weston_renderbuffer")
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Pixman output state creation requires a valid pixel format to be set for
weston_output_update_capture_info().
Fixes: c67773bc5c ("pixman-renderer: use pixel_format_info instead of pixman_format_code_t")
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Whilst GLSL requires highp for the vertex shader stage, highp is
optional for the fragment shader.
Make sure that we work in highp by default during the vertex shader
stage, using either highp or mediump for the texcoord varying according
to what the fragment shader supports.
Signed-off-by: Daniel Stone <daniels@collabora.com>
Search for planes that support the rotation required to properly display
a paint node, and properly set coordinates and rotation properties.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
For now we just always set the plane up to have a "normal" rotation, so
no new features are added with this commit.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
From our perspective, a bitmask is pretty much the same as an enum, so
allow it to use the same path.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
We're pushing more and more mutable state into paint nodes, but this state
has a non-zero cost to rebuild every render.
Let's take care to track when we need to rebuild the state.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Every shells have an implementation of weston_desktop_api structures.
It includes some callbacks to listen to xdg_surface signals. Committed callback
is one of them.
Currently, the xdg_shell don't invoke the weston_desktop_api->committed
callback when the xdg_surface is initial stage or no surface content.
In the case: the client attached a null buffer after the valid buffer,
the shell isn't going to invoke to xdg_surface committed, and don't know
the surface is disappeared. If the surface is fullscreen, we will get
a black background on the screen until a new valid frame come. That
should not happen.
Signed-off-by: Tran Ba Khang(MS/EMC31-XC) <Khang.TranBa@vn.bosch.com>
Add the weston_surface_is_unmapping() api, this will help the shell
to detect the commit of a surface is unmapping or not.
Suggested-by: Morgane Glidic <sardemff7+git@sardemff7.net>
Signed-off-by: Tran Ba Khang(MS/EMC31-XC) <Khang.TranBa@vn.bosch.com>
Reorder pixman renderer output state and renderbuffer removal to make
sure the pixman renderbuffer list is empty when the output state is
destroyed.
Fixes: 4d96635a3f ("pixman-renderer: track damage in weston_renderbuffer")
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
We can clear this via drm_plane_state_put_back() at the end of
drm_output_propose_state(). We need to set it back to the minimum zpos
when rendering.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Update users of the old coordinate space conversion functions that take
x, y pairs to the new weston_coord versions.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Possibly the least useful place to use this, as the input comes directly
from pixman rects, and the output is more complicated than usual, but
I guess consistency counts for something.
There is some small benefit in switching to weston_matrix_transform_coord
to hide the perspective normalization step and the homogenous coords.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
All through weston we have code that passes int x, y or
float x, y or wl_fixed_t x, y pairs. These pairs are frequently
converted to/from wl_fixed_t and other types.
We also have struct vec2d and struct weston_geometry which also
contain coordinate pairs.
Let's create a family of coordinate vector structures for coordinate
pairs and use it anywhere we sensibly can.
This has a few benefits - it helps remove intermediate conversion
between fixed/float/int types. It lets us roll the homogenous
coordinate normalization bits into helper functions instead of
needing them open coded throughout the source.
Possibly most importantly, it also allows us to do some compile time
validation of what coordinate space we're working in.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
One variant is used when a view is being positioned relative to a parent,
the other is when the view is being given an absolute position in the
global space.
This will help later when surface and global coordinates are different
data types, but for now the two functions do essentially the same thing.
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Clean up the code a little by dropping the now unnecessary switch case
in drm_output_init_pixman(). As a side effect, this enables all formats
that have a pixman_format entry in the pixel format table:
- rgb565
- xrgb8888
- argb8888
- xbgr8888
- abgr8888
- rgbx8888
- rgba8888
- bgrx8888
- bgra8888
- xrgb2101010
- argb2101010
- xbgr2101010
- abgr2101010
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Use const struct pixel_format_info *format instead of uint32_t
gbm_format for backend and output pixel format.
Since create_gbm_surface() is never called without output->format being
set, drop the unnecessary error message.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Make use of meson subprojects support. Allow to optionally build the
libraries required for the VNC backend as subproject of Weston.
Signed-off-by: Stefan Agner <stefan@agner.ch>
[philipp.zabel@gmail.com: update neatvnc and aml versions]
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Use struct pixel_format_info pointers instead of uint32_t drm fourcc
values at the API surface for output and image creation.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Add a helper function to turn an array of DRM fourccs into an array of
corresponding struct pixel_format_info pointers.
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Use struct pixel_format_info pointers instead of pixman_format_code_t
values at the API surface for output and image creation.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Xwayland pop-up menus aren't displayed until the mouse moves, or some other
action causes the compositor to repaint.
This is because the shell knows nothing about xwayland override redirect
windows, so it won't assign them an output. Without an output, the
surface commit won't cause a repaint.
Fix this with brute force by updating their geometry on commit. If the
geometry is dirty (and it will be for new surfaces), this will cause an
output to be assigned before the upcoming weston_surface_schedule_repaint()
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Found-by: Hideyuki Nagase <hideyukn@microsoft.com>
Add weston_renderbuffer_ref/unref() functions and use them to
eventually destroy the weston_renderbuffer. Drop the explicit
renderbuffer_destroy vfunc from the pixman renderer interface.
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
This pixman image is not actually used anymore, drop it.
Fixes: 89e1831cd7 ("pixman-renderer: add weston_renderbuffer and create/destroy interface")
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Given that pixman_image_create_bits_no_clear() is asked to allocate the
buffer on its own, the _no_clear part is not important. Drop it.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>