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 <etom@igel.co.jp> Signed-off-by: Daniel Stone <daniels@collabora.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
This commit is contained in:
committed by
Pekka Paalanen
parent
0b70fa4b56
commit
576f42effe
+30
-32
@@ -328,16 +328,38 @@ drm_output_find_by_connector(struct drm_backend *b, uint32_t connector_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
drm_fb_destroy_callback(struct gbm_bo *bo, void *data)
|
drm_fb_destroy(struct drm_fb *fb)
|
||||||
|
{
|
||||||
|
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;
|
struct drm_fb *fb = data;
|
||||||
|
|
||||||
if (fb->fb_id)
|
assert(fb->type == BUFFER_GBM_SURFACE || fb->type == BUFFER_CLIENT);
|
||||||
drmModeRmFB(fb->fd, fb->fb_id);
|
drm_fb_destroy(fb);
|
||||||
|
|
||||||
weston_buffer_reference(&fb->buffer_ref, NULL);
|
|
||||||
|
|
||||||
free(data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct drm_fb *
|
static struct drm_fb *
|
||||||
@@ -437,30 +459,6 @@ err_fb:
|
|||||||
return NULL;
|
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 *
|
static struct drm_fb *
|
||||||
drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend,
|
drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend,
|
||||||
uint32_t format, enum drm_fb_type type)
|
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;
|
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;
|
return fb;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user