compositor-drm: Only update hw cursor contents when it changes
We avoid the memcpy, gbm_bo_write and the drmModeSetCursor ioctl per frame.
This commit is contained in:
@@ -685,22 +685,27 @@ drm_output_set_cursor(struct weston_output *output_base,
|
|||||||
es->geometry.width > 64 || es->geometry.height > 64)
|
es->geometry.width > 64 || es->geometry.height > 64)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (es->buffer && pixman_region32_not_empty(&es->damage)) {
|
||||||
output->current_cursor ^= 1;
|
output->current_cursor ^= 1;
|
||||||
bo = output->cursor_bo[output->current_cursor];
|
bo = output->cursor_bo[output->current_cursor];
|
||||||
memset(buf, 0, sizeof buf);
|
memset(buf, 0, sizeof buf);
|
||||||
stride = wl_shm_buffer_get_stride(es->buffer);
|
stride = wl_shm_buffer_get_stride(es->buffer);
|
||||||
s = wl_shm_buffer_get_data(es->buffer);
|
s = wl_shm_buffer_get_data(es->buffer);
|
||||||
for (i = 0; i < es->geometry.height; i++)
|
for (i = 0; i < es->geometry.height; i++)
|
||||||
memcpy(buf + i * 64, s + i * stride, es->geometry.width * 4);
|
memcpy(buf + i * 64, s + i * stride,
|
||||||
|
es->geometry.width * 4);
|
||||||
|
|
||||||
|
weston_log("bo_write now\n");
|
||||||
if (gbm_bo_write(bo, buf, sizeof buf) < 0)
|
if (gbm_bo_write(bo, buf, sizeof buf) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
handle = gbm_bo_get_handle(bo).s32;
|
handle = gbm_bo_get_handle(bo).s32;
|
||||||
if (drmModeSetCursor(c->drm.fd, output->crtc_id, handle, 64, 64)) {
|
if (drmModeSetCursor(c->drm.fd,
|
||||||
|
output->crtc_id, handle, 64, 64)) {
|
||||||
weston_log("failed to set cursor: %n\n");
|
weston_log("failed to set cursor: %n\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
x = es->geometry.x - output->base.x;
|
x = es->geometry.x - output->base.x;
|
||||||
y = es->geometry.y - output->base.y;
|
y = es->geometry.y - output->base.y;
|
||||||
|
|||||||
Reference in New Issue
Block a user