From: Tomohito Esaki <[email protected]> The drm_fb destroy callback to mostly the same thing regardless of whether the buffer is a dumb buffer or gbm buffer. This patch refactors the common parts into a new function that can be called for both cases.
[daniels: Rebased on top of fb->fd changes, cosmetic changes.] Signed-off-by: Tomohito Esaki <[email protected]> Signed-off-by: Daniel Stone <[email protected]> Differential Revision: https://phabricator.freedesktop.org/D1489 --- libweston/compositor-drm.c | 61 +++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index 5b4c28d..7ebf8f1 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -247,16 +247,39 @@ drm_sprite_crtc_supported(struct drm_output *output, struct drm_sprite *sprite) } static void -drm_fb_destroy_callback(struct gbm_bo *bo, void *data) +drm_fb_destroy(struct drm_fb *fb) { - struct drm_fb *fb = data; + drmModeRmFB(fb->fd, fb->fb_id); + weston_buffer_reference(&fb->buffer_ref, NULL); + free(fb); +} + +static void +drm_fb_destroy_dumb(struct drm_fb *fb) +{ + struct drm_mode_destroy_dumb destroy_arg; - if (fb->fb_id) - drmModeRmFB(fb->fd, fb->fb_id); + if (!fb) + return; - weston_buffer_reference(&fb->buffer_ref, NULL); + assert(fb->type == BUFFER_PIXMAN_DUMB); + + munmap(fb->map, fb->size); + + memset(&destroy_arg, 0, sizeof(destroy_arg)); + destroy_arg.handle = fb->handle; + drmIoctl(fb->fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_arg); + + drm_fb_destroy(fb); +} + +static void +drm_fb_destroy_gbm(struct gbm_bo *bo, void *data) +{ + struct drm_fb *fb = data; - free(data); + assert(fb->type == BUFFER_GBM_SURFACE || fb->type == BUFFER_CLIENT); + drm_fb_destroy(fb); } static struct drm_fb * @@ -354,30 +377,6 @@ err_fb: return NULL; } -static void -drm_fb_destroy_dumb(struct drm_fb *fb) -{ - struct drm_mode_destroy_dumb destroy_arg; - - assert(fb->type == BUFFER_PIXMAN_DUMB); - - if (!fb->map) - return; - - if (fb->fb_id) - drmModeRmFB(fb->fd, fb->fb_id); - - weston_buffer_reference(&fb->buffer_ref, NULL); - - munmap(fb->map, fb->size); - - memset(&destroy_arg, 0, sizeof(destroy_arg)); - destroy_arg.handle = fb->handle; - drmIoctl(fb->fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_arg); - - free(fb); -} - static struct drm_fb * drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend, uint32_t format) @@ -436,7 +435,7 @@ drm_fb_get_from_bo(struct gbm_bo *bo, goto err_free; } - gbm_bo_set_user_data(bo, fb, drm_fb_destroy_callback); + gbm_bo_set_user_data(bo, fb, drm_fb_destroy_gbm); return fb; -- 2.9.3 _______________________________________________ wayland-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/wayland-devel
