Commit 576f42ef authored by Tomohito Esaki's avatar Tomohito Esaki Committed by Pekka Paalanen

compositor-drm: Refactor destroy drm_fb function

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's avatarTomohito Esaki <etom@igel.co.jp>
Signed-off-by: Daniel Stone's avatarDaniel Stone <daniels@collabora.com>
Reviewed-by: Pekka Paalanen's avatarPekka Paalanen <pekka.paalanen@collabora.co.uk>
parent 0b70fa4b
......@@ -328,16 +328,38 @@ drm_output_find_by_connector(struct drm_backend *b, uint32_t connector_id)
}
static void
drm_fb_destroy_callback(struct gbm_bo *bo, void *data)
drm_fb_destroy(struct drm_fb *fb)
{
struct drm_fb *fb = data;
if (fb->fb_id)
if (fb->fb_id != 0)
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;
assert(fb->type == BUFFER_PIXMAN_DUMB);
if (fb->map && fb->size > 0)
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 *
......@@ -437,30 +459,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, enum drm_fb_type type)
......@@ -530,7 +528,7 @@ drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend,
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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment