[RFC weston 05/14] compositor-drm: Refactor code into cursor_bo_update()
Daniel Stone
daniels at collabora.com
Thu May 21 00:29:02 PDT 2015
From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
Cut a chunk of code out from drm_output_set_cursor() and form a new
function for writing a cursor bo data from a weston_view with a wl_shm
buffer.
Add more asserts to verify the assumptions in there.
Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
---
src/compositor-drm.c | 46 +++++++++++++++++++++++++++++++---------------
1 file changed, 31 insertions(+), 15 deletions(-)
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index d47bbd9..038bafc 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -1016,17 +1016,43 @@ drm_output_prepare_cursor_view(struct drm_output *output,
}
static void
+cursor_bo_update(struct gbm_bo *bo, struct weston_view *ev)
+{
+ struct weston_buffer *buffer = ev->surface->buffer_ref.buffer;
+ uint32_t buf[64 * 64];
+ int32_t stride;
+ uint8_t *s;
+ int i;
+
+ assert(buffer && buffer->shm_buffer);
+ assert(buffer->shm_buffer == wl_shm_buffer_get(buffer->resource));
+ assert(ev->surface->width <= 64);
+ assert(ev->surface->height <= 64);
+
+ memset(buf, 0, sizeof buf);
+ stride = wl_shm_buffer_get_stride(buffer->shm_buffer);
+ s = wl_shm_buffer_get_data(buffer->shm_buffer);
+
+ wl_shm_buffer_begin_access(buffer->shm_buffer);
+ for (i = 0; i < ev->surface->height; i++)
+ memcpy(buf + i * 64, s + i * stride,
+ ev->surface->width * 4);
+ wl_shm_buffer_end_access(buffer->shm_buffer);
+
+ if (gbm_bo_write(bo, buf, sizeof buf) < 0)
+ weston_log("failed update cursor: %m\n");
+}
+
+static void
drm_output_set_cursor(struct drm_output *output)
{
struct weston_view *ev = output->cursor_view;
struct weston_buffer *buffer;
struct drm_compositor *c =
(struct drm_compositor *) output->base.compositor;
- EGLint handle, stride;
+ EGLint handle;
struct gbm_bo *bo;
- uint32_t buf[c->cursor_width * c->cursor_height];
- unsigned char *s;
- int i, x, y;
+ int x, y;
output->cursor_view = NULL;
if (ev == NULL) {
@@ -1042,18 +1068,8 @@ drm_output_set_cursor(struct drm_output *output)
pixman_region32_init(&output->cursor_plane.damage);
output->current_cursor ^= 1;
bo = output->cursor_bo[output->current_cursor];
- memset(buf, 0, sizeof buf);
- stride = wl_shm_buffer_get_stride(buffer->shm_buffer);
- s = wl_shm_buffer_get_data(buffer->shm_buffer);
- wl_shm_buffer_begin_access(buffer->shm_buffer);
- for (i = 0; i < ev->surface->height; i++)
- memcpy(buf + i * c->cursor_width, s + i * stride,
- ev->surface->width * 4);
- wl_shm_buffer_end_access(buffer->shm_buffer);
-
- if (gbm_bo_write(bo, buf, sizeof buf) < 0)
- weston_log("failed update cursor: %m\n");
+ cursor_bo_update(bo, ev);
handle = gbm_bo_get_handle(bo).s32;
if (drmModeSetCursor(c->drm.fd, output->crtc_id, handle,
c->cursor_width, c->cursor_height)) {
--
2.4.1
More information about the wayland-devel
mailing list