[PATCH weston] drm: don't put too big surfaces in the cursor plane
Giulio Camuffo
giuliocamuffo at gmail.com
Mon Nov 21 11:23:55 UTC 2016
When using output scaling a client surface's wicth and height can be
smaller than the cursor plane's size, even if its buffer is actually
bigger. So check the buffer size rather than the surface size.
---
libweston/compositor-drm.c | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index a899213..0913f6c 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -1127,6 +1127,7 @@ drm_output_prepare_cursor_view(struct drm_output *output,
struct drm_backend *b = to_drm_backend(output->base.compositor);
struct weston_buffer_viewport *viewport = &ev->surface->buffer_viewport;
struct wl_shm_buffer *shmbuf;
+ struct weston_buffer *buffer = ev->surface->buffer_ref.buffer;
if (ev->transform.enabled &&
(ev->transform.matrix.type > WESTON_MATRIX_TRANSFORM_TRANSLATE))
@@ -1147,13 +1148,13 @@ drm_output_prepare_cursor_view(struct drm_output *output,
return NULL;
if (ev->surface->buffer_ref.buffer == NULL)
return NULL;
- shmbuf = wl_shm_buffer_get(ev->surface->buffer_ref.buffer->resource);
+ shmbuf = wl_shm_buffer_get(buffer->resource);
if (!shmbuf)
return NULL;
if (wl_shm_buffer_get_format(shmbuf) != WL_SHM_FORMAT_ARGB8888)
return NULL;
- if (ev->surface->width > b->cursor_width ||
- ev->surface->height > b->cursor_height)
+ if (buffer->width > b->cursor_width ||
+ buffer->height > b->cursor_height)
return NULL;
output->cursor_view = ev;
@@ -1180,8 +1181,8 @@ cursor_bo_update(struct drm_backend *b, struct gbm_bo *bo,
assert(buffer && buffer->shm_buffer);
assert(buffer->shm_buffer == wl_shm_buffer_get(buffer->resource));
- assert(ev->surface->width <= b->cursor_width);
- assert(ev->surface->height <= b->cursor_height);
+ assert(buffer->width <= b->cursor_width);
+ assert(buffer->height <= b->cursor_height);
memset(buf, 0, sizeof buf);
stride = wl_shm_buffer_get_stride(buffer->shm_buffer);
@@ -1191,7 +1192,7 @@ cursor_bo_update(struct drm_backend *b, struct gbm_bo *bo,
for (i = 0; i < ev->surface->height; i++)
memcpy(buf + i * b->cursor_width,
s + i * stride,
- ev->surface->width * 4);
+ buffer->width * 4);
wl_shm_buffer_end_access(buffer->shm_buffer);
if (gbm_bo_write(bo, buf, sizeof buf) < 0)
@@ -1292,8 +1293,8 @@ drm_assign_planes(struct weston_output *output_base)
if (b->use_pixman ||
(es->buffer_ref.buffer &&
(!wl_shm_buffer_get(es->buffer_ref.buffer->resource) ||
- (ev->surface->width <= b->cursor_width &&
- ev->surface->height <= b->cursor_height))))
+ (es->buffer_ref.buffer->width <= b->cursor_width &&
+ es->buffer_ref.buffer->height <= b->cursor_height))))
es->keep_buffer = true;
else
es->keep_buffer = false;
--
2.10.2
More information about the wayland-devel
mailing list