mirror of
https://gitlab.freedesktop.org/wayland/weston
synced 2024-09-06 18:05:39 +00:00
backend-drm/state-propose: Check the surface buffer dimensions for cursor case
In some situations, like positioning a sub-surface that exceeds the output's dimensions we would adjust the plane state dimensions to some lower values to that of the buffer. That would ultimately trip the cursor update function because the buffer itself actually exceeds the maximum size/dimension of the cursor. The plane state destination co-ordinates is the area of the view which is visible on the output, which in some situations, would actually be smaller than the original buffer dimensions (making it so that it will pass the cropping/scaling check), but depending on of how large is the surface buffer, it would tripping the assert wrt to cursor width/height dimensions. This hasn't been seen so far due to the fact that until recently we had a cursor surface that always reached the cursor plane and that was already being set-up by default (with desktop-shell, which is no longer the case), and also because kiosk-shell, which doesn't set-up a cursor surface, was not available. This adds a check to skip placing the view in the cursor plane if the buffer dimensions exceed the cursor permitted width/height. (Suggested-by Daniel Stone). Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
This commit is contained in:
parent
f153c49430
commit
7a465d855e
|
@ -306,6 +306,7 @@ drm_output_prepare_cursor_view(struct drm_output_state *output_state,
|
|||
struct drm_plane *plane = output->cursor_plane;
|
||||
struct drm_plane_state *plane_state;
|
||||
bool needs_update = false;
|
||||
struct weston_buffer *buffer = ev->surface->buffer_ref.buffer;
|
||||
const char *p_name = drm_output_get_plane_type_name(plane);
|
||||
|
||||
assert(!b->cursors_are_broken);
|
||||
|
@ -337,6 +338,16 @@ drm_output_prepare_cursor_view(struct drm_output_state *output_state,
|
|||
goto err;
|
||||
}
|
||||
|
||||
if (buffer->width > b->cursor_width ||
|
||||
buffer->height > b->cursor_height) {
|
||||
drm_debug(b, "\t\t\t\t[%s] not assigning view %p to %s plane "
|
||||
"(surface buffer (%dx%d) larger than permitted"
|
||||
" (%dx%d))\n", p_name, ev, p_name,
|
||||
buffer->width, buffer->height,
|
||||
b->cursor_width, b->cursor_height);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (plane_state->src_x != 0 || plane_state->src_y != 0 ||
|
||||
plane_state->src_w > (unsigned) b->cursor_width << 16 ||
|
||||
plane_state->src_h > (unsigned) b->cursor_height << 16 ||
|
||||
|
|
Loading…
Reference in a new issue