diff options
author | Daniel Stone <daniels@collabora.com> | 2016-11-04 17:38:37 +0000 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2017-02-07 19:16:31 +0000 |
commit | d29aa0f428f196df07c45d2c0a5b70c1e0ccfe9c (patch) | |
tree | c82d64159f2cb8f17e6b45ac9e970d76b8891462 | |
parent | b445bfaed63fa2d1d34d7d11faa679b31df43aa7 (diff) |
compositor-drm: Use drm_fb for cursor buffers
Now that we have better types in drm_fb, use it for cursor buffers as
well.
Differential Revision: https://phabricator.freedesktop.org/D1493
Signed-off-by: Daniel Stone <daniels@collabora.com>
-rw-r--r-- | libweston/compositor-drm.c | 73 |
1 files changed, 53 insertions, 20 deletions
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index 473cb6f5..ca120272 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -134,6 +134,7 @@ enum drm_fb_type { BUFFER_CLIENT, /**< directly sourced from client */ BUFFER_PIXMAN_DUMB, /**< internal Pixman rendering */ BUFFER_GBM_SURFACE, /**< internal EGL rendering */ + BUFFER_CURSOR, /**< internal cursor buffer */ }; struct drm_fb { @@ -182,11 +183,12 @@ struct drm_output { int disable_pending; struct gbm_surface *gbm_surface; - struct gbm_bo *gbm_cursor_bo[2]; + struct drm_fb *gbm_cursor_fb[2]; struct weston_plane cursor_plane; - struct weston_plane fb_plane; struct weston_view *cursor_view; int current_cursor; + + struct weston_plane fb_plane; struct drm_fb *current, *next; struct backlight *backlight; @@ -284,7 +286,8 @@ drm_fb_destroy_gbm(struct gbm_bo *bo, void *data) { struct drm_fb *fb = data; - assert(fb->type == BUFFER_GBM_SURFACE || fb->type == BUFFER_CLIENT); + assert(fb->type == BUFFER_GBM_SURFACE || fb->type == BUFFER_CLIENT || + fb->type == BUFFER_CURSOR); drm_fb_destroy(fb); } @@ -492,6 +495,7 @@ drm_fb_unref(struct drm_fb *fb) case BUFFER_PIXMAN_DUMB: drm_fb_destroy_dumb(fb); break; + case BUFFER_CURSOR: case BUFFER_CLIENT: gbm_bo_destroy(fb->bo); break; @@ -1291,7 +1295,7 @@ drm_output_set_cursor(struct drm_output *output) pixman_region32_fini(&output->cursor_plane.damage); pixman_region32_init(&output->cursor_plane.damage); output->current_cursor ^= 1; - bo = output->gbm_cursor_bo[output->current_cursor]; + bo = output->gbm_cursor_fb[output->current_cursor]->bo; cursor_bo_update(b, bo, ev); handle = gbm_bo_get_handle(bo).s32; @@ -1873,6 +1877,48 @@ find_crtc_for_connector(struct drm_backend *b, return ret; } +static void drm_output_fini_cursor_egl(struct drm_output *output) +{ + unsigned int i; + + for (i = 0; i < ARRAY_LENGTH(output->gbm_cursor_fb); i++) { + drm_fb_unref(output->gbm_cursor_fb[i]); + output->gbm_cursor_fb[i] = NULL; + } +} + +static int +drm_output_init_cursor_egl(struct drm_output *output, struct drm_backend *b) +{ + unsigned int i; + + for (i = 0; i < ARRAY_LENGTH(output->gbm_cursor_fb); i++) { + struct gbm_bo *bo; + + bo = gbm_bo_create(b->gbm, b->cursor_width, b->cursor_height, + GBM_FORMAT_ARGB8888, + GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE); + if (!bo) + goto err; + + output->gbm_cursor_fb[i] = + drm_fb_get_from_bo(bo, b, GBM_FORMAT_ARGB8888, + BUFFER_CURSOR); + if (!output->gbm_cursor_fb[i]) { + gbm_bo_destroy(bo); + goto err; + } + } + + return 0; + +err: + weston_log("cursor buffers unavailable, using gl cursors\n"); + b->cursors_are_broken = 1; + drm_output_fini_cursor_egl(output); + return -1; +} + /* Init output state that depends on gl or gbm */ static int drm_output_init_egl(struct drm_output *output, struct drm_backend *b) @@ -1881,7 +1927,7 @@ drm_output_init_egl(struct drm_output *output, struct drm_backend *b) output->gbm_format, fallback_format_for(output->gbm_format), }; - int i, flags, n_formats = 1; + int n_formats = 1; output->gbm_surface = gbm_surface_create(b->gbm, output->base.current_mode->width, @@ -1907,21 +1953,7 @@ drm_output_init_egl(struct drm_output *output, struct drm_backend *b) return -1; } - flags = GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE; - - for (i = 0; i < 2; i++) { - if (output->gbm_cursor_bo[i]) - continue; - - output->gbm_cursor_bo[i] = - gbm_bo_create(b->gbm, b->cursor_width, b->cursor_height, - GBM_FORMAT_ARGB8888, flags); - } - - if (output->gbm_cursor_bo[0] == NULL || output->gbm_cursor_bo[1] == NULL) { - weston_log("cursor buffers unavailable, using gl cursors\n"); - b->cursors_are_broken = 1; - } + drm_output_init_cursor_egl(output, b); return 0; } @@ -1931,6 +1963,7 @@ drm_output_fini_egl(struct drm_output *output) { gl_renderer->output_destroy(&output->base); gbm_surface_destroy(output->gbm_surface); + drm_output_fini_cursor_egl(output); } static int |