compositor: introduce struct weston_backend
This is a preliminary change for libweston, with no functional modifications.
Separate the backends and the core weston_compositor struct, by creating
the weston_compositor in the main(), and having the various backends extend
the weston_backend struct, an instance of which is returned by the backend
entry point.
This enable us to logically separate the compositor core from the backend,
allowing the core to be extended without messing with the backends.
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index 66eb5d7..21fbef7 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -83,8 +83,9 @@
OUTPUT_CONFIG_MODELINE
};
-struct drm_compositor {
- struct weston_compositor base;
+struct drm_backend {
+ struct weston_backend base;
+ struct weston_compositor *compositor;
struct udev *udev;
struct wl_event_source *drm_source;
@@ -201,7 +202,7 @@
struct drm_fb *current, *next;
struct drm_output *output;
- struct drm_compositor *compositor;
+ struct drm_backend *backend;
uint32_t possible_crtcs;
uint32_t plane_id;
@@ -233,11 +234,11 @@
drm_sprite_crtc_supported(struct drm_output *output, uint32_t supported)
{
struct weston_compositor *ec = output->base.compositor;
- struct drm_compositor *c = (struct drm_compositor *)ec;
+ struct drm_backend *b =(struct drm_backend *)ec->backend;
int crtc;
- for (crtc = 0; crtc < c->num_crtcs; crtc++) {
- if (c->crtcs[crtc] != output->crtc_id)
+ for (crtc = 0; crtc < b->num_crtcs; crtc++) {
+ if (b->crtcs[crtc] != output->crtc_id)
continue;
if (supported & (1 << crtc))
@@ -262,7 +263,7 @@
}
static struct drm_fb *
-drm_fb_create_dumb(struct drm_compositor *ec, unsigned width, unsigned height)
+drm_fb_create_dumb(struct drm_backend *b, unsigned width, unsigned height)
{
struct drm_fb *fb;
int ret;
@@ -280,16 +281,16 @@
create_arg.width = width;
create_arg.height = height;
- ret = drmIoctl(ec->drm.fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_arg);
+ ret = drmIoctl(b->drm.fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_arg);
if (ret)
goto err_fb;
fb->handle = create_arg.handle;
fb->stride = create_arg.pitch;
fb->size = create_arg.size;
- fb->fd = ec->drm.fd;
+ fb->fd = b->drm.fd;
- ret = drmModeAddFB(ec->drm.fd, width, height, 24, 32,
+ ret = drmModeAddFB(b->drm.fd, width, height, 24, 32,
fb->stride, fb->handle, &fb->fb_id);
if (ret)
goto err_bo;
@@ -301,18 +302,18 @@
goto err_add_fb;
fb->map = mmap(0, fb->size, PROT_WRITE,
- MAP_SHARED, ec->drm.fd, map_arg.offset);
+ MAP_SHARED, b->drm.fd, map_arg.offset);
if (fb->map == MAP_FAILED)
goto err_add_fb;
return fb;
err_add_fb:
- drmModeRmFB(ec->drm.fd, fb->fb_id);
+ drmModeRmFB(b->drm.fd, fb->fb_id);
err_bo:
memset(&destroy_arg, 0, sizeof(destroy_arg));
destroy_arg.handle = create_arg.handle;
- drmIoctl(ec->drm.fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_arg);
+ drmIoctl(b->drm.fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_arg);
err_fb:
free(fb);
return NULL;
@@ -342,7 +343,7 @@
static struct drm_fb *
drm_fb_get_from_bo(struct gbm_bo *bo,
- struct drm_compositor *compositor, uint32_t format)
+ struct drm_backend *backend, uint32_t format)
{
struct drm_fb *fb = gbm_bo_get_user_data(bo);
uint32_t width, height;
@@ -363,34 +364,34 @@
fb->stride = gbm_bo_get_stride(bo);
fb->handle = gbm_bo_get_handle(bo).u32;
fb->size = fb->stride * height;
- fb->fd = compositor->drm.fd;
+ fb->fd = backend->drm.fd;
- if (compositor->min_width > width || width > compositor->max_width ||
- compositor->min_height > height ||
- height > compositor->max_height) {
+ if (backend->min_width > width || width > backend->max_width ||
+ backend->min_height > height ||
+ height > backend->max_height) {
weston_log("bo geometry out of bounds\n");
goto err_free;
}
ret = -1;
- if (format && !compositor->no_addfb2) {
+ if (format && !backend->no_addfb2) {
handles[0] = fb->handle;
pitches[0] = fb->stride;
offsets[0] = 0;
- ret = drmModeAddFB2(compositor->drm.fd, width, height,
+ ret = drmModeAddFB2(backend->drm.fd, width, height,
format, handles, pitches, offsets,
&fb->fb_id, 0);
if (ret) {
weston_log("addfb2 failed: %m\n");
- compositor->no_addfb2 = 1;
- compositor->sprites_are_broken = 1;
+ backend->no_addfb2 = 1;
+ backend->sprites_are_broken = 1;
}
}
if (ret)
- ret = drmModeAddFB(compositor->drm.fd, width, height, 24, 32,
+ ret = drmModeAddFB(backend->drm.fd, width, height, 24, 32,
fb->stride, fb->handle, &fb->fb_id);
if (ret) {
@@ -469,8 +470,8 @@
drm_output_prepare_scanout_view(struct drm_output *output,
struct weston_view *ev)
{
- struct drm_compositor *c =
- (struct drm_compositor *) output->base.compositor;
+ struct drm_backend *b =
+ (struct drm_backend *)output->base.compositor->backend;
struct weston_buffer *buffer = ev->surface->buffer_ref.buffer;
struct weston_buffer_viewport *viewport = &ev->surface->buffer_viewport;
struct gbm_bo *bo;
@@ -478,7 +479,7 @@
if (ev->geometry.x != output->base.x ||
ev->geometry.y != output->base.y ||
- buffer == NULL || c->gbm == NULL ||
+ buffer == NULL || b->gbm == NULL ||
buffer->width != output->base.current_mode->width ||
buffer->height != output->base.current_mode->height ||
output->base.transform != viewport->buffer.transform ||
@@ -488,7 +489,7 @@
if (ev->geometry.scissor_enabled)
return NULL;
- bo = gbm_bo_import(c->gbm, GBM_BO_IMPORT_WL_BUFFER,
+ bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_WL_BUFFER,
buffer->resource, GBM_BO_USE_SCANOUT);
/* Unable to use the buffer for scanout */
@@ -501,7 +502,7 @@
return NULL;
}
- output->next = drm_fb_get_from_bo(bo, c, format);
+ output->next = drm_fb_get_from_bo(bo, b, format);
if (!output->next) {
gbm_bo_destroy(bo);
return NULL;
@@ -515,11 +516,12 @@
static void
drm_output_render_gl(struct drm_output *output, pixman_region32_t *damage)
{
- struct drm_compositor *c =
- (struct drm_compositor *) output->base.compositor;
+ struct drm_backend *b =
+ (struct drm_backend *)output->base.compositor->backend;
struct gbm_bo *bo;
- c->base.renderer->repaint_output(&output->base, damage);
+ output->base.compositor->renderer->repaint_output(&output->base,
+ damage);
bo = gbm_surface_lock_front_buffer(output->surface);
if (!bo) {
@@ -527,7 +529,7 @@
return;
}
- output->next = drm_fb_get_from_bo(bo, c, output->format);
+ output->next = drm_fb_get_from_bo(bo, b, output->format);
if (!output->next) {
weston_log("failed to get drm_fb for bo\n");
gbm_surface_release_buffer(output->surface, bo);
@@ -564,16 +566,16 @@
static void
drm_output_render(struct drm_output *output, pixman_region32_t *damage)
{
- struct drm_compositor *c =
- (struct drm_compositor *) output->base.compositor;
+ struct weston_compositor *c = output->base.compositor;
+ struct drm_backend *b = (struct drm_backend *)c->backend;
- if (c->use_pixman)
+ if (b->use_pixman)
drm_output_render_pixman(output, damage);
else
drm_output_render_gl(output, damage);
- pixman_region32_subtract(&c->base.primary_plane.damage,
- &c->base.primary_plane.damage, damage);
+ pixman_region32_subtract(&c->primary_plane.damage,
+ &c->primary_plane.damage, damage);
}
static void
@@ -582,7 +584,8 @@
{
int rc;
struct drm_output *output = (struct drm_output *) output_base;
- struct drm_compositor *compositor = (struct drm_compositor *) output->base.compositor;
+ struct drm_backend *backend =
+ (struct drm_backend *) output->base.compositor->backend;
/* check */
if (output_base->gamma_size != size)
@@ -590,7 +593,7 @@
if (!output->original_crtc)
return;
- rc = drmModeCrtcSetGamma(compositor->drm.fd,
+ rc = drmModeCrtcSetGamma(backend->drm.fd,
output->crtc_id,
size, r, g, b);
if (rc)
@@ -627,8 +630,8 @@
pixman_region32_t *damage)
{
struct drm_output *output = (struct drm_output *) output_base;
- struct drm_compositor *compositor =
- (struct drm_compositor *) output->base.compositor;
+ struct drm_backend *backend =
+ (struct drm_backend *)output->base.compositor->backend;
struct drm_sprite *s;
struct drm_mode *mode;
int ret = 0;
@@ -644,7 +647,7 @@
mode = container_of(output->base.current_mode, struct drm_mode, base);
if (!output->current ||
output->current->stride != output->next->stride) {
- ret = drmModeSetCrtc(compositor->drm.fd, output->crtc_id,
+ ret = drmModeSetCrtc(backend->drm.fd, output->crtc_id,
output->next->fb_id, 0, 0,
&output->connector_id, 1,
&mode->mode_info);
@@ -655,7 +658,7 @@
output_base->set_dpms(output_base, WESTON_DPMS_ON);
}
- if (drmModePageFlip(compositor->drm.fd, output->crtc_id,
+ if (drmModePageFlip(backend->drm.fd, output->crtc_id,
output->next->fb_id,
DRM_MODE_PAGE_FLIP_EVENT, output) < 0) {
weston_log("queueing pageflip failed: %m\n");
@@ -669,7 +672,7 @@
/*
* Now, update all the sprite surfaces
*/
- wl_list_for_each(s, &compositor->sprite_list, link) {
+ wl_list_for_each(s, &backend->sprite_list, link) {
uint32_t flags = 0, fb_id = 0;
drmVBlank vbl = {
.request.type = DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT,
@@ -680,10 +683,10 @@
!drm_sprite_crtc_supported(output, s->possible_crtcs))
continue;
- if (s->next && !compositor->sprites_hidden)
+ if (s->next && !backend->sprites_hidden)
fb_id = s->next->fb_id;
- ret = drmModeSetPlane(compositor->drm.fd, s->plane_id,
+ ret = drmModeSetPlane(backend->drm.fd, s->plane_id,
output->crtc_id, fb_id, flags,
s->dest_x, s->dest_y,
s->dest_w, s->dest_h,
@@ -700,7 +703,7 @@
* becomes active on the display or has been replaced.
*/
vbl.request.signal = (unsigned long)s;
- ret = drmWaitVBlank(compositor->drm.fd, &vbl);
+ ret = drmWaitVBlank(backend->drm.fd, &vbl);
if (ret) {
weston_log("vblank event request failed: %d: %s\n",
ret, strerror(errno));
@@ -726,8 +729,8 @@
drm_output_start_repaint_loop(struct weston_output *output_base)
{
struct drm_output *output = (struct drm_output *) output_base;
- struct drm_compositor *compositor = (struct drm_compositor *)
- output_base->compositor;
+ struct drm_backend *backend = (struct drm_backend *)
+ output_base->compositor->backend;
uint32_t fb_id;
struct timespec ts;
@@ -741,7 +744,7 @@
fb_id = output->current->fb_id;
- if (drmModePageFlip(compositor->drm.fd, output->crtc_id, fb_id,
+ if (drmModePageFlip(backend->drm.fd, output->crtc_id, fb_id,
DRM_MODE_PAGE_FLIP_EVENT, output) < 0) {
weston_log("queueing pageflip failed: %m\n");
goto finish_frame;
@@ -751,7 +754,7 @@
finish_frame:
/* if we cannot page-flip, immediately finish frame */
- weston_compositor_read_presentation_clock(&compositor->base, &ts);
+ weston_compositor_read_presentation_clock(output_base->compositor, &ts);
weston_output_finish_frame(output_base, &ts,
PRESENTATION_FEEDBACK_INVALID);
}
@@ -872,7 +875,7 @@
struct weston_view *ev)
{
struct weston_compositor *ec = output->base.compositor;
- struct drm_compositor *c = (struct drm_compositor *)ec;
+ struct drm_backend *b = (struct drm_backend *)ec->backend;
struct weston_buffer_viewport *viewport = &ev->surface->buffer_viewport;
struct drm_sprite *s;
int found = 0;
@@ -882,7 +885,7 @@
uint32_t format;
wl_fixed_t sx1, sy1, sx2, sy2;
- if (c->gbm == NULL)
+ if (b->gbm == NULL)
return NULL;
if (viewport->buffer.transform != output->base.transform)
@@ -891,7 +894,7 @@
if (viewport->buffer.scale != output->base.current_scale)
return NULL;
- if (c->sprites_are_broken)
+ if (b->sprites_are_broken)
return NULL;
if (ev->output_mask != (1u << output->base.id))
@@ -909,7 +912,7 @@
if (!drm_view_transform_supported(ev))
return NULL;
- wl_list_for_each(s, &c->sprite_list, link) {
+ wl_list_for_each(s, &b->sprite_list, link) {
if (!drm_sprite_crtc_supported(output, s->possible_crtcs))
continue;
@@ -923,7 +926,7 @@
if (!found)
return NULL;
- bo = gbm_bo_import(c->gbm, GBM_BO_IMPORT_WL_BUFFER,
+ bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_WL_BUFFER,
ev->surface->buffer_ref.buffer->resource,
GBM_BO_USE_SCANOUT);
if (!bo)
@@ -935,7 +938,7 @@
return NULL;
}
- s->next = drm_fb_get_from_bo(bo, c, format);
+ s->next = drm_fb_get_from_bo(bo, b, format);
if (!s->next) {
gbm_bo_destroy(bo);
return NULL;
@@ -1015,11 +1018,11 @@
drm_output_prepare_cursor_view(struct drm_output *output,
struct weston_view *ev)
{
- struct drm_compositor *c =
- (struct drm_compositor *)output->base.compositor;
+ struct drm_backend *b =
+ (struct drm_backend *)output->base.compositor->backend;
struct weston_buffer_viewport *viewport = &ev->surface->buffer_viewport;
- if (c->gbm == NULL)
+ if (b->gbm == NULL)
return NULL;
if (output->base.transform != WL_OUTPUT_TRANSFORM_NORMAL)
return NULL;
@@ -1029,7 +1032,7 @@
return NULL;
if (ev->output_mask != (1u << output->base.id))
return NULL;
- if (c->cursors_are_broken)
+ if (b->cursors_are_broken)
return NULL;
if (ev->geometry.scissor_enabled)
return NULL;
@@ -1048,17 +1051,17 @@
{
struct weston_view *ev = output->cursor_view;
struct weston_buffer *buffer;
- struct drm_compositor *c =
- (struct drm_compositor *) output->base.compositor;
+ struct drm_backend *b =
+ (struct drm_backend *) output->base.compositor->backend;
EGLint handle, stride;
struct gbm_bo *bo;
- uint32_t buf[c->cursor_width * c->cursor_height];
+ uint32_t buf[b->cursor_width * b->cursor_height];
unsigned char *s;
int i, x, y;
output->cursor_view = NULL;
if (ev == NULL) {
- drmModeSetCursor(c->drm.fd, output->crtc_id, 0, 0, 0);
+ drmModeSetCursor(b->drm.fd, output->crtc_id, 0, 0, 0);
return;
}
@@ -1075,7 +1078,7 @@
s = wl_shm_buffer_get_data(buffer->shm_buffer);
wl_shm_buffer_begin_access(buffer->shm_buffer);
for (i = 0; i < ev->surface->height; i++)
- memcpy(buf + i * c->cursor_width, s + i * stride,
+ memcpy(buf + i * b->cursor_width, s + i * stride,
ev->surface->width * 4);
wl_shm_buffer_end_access(buffer->shm_buffer);
@@ -1083,19 +1086,19 @@
weston_log("failed update cursor: %m\n");
handle = gbm_bo_get_handle(bo).s32;
- if (drmModeSetCursor(c->drm.fd, output->crtc_id, handle,
- c->cursor_width, c->cursor_height)) {
+ if (drmModeSetCursor(b->drm.fd, output->crtc_id, handle,
+ b->cursor_width, b->cursor_height)) {
weston_log("failed to set cursor: %m\n");
- c->cursors_are_broken = 1;
+ b->cursors_are_broken = 1;
}
}
x = (ev->geometry.x - output->base.x) * output->base.current_scale;
y = (ev->geometry.y - output->base.y) * output->base.current_scale;
if (output->cursor_plane.x != x || output->cursor_plane.y != y) {
- if (drmModeMoveCursor(c->drm.fd, output->crtc_id, x, y)) {
+ if (drmModeMoveCursor(b->drm.fd, output->crtc_id, x, y)) {
weston_log("failed to move cursor: %m\n");
- c->cursors_are_broken = 1;
+ b->cursors_are_broken = 1;
}
output->cursor_plane.x = x;
@@ -1106,8 +1109,8 @@
static void
drm_assign_planes(struct weston_output *output_base)
{
- struct drm_compositor *c =
- (struct drm_compositor *)output_base->compositor;
+ struct drm_backend *b =
+ (struct drm_backend *)output_base->compositor->backend;
struct drm_output *output = (struct drm_output *)output_base;
struct weston_view *ev, *next;
pixman_region32_t overlap, surface_overlap;
@@ -1127,9 +1130,9 @@
* as we do for flipping full screen surfaces.
*/
pixman_region32_init(&overlap);
- primary = &c->base.primary_plane;
+ primary = &output_base->compositor->primary_plane;
- wl_list_for_each_safe(ev, next, &c->base.view_list, link) {
+ wl_list_for_each_safe(ev, next, &output_base->compositor->view_list, link) {
struct weston_surface *es = ev->surface;
/* Test whether this buffer can ever go into a plane:
@@ -1140,7 +1143,7 @@
* renderer and since the pixman renderer keeps a reference
* to the buffer anyway, there is no side effects.
*/
- if (c->use_pixman ||
+ if (b->use_pixman ||
(es->buffer_ref.buffer &&
(!wl_shm_buffer_get(es->buffer_ref.buffer->resource) ||
(ev->surface->width <= 64 && ev->surface->height <= 64))))
@@ -1193,8 +1196,8 @@
drm_output_destroy(struct weston_output *output_base)
{
struct drm_output *output = (struct drm_output *) output_base;
- struct drm_compositor *c =
- (struct drm_compositor *) output->base.compositor;
+ struct drm_backend *b =
+ (struct drm_backend *)output->base.compositor->backend;
drmModeCrtcPtr origcrtc = output->original_crtc;
if (output->page_flip_pending) {
@@ -1209,18 +1212,18 @@
drmModeFreeProperty(output->dpms_prop);
/* Turn off hardware cursor */
- drmModeSetCursor(c->drm.fd, output->crtc_id, 0, 0, 0);
+ drmModeSetCursor(b->drm.fd, output->crtc_id, 0, 0, 0);
/* Restore original CRTC state */
- drmModeSetCrtc(c->drm.fd, origcrtc->crtc_id, origcrtc->buffer_id,
+ drmModeSetCrtc(b->drm.fd, origcrtc->crtc_id, origcrtc->buffer_id,
origcrtc->x, origcrtc->y,
&output->connector_id, 1, &origcrtc->mode);
drmModeFreeCrtc(origcrtc);
- c->crtc_allocator &= ~(1 << output->crtc_id);
- c->connector_allocator &= ~(1 << output->connector_id);
+ b->crtc_allocator &= ~(1 << output->crtc_id);
+ b->connector_allocator &= ~(1 << output->connector_id);
- if (c->use_pixman) {
+ if (b->use_pixman) {
drm_output_fini_pixman(output);
} else {
gl_renderer->output_destroy(output_base);
@@ -1261,16 +1264,16 @@
}
static int
-drm_output_init_egl(struct drm_output *output, struct drm_compositor *ec);
+drm_output_init_egl(struct drm_output *output, struct drm_backend *b);
static int
-drm_output_init_pixman(struct drm_output *output, struct drm_compositor *c);
+drm_output_init_pixman(struct drm_output *output, struct drm_backend *b);
static int
drm_output_switch_mode(struct weston_output *output_base, struct weston_mode *mode)
{
struct drm_output *output;
struct drm_mode *drm_mode;
- struct drm_compositor *ec;
+ struct drm_backend *b;
if (output_base == NULL) {
weston_log("output is NULL.\n");
@@ -1282,7 +1285,7 @@
return -1;
}
- ec = (struct drm_compositor *)output_base->compositor;
+ b = (struct drm_backend *)output_base->compositor->backend;
output = (struct drm_output *)output_base;
drm_mode = choose_mode (output, mode);
@@ -1305,9 +1308,9 @@
drm_output_release_fb(output, output->next);
output->current = output->next = NULL;
- if (ec->use_pixman) {
+ if (b->use_pixman) {
drm_output_fini_pixman(output);
- if (drm_output_init_pixman(output, ec) < 0) {
+ if (drm_output_init_pixman(output, b) < 0) {
weston_log("failed to init output pixman state with "
"new mode\n");
return -1;
@@ -1316,7 +1319,7 @@
gl_renderer->output_destroy(&output->base);
gbm_surface_destroy(output->surface);
- if (drm_output_init_egl(output, ec) < 0) {
+ if (drm_output_init_egl(output, b) < 0) {
weston_log("failed to init output egl state with "
"new mode");
return -1;
@@ -1341,7 +1344,7 @@
}
static int
-init_drm(struct drm_compositor *ec, struct udev_device *device)
+init_drm(struct drm_backend *b, struct udev_device *device)
{
const char *filename, *sysnum;
uint64_t cap;
@@ -1350,14 +1353,14 @@
sysnum = udev_device_get_sysnum(device);
if (sysnum)
- ec->drm.id = atoi(sysnum);
- if (!sysnum || ec->drm.id < 0) {
+ b->drm.id = atoi(sysnum);
+ if (!sysnum || b->drm.id < 0) {
weston_log("cannot get device sysnum\n");
return -1;
}
filename = udev_device_get_devnode(device);
- fd = weston_launcher_open(ec->base.launcher, filename, O_RDWR);
+ fd = weston_launcher_open(b->compositor->launcher, filename, O_RDWR);
if (fd < 0) {
/* Probably permissions error */
weston_log("couldn't open %s, skipping\n",
@@ -1367,8 +1370,8 @@
weston_log("using %s\n", filename);
- ec->drm.fd = fd;
- ec->drm.filename = strdup(filename);
+ b->drm.fd = fd;
+ b->drm.filename = strdup(filename);
ret = drmGetCap(fd, DRM_CAP_TIMESTAMP_MONOTONIC, &cap);
if (ret == 0 && cap == 1)
@@ -1376,7 +1379,7 @@
else
clk_id = CLOCK_REALTIME;
- if (weston_compositor_set_presentation_clock(&ec->base, clk_id) < 0) {
+ if (weston_compositor_set_presentation_clock(b->compositor, clk_id) < 0) {
weston_log("Error: failed to set presentation clock %d.\n",
clk_id);
return -1;
@@ -1384,15 +1387,15 @@
ret = drmGetCap(fd, DRM_CAP_CURSOR_WIDTH, &cap);
if (ret == 0)
- ec->cursor_width = cap;
+ b->cursor_width = cap;
else
- ec->cursor_width = 64;
+ b->cursor_width = 64;
ret = drmGetCap(fd, DRM_CAP_CURSOR_HEIGHT, &cap);
if (ret == 0)
- ec->cursor_height = cap;
+ b->cursor_height = cap;
else
- ec->cursor_height = 64;
+ b->cursor_height = 64;
return 0;
}
@@ -1443,19 +1446,19 @@
}
static int
-drm_compositor_create_gl_renderer(struct drm_compositor *ec)
+drm_backend_create_gl_renderer(struct drm_backend *b)
{
EGLint format[2] = {
- ec->format,
- fallback_format_for(ec->format),
+ b->format,
+ fallback_format_for(b->format),
};
int n_formats = 1;
if (format[1])
n_formats = 2;
- if (gl_renderer->create(&ec->base,
+ if (gl_renderer->create(b->compositor,
EGL_PLATFORM_GBM_KHR,
- (void *)ec->gbm,
+ (void *)b->gbm,
gl_renderer->opaque_attribs,
format,
n_formats) < 0) {
@@ -1466,15 +1469,15 @@
}
static int
-init_egl(struct drm_compositor *ec)
+init_egl(struct drm_backend *b)
{
- ec->gbm = create_gbm_device(ec->drm.fd);
+ b->gbm = create_gbm_device(b->drm.fd);
- if (!ec->gbm)
+ if (!b->gbm)
return -1;
- if (drm_compositor_create_gl_renderer(ec) < 0) {
- gbm_device_destroy(ec->gbm);
+ if (drm_backend_create_gl_renderer(b) < 0) {
+ gbm_device_destroy(b->gbm);
return -1;
}
@@ -1482,9 +1485,9 @@
}
static int
-init_pixman(struct drm_compositor *ec)
+init_pixman(struct drm_backend *b)
{
- return pixman_renderer_init(&ec->base);
+ return pixman_renderer_init(b->compositor);
}
static struct drm_mode *
@@ -1604,12 +1607,12 @@
{
struct drm_output *output = (struct drm_output *) output_base;
struct weston_compositor *ec = output_base->compositor;
- struct drm_compositor *c = (struct drm_compositor *) ec;
+ struct drm_backend *b = (struct drm_backend *)ec->backend;
if (!output->dpms_prop)
return;
- drmModeConnectorSetProperty(c->drm.fd, output->connector_id,
+ drmModeConnectorSetProperty(b->drm.fd, output->connector_id,
output->dpms_prop->prop_id, level);
}
@@ -1632,7 +1635,7 @@
};
static int
-find_crtc_for_connector(struct drm_compositor *ec,
+find_crtc_for_connector(struct drm_backend *b,
drmModeRes *resources, drmModeConnector *connector)
{
drmModeEncoder *encoder;
@@ -1640,7 +1643,7 @@
int i, j;
for (j = 0; j < connector->count_encoders; j++) {
- encoder = drmModeGetEncoder(ec->drm.fd, connector->encoders[j]);
+ encoder = drmModeGetEncoder(b->drm.fd, connector->encoders[j]);
if (encoder == NULL) {
weston_log("Failed to get encoder.\n");
return -1;
@@ -1650,7 +1653,7 @@
for (i = 0; i < resources->count_crtcs; i++) {
if (possible_crtcs & (1 << i) &&
- !(ec->crtc_allocator & (1 << resources->crtcs[i])))
+ !(b->crtc_allocator & (1 << resources->crtcs[i])))
return i;
}
}
@@ -1660,7 +1663,7 @@
/* Init output state that depends on gl or gbm */
static int
-drm_output_init_egl(struct drm_output *output, struct drm_compositor *ec)
+drm_output_init_egl(struct drm_output *output, struct drm_backend *b)
{
EGLint format[2] = {
output->format,
@@ -1668,7 +1671,7 @@
};
int i, flags, n_formats = 1;
- output->surface = gbm_surface_create(ec->gbm,
+ output->surface = gbm_surface_create(b->gbm,
output->base.current_mode->width,
output->base.current_mode->height,
format[0],
@@ -1699,20 +1702,20 @@
continue;
output->cursor_bo[i] =
- gbm_bo_create(ec->gbm, ec->cursor_width, ec->cursor_height,
+ gbm_bo_create(b->gbm, b->cursor_width, b->cursor_height,
GBM_FORMAT_ARGB8888, flags);
}
if (output->cursor_bo[0] == NULL || output->cursor_bo[1] == NULL) {
weston_log("cursor buffers unavailable, using gl cursors\n");
- ec->cursors_are_broken = 1;
+ b->cursors_are_broken = 1;
}
return 0;
}
static int
-drm_output_init_pixman(struct drm_output *output, struct drm_compositor *c)
+drm_output_init_pixman(struct drm_output *output, struct drm_backend *b)
{
int w = output->base.current_mode->width;
int h = output->base.current_mode->height;
@@ -1721,7 +1724,7 @@
/* FIXME error checking */
for (i = 0; i < ARRAY_LENGTH(output->dumb); i++) {
- output->dumb[i] = drm_fb_create_dumb(c, w, h);
+ output->dumb[i] = drm_fb_create_dumb(b, w, h);
if (!output->dumb[i])
goto err;
@@ -1867,7 +1870,7 @@
}
static void
-find_and_parse_output_edid(struct drm_compositor *ec,
+find_and_parse_output_edid(struct drm_backend *b,
struct drm_output *output,
drmModeConnector *connector)
{
@@ -1877,12 +1880,12 @@
int rc;
for (i = 0; i < connector->count_props && !edid_blob; i++) {
- property = drmModeGetProperty(ec->drm.fd, connector->props[i]);
+ property = drmModeGetProperty(b->drm.fd, connector->props[i]);
if (!property)
continue;
if ((property->flags & DRM_MODE_PROP_BLOB) &&
!strcmp(property->name, "EDID")) {
- edid_blob = drmModeGetPropertyBlob(ec->drm.fd,
+ edid_blob = drmModeGetPropertyBlob(b->drm.fd,
connector->prop_values[i]);
}
drmModeFreeProperty(property);
@@ -1954,14 +1957,14 @@
}
static void
-setup_output_seat_constraint(struct drm_compositor *ec,
+setup_output_seat_constraint(struct drm_backend *b,
struct weston_output *output,
const char *s)
{
if (strcmp(s, "") != 0) {
struct udev_seat *seat;
- seat = udev_seat_get_named(&ec->input, s);
+ seat = udev_seat_get_named(&b->input, s);
if (seat)
seat->base.output = output;
@@ -2002,7 +2005,7 @@
}
static int
-create_output_for_connector(struct drm_compositor *ec,
+create_output_for_connector(struct drm_backend *b,
drmModeRes *resources,
drmModeConnector *connector,
int x, int y, struct udev_device *drm_device)
@@ -2020,7 +2023,7 @@
enum output_config config;
uint32_t transform;
- i = find_crtc_for_connector(ec, resources, connector);
+ i = find_crtc_for_connector(b, resources, connector);
if (i < 0) {
weston_log("No usable crtc/encoder pair for connector.\n");
return -1;
@@ -2043,7 +2046,7 @@
snprintf(name, 32, "%s%d", type_name, connector->connector_type_id);
output->base.name = strdup(name);
- section = weston_config_get_section(ec->base.config, "output", "name",
+ section = weston_config_get_section(b->compositor->config, "output", "name",
output->base.name);
weston_config_section_get_string(section, "mode", &s, "preferred");
if (strcmp(s, "off") == 0)
@@ -2072,29 +2075,29 @@
free(s);
if (get_gbm_format_from_section(section,
- ec->format,
+ b->format,
&output->format) == -1)
- output->format = ec->format;
+ output->format = b->format;
weston_config_section_get_string(section, "seat", &s, "");
- setup_output_seat_constraint(ec, &output->base, s);
+ setup_output_seat_constraint(b, &output->base, s);
free(s);
output->crtc_id = resources->crtcs[i];
output->pipe = i;
- ec->crtc_allocator |= (1 << output->crtc_id);
+ b->crtc_allocator |= (1 << output->crtc_id);
output->connector_id = connector->connector_id;
- ec->connector_allocator |= (1 << output->connector_id);
+ b->connector_allocator |= (1 << output->connector_id);
- output->original_crtc = drmModeGetCrtc(ec->drm.fd, output->crtc_id);
- output->dpms_prop = drm_get_prop(ec->drm.fd, connector, "DPMS");
+ output->original_crtc = drmModeGetCrtc(b->drm.fd, output->crtc_id);
+ output->dpms_prop = drm_get_prop(b->drm.fd, connector, "DPMS");
/* Get the current mode on the crtc that's currently driving
* this connector. */
- encoder = drmModeGetEncoder(ec->drm.fd, connector->encoder_id);
+ encoder = drmModeGetEncoder(b->drm.fd, connector->encoder_id);
memset(&crtc_mode, 0, sizeof crtc_mode);
if (encoder != NULL) {
- crtc = drmModeGetCrtc(ec->drm.fd, encoder->crtc_id);
+ crtc = drmModeGetCrtc(b->drm.fd, encoder->crtc_id);
drmModeFreeEncoder(encoder);
if (crtc == NULL)
goto err_free;
@@ -2111,7 +2114,7 @@
if (config == OUTPUT_CONFIG_OFF) {
weston_log("Disabling output %s\n", output->base.name);
- drmModeSetCrtc(ec->drm.fd, output->crtc_id,
+ drmModeSetCrtc(b->drm.fd, output->crtc_id,
0, 0, 0, 0, 0, NULL);
goto err_free;
}
@@ -2166,16 +2169,16 @@
output->base.current_mode->flags |= WL_OUTPUT_MODE_CURRENT;
- weston_output_init(&output->base, &ec->base, x, y,
+ weston_output_init(&output->base, b->compositor, x, y,
connector->mmWidth, connector->mmHeight,
transform, scale);
- if (ec->use_pixman) {
- if (drm_output_init_pixman(output, ec) < 0) {
+ if (b->use_pixman) {
+ if (drm_output_init_pixman(output, b) < 0) {
weston_log("Failed to init output pixman state\n");
goto err_output;
}
- } else if (drm_output_init_egl(output, ec) < 0) {
+ } else if (drm_output_init_egl(output, b) < 0) {
weston_log("Failed to init output gl state\n");
goto err_output;
}
@@ -2191,9 +2194,9 @@
weston_log("Failed to initialize backlight\n");
}
- weston_compositor_add_output(&ec->base, &output->base);
+ weston_compositor_add_output(b->compositor, &output->base);
- find_and_parse_output_edid(ec, output, connector);
+ find_and_parse_output_edid(b, output, connector);
if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
output->base.connection_internal = 1;
@@ -2207,12 +2210,12 @@
output->base.gamma_size = output->original_crtc->gamma_size;
output->base.set_gamma = drm_output_set_gamma;
- weston_plane_init(&output->cursor_plane, &ec->base, 0, 0);
- weston_plane_init(&output->fb_plane, &ec->base, 0, 0);
+ weston_plane_init(&output->cursor_plane, b->compositor, 0, 0);
+ weston_plane_init(&output->fb_plane, b->compositor, 0, 0);
- weston_compositor_stack_plane(&ec->base, &output->cursor_plane, NULL);
- weston_compositor_stack_plane(&ec->base, &output->fb_plane,
- &ec->base.primary_plane);
+ weston_compositor_stack_plane(b->compositor, &output->cursor_plane, NULL);
+ weston_compositor_stack_plane(b->compositor, &output->fb_plane,
+ &b->compositor->primary_plane);
weston_log("Output %s, (connector %d, crtc %d)\n",
output->base.name, output->connector_id, output->crtc_id);
@@ -2242,22 +2245,22 @@
}
drmModeFreeCrtc(output->original_crtc);
- ec->crtc_allocator &= ~(1 << output->crtc_id);
- ec->connector_allocator &= ~(1 << output->connector_id);
+ b->crtc_allocator &= ~(1 << output->crtc_id);
+ b->connector_allocator &= ~(1 << output->connector_id);
free(output);
return -1;
}
static void
-create_sprites(struct drm_compositor *ec)
+create_sprites(struct drm_backend *b)
{
struct drm_sprite *sprite;
drmModePlaneRes *plane_res;
drmModePlane *plane;
uint32_t i;
- plane_res = drmModeGetPlaneResources(ec->drm.fd);
+ plane_res = drmModeGetPlaneResources(b->drm.fd);
if (!plane_res) {
weston_log("failed to get plane resources: %s\n",
strerror(errno));
@@ -2265,7 +2268,7 @@
}
for (i = 0; i < plane_res->count_planes; i++) {
- plane = drmModeGetPlane(ec->drm.fd, plane_res->planes[i]);
+ plane = drmModeGetPlane(b->drm.fd, plane_res->planes[i]);
if (!plane)
continue;
@@ -2282,32 +2285,32 @@
sprite->plane_id = plane->plane_id;
sprite->current = NULL;
sprite->next = NULL;
- sprite->compositor = ec;
+ sprite->backend = b;
sprite->count_formats = plane->count_formats;
memcpy(sprite->formats, plane->formats,
plane->count_formats * sizeof(plane->formats[0]));
drmModeFreePlane(plane);
- weston_plane_init(&sprite->plane, &ec->base, 0, 0);
- weston_compositor_stack_plane(&ec->base, &sprite->plane,
- &ec->base.primary_plane);
+ weston_plane_init(&sprite->plane, b->compositor, 0, 0);
+ weston_compositor_stack_plane(b->compositor, &sprite->plane,
+ &b->compositor->primary_plane);
- wl_list_insert(&ec->sprite_list, &sprite->link);
+ wl_list_insert(&b->sprite_list, &sprite->link);
}
drmModeFreePlaneResources(plane_res);
}
static void
-destroy_sprites(struct drm_compositor *compositor)
+destroy_sprites(struct drm_backend *backend)
{
struct drm_sprite *sprite, *next;
struct drm_output *output;
- output = container_of(compositor->base.output_list.next,
+ output = container_of(backend->compositor->output_list.next,
struct drm_output, base.link);
- wl_list_for_each_safe(sprite, next, &compositor->sprite_list, link) {
- drmModeSetPlane(compositor->drm.fd,
+ wl_list_for_each_safe(sprite, next, &backend->sprite_list, link) {
+ drmModeSetPlane(backend->drm.fd,
sprite->plane_id,
output->crtc_id, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0);
@@ -2319,7 +2322,7 @@
}
static int
-create_outputs(struct drm_compositor *ec, uint32_t option_connector,
+create_outputs(struct drm_backend *b, uint32_t option_connector,
struct udev_device *drm_device)
{
drmModeConnector *connector;
@@ -2327,28 +2330,28 @@
int i;
int x = 0, y = 0;
- resources = drmModeGetResources(ec->drm.fd);
+ resources = drmModeGetResources(b->drm.fd);
if (!resources) {
weston_log("drmModeGetResources failed\n");
return -1;
}
- ec->crtcs = calloc(resources->count_crtcs, sizeof(uint32_t));
- if (!ec->crtcs) {
+ b->crtcs = calloc(resources->count_crtcs, sizeof(uint32_t));
+ if (!b->crtcs) {
drmModeFreeResources(resources);
return -1;
}
- ec->min_width = resources->min_width;
- ec->max_width = resources->max_width;
- ec->min_height = resources->min_height;
- ec->max_height = resources->max_height;
+ b->min_width = resources->min_width;
+ b->max_width = resources->max_width;
+ b->min_height = resources->min_height;
+ b->max_height = resources->max_height;
- ec->num_crtcs = resources->count_crtcs;
- memcpy(ec->crtcs, resources->crtcs, sizeof(uint32_t) * ec->num_crtcs);
+ b->num_crtcs = resources->count_crtcs;
+ memcpy(b->crtcs, resources->crtcs, sizeof(uint32_t) * b->num_crtcs);
for (i = 0; i < resources->count_connectors; i++) {
- connector = drmModeGetConnector(ec->drm.fd,
+ connector = drmModeGetConnector(b->drm.fd,
resources->connectors[i]);
if (connector == NULL)
continue;
@@ -2356,14 +2359,14 @@
if (connector->connection == DRM_MODE_CONNECTED &&
(option_connector == 0 ||
connector->connector_id == option_connector)) {
- if (create_output_for_connector(ec, resources,
+ if (create_output_for_connector(b, resources,
connector, x, y,
drm_device) < 0) {
drmModeFreeConnector(connector);
continue;
}
- x += container_of(ec->base.output_list.prev,
+ x += container_of(b->compositor->output_list.prev,
struct weston_output,
link)->width;
}
@@ -2371,7 +2374,7 @@
drmModeFreeConnector(connector);
}
- if (wl_list_empty(&ec->base.output_list)) {
+ if (wl_list_empty(&b->compositor->output_list)) {
weston_log("No currently active connector found.\n");
drmModeFreeResources(resources);
return -1;
@@ -2383,7 +2386,7 @@
}
static void
-update_outputs(struct drm_compositor *ec, struct udev_device *drm_device)
+update_outputs(struct drm_backend *b, struct udev_device *drm_device)
{
drmModeConnector *connector;
drmModeRes *resources;
@@ -2392,7 +2395,7 @@
uint32_t connected = 0, disconnects = 0;
int i;
- resources = drmModeGetResources(ec->drm.fd);
+ resources = drmModeGetResources(b->drm.fd);
if (!resources) {
weston_log("drmModeGetResources failed\n");
return;
@@ -2402,7 +2405,7 @@
for (i = 0; i < resources->count_connectors; i++) {
int connector_id = resources->connectors[i];
- connector = drmModeGetConnector(ec->drm.fd, connector_id);
+ connector = drmModeGetConnector(b->drm.fd, connector_id);
if (connector == NULL)
continue;
@@ -2413,18 +2416,18 @@
connected |= (1 << connector_id);
- if (!(ec->connector_allocator & (1 << connector_id))) {
+ if (!(b->connector_allocator & (1 << connector_id))) {
struct weston_output *last =
- container_of(ec->base.output_list.prev,
+ container_of(b->compositor->output_list.prev,
struct weston_output, link);
/* XXX: not yet needed, we die with 0 outputs */
- if (!wl_list_empty(&ec->base.output_list))
+ if (!wl_list_empty(&b->compositor->output_list))
x = last->x + last->width;
else
x = 0;
y = 0;
- create_output_for_connector(ec, resources,
+ create_output_for_connector(b, resources,
connector, x, y,
drm_device);
weston_log("connector %d connected\n", connector_id);
@@ -2434,9 +2437,9 @@
}
drmModeFreeResources(resources);
- disconnects = ec->connector_allocator & ~connected;
+ disconnects = b->connector_allocator & ~connected;
if (disconnects) {
- wl_list_for_each_safe(output, next, &ec->base.output_list,
+ wl_list_for_each_safe(output, next, &b->compositor->output_list,
base.link) {
if (disconnects & (1 << output->connector_id)) {
disconnects &= ~(1 << output->connector_id);
@@ -2448,18 +2451,18 @@
}
/* FIXME: handle zero outputs, without terminating */
- if (ec->connector_allocator == 0)
- wl_display_terminate(ec->base.wl_display);
+ if (b->connector_allocator == 0)
+ wl_display_terminate(b->compositor->wl_display);
}
static int
-udev_event_is_hotplug(struct drm_compositor *ec, struct udev_device *device)
+udev_event_is_hotplug(struct drm_backend *b, struct udev_device *device)
{
const char *sysnum;
const char *val;
sysnum = udev_device_get_sysnum(device);
- if (!sysnum || atoi(sysnum) != ec->drm.id)
+ if (!sysnum || atoi(sysnum) != b->drm.id)
return 0;
val = udev_device_get_property_value(device, "HOTPLUG");
@@ -2472,13 +2475,13 @@
static int
udev_drm_event(int fd, uint32_t mask, void *data)
{
- struct drm_compositor *ec = data;
+ struct drm_backend *b = data;
struct udev_device *event;
- event = udev_monitor_receive_device(ec->udev_monitor);
+ event = udev_monitor_receive_device(b->udev_monitor);
- if (udev_event_is_hotplug(ec, event))
- update_outputs(ec, event);
+ if (udev_event_is_hotplug(b, event))
+ update_outputs(b, event);
udev_device_unref(event);
@@ -2494,35 +2497,35 @@
static void
drm_destroy(struct weston_compositor *ec)
{
- struct drm_compositor *d = (struct drm_compositor *) ec;
+ struct drm_backend *b = (struct drm_backend *) ec->backend;
- udev_input_destroy(&d->input);
+ udev_input_destroy(&b->input);
- wl_event_source_remove(d->udev_drm_source);
- wl_event_source_remove(d->drm_source);
+ wl_event_source_remove(b->udev_drm_source);
+ wl_event_source_remove(b->drm_source);
- destroy_sprites(d);
+ destroy_sprites(b);
weston_compositor_shutdown(ec);
- if (d->gbm)
- gbm_device_destroy(d->gbm);
+ if (b->gbm)
+ gbm_device_destroy(b->gbm);
- weston_launcher_destroy(d->base.launcher);
+ weston_launcher_destroy(ec->launcher);
- close(d->drm.fd);
+ close(b->drm.fd);
- free(d);
+ free(b);
}
static void
-drm_compositor_set_modes(struct drm_compositor *compositor)
+drm_backend_set_modes(struct drm_backend *backend)
{
struct drm_output *output;
struct drm_mode *drm_mode;
int ret;
- wl_list_for_each(output, &compositor->base.output_list, base.link) {
+ wl_list_for_each(output, &backend->compositor->output_list, base.link) {
if (!output->current) {
/* If something that would cause the output to
* switch mode happened while in another vt, we
@@ -2534,7 +2537,7 @@
}
drm_mode = (struct drm_mode *) output->base.current_mode;
- ret = drmModeSetCrtc(compositor->drm.fd, output->crtc_id,
+ ret = drmModeSetCrtc(backend->drm.fd, output->crtc_id,
output->current->fb_id, 0, 0,
&output->connector_id, 1,
&drm_mode->mode_info);
@@ -2551,21 +2554,21 @@
session_notify(struct wl_listener *listener, void *data)
{
struct weston_compositor *compositor = data;
- struct drm_compositor *ec = data;
+ struct drm_backend *b = (struct drm_backend *)compositor->backend;
struct drm_sprite *sprite;
struct drm_output *output;
- if (ec->base.session_active) {
+ if (compositor->session_active) {
weston_log("activating session\n");
- compositor->state = ec->prev_state;
- drm_compositor_set_modes(ec);
+ compositor->state = b->prev_state;
+ drm_backend_set_modes(b);
weston_compositor_damage_all(compositor);
- udev_input_enable(&ec->input);
+ udev_input_enable(&b->input);
} else {
weston_log("deactivating session\n");
- udev_input_disable(&ec->input);
+ udev_input_disable(&b->input);
- ec->prev_state = compositor->state;
+ b->prev_state = compositor->state;
weston_compositor_offscreen(compositor);
/* If we have a repaint scheduled (either from a
@@ -2576,16 +2579,16 @@
* back, we schedule a repaint, which will process
* pending frame callbacks. */
- wl_list_for_each(output, &ec->base.output_list, base.link) {
+ wl_list_for_each(output, &compositor->output_list, base.link) {
output->base.repaint_needed = 0;
- drmModeSetCursor(ec->drm.fd, output->crtc_id, 0, 0, 0);
+ drmModeSetCursor(b->drm.fd, output->crtc_id, 0, 0, 0);
}
- output = container_of(ec->base.output_list.next,
+ output = container_of(compositor->output_list.next,
struct drm_output, base.link);
- wl_list_for_each(sprite, &ec->sprite_list, link)
- drmModeSetPlane(ec->drm.fd,
+ wl_list_for_each(sprite, &b->sprite_list, link)
+ drmModeSetPlane(b->drm.fd,
sprite->plane_id,
output->crtc_id, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0);
@@ -2608,14 +2611,14 @@
* If no such device is found, the first DRM device reported by udev is used.
*/
static struct udev_device*
-find_primary_gpu(struct drm_compositor *ec, const char *seat)
+find_primary_gpu(struct drm_backend *b, const char *seat)
{
struct udev_enumerate *e;
struct udev_list_entry *entry;
const char *path, *device_seat, *id;
struct udev_device *device, *drm_device, *pci;
- e = udev_enumerate_new(ec->udev);
+ e = udev_enumerate_new(b->udev);
udev_enumerate_add_match_subsystem(e, "drm");
udev_enumerate_add_match_sysname(e, "card[0-9]*");
@@ -2623,7 +2626,7 @@
drm_device = NULL;
udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) {
path = udev_list_entry_get_name(entry);
- device = udev_device_new_from_syspath(ec->udev, path);
+ device = udev_device_new_from_syspath(b->udev, path);
if (!device)
continue;
device_seat = udev_device_get_property_value(device, "ID_SEAT");
@@ -2659,17 +2662,17 @@
static void
planes_binding(struct weston_seat *seat, uint32_t time, uint32_t key, void *data)
{
- struct drm_compositor *c = data;
+ struct drm_backend *b = data;
switch (key) {
case KEY_C:
- c->cursors_are_broken ^= 1;
+ b->cursors_are_broken ^= 1;
break;
case KEY_V:
- c->sprites_are_broken ^= 1;
+ b->sprites_are_broken ^= 1;
break;
case KEY_O:
- c->sprites_hidden ^= 1;
+ b->sprites_hidden ^= 1;
break;
default:
break;
@@ -2693,17 +2696,17 @@
recorder_frame_notify(struct wl_listener *listener, void *data)
{
struct drm_output *output;
- struct drm_compositor *c;
+ struct drm_backend *b;
int fd, ret;
output = container_of(listener, struct drm_output,
recorder_frame_listener);
- c = (struct drm_compositor *) output->base.compositor;
+ b = (struct drm_backend *)output->base.compositor->backend;
if (!output->recorder)
return;
- ret = drmPrimeHandleToFD(c->drm.fd, output->current->handle,
+ ret = drmPrimeHandleToFD(b->drm.fd, output->current->handle,
DRM_CLOEXEC, &fd);
if (ret) {
weston_log("[libva recorder] "
@@ -2720,18 +2723,18 @@
}
static void *
-create_recorder(struct drm_compositor *c, int width, int height,
+create_recorder(struct drm_backend *b, int width, int height,
const char *filename)
{
int fd;
drm_magic_t magic;
- fd = open(c->drm.filename, O_RDWR | O_CLOEXEC);
+ fd = open(b->drm.filename, O_RDWR | O_CLOEXEC);
if (fd < 0)
return NULL;
drmGetMagic(fd, &magic);
- drmAuthMagic(c->drm.fd, magic);
+ drmAuthMagic(b->drm.fd, magic);
return vaapi_recorder_create(fd, width, height, filename);
}
@@ -2740,11 +2743,11 @@
recorder_binding(struct weston_seat *seat, uint32_t time, uint32_t key,
void *data)
{
- struct drm_compositor *c = data;
+ struct drm_backend *b = data;
struct drm_output *output;
int width, height;
- output = container_of(c->base.output_list.next,
+ output = container_of(b->compositor->output_list.next,
struct drm_output, base.link);
if (!output->recorder) {
@@ -2758,7 +2761,7 @@
height = output->base.current_mode->height;
output->recorder =
- create_recorder(c, width, height, "capture.h264");
+ create_recorder(b, width, height, "capture.h264");
if (!output->recorder) {
weston_log("failed to create vaapi recorder\n");
return;
@@ -2787,56 +2790,56 @@
#endif
static void
-switch_to_gl_renderer(struct drm_compositor *c)
+switch_to_gl_renderer(struct drm_backend *b)
{
struct drm_output *output;
- if (!c->use_pixman)
+ if (!b->use_pixman)
return;
weston_log("Switching to GL renderer\n");
- c->gbm = create_gbm_device(c->drm.fd);
- if (!c->gbm) {
+ b->gbm = create_gbm_device(b->drm.fd);
+ if (!b->gbm) {
weston_log("Failed to create gbm device. "
"Aborting renderer switch\n");
return;
}
- wl_list_for_each(output, &c->base.output_list, base.link)
+ wl_list_for_each(output, &b->compositor->output_list, base.link)
pixman_renderer_output_destroy(&output->base);
- c->base.renderer->destroy(&c->base);
+ b->compositor->renderer->destroy(b->compositor);
- if (drm_compositor_create_gl_renderer(c) < 0) {
- gbm_device_destroy(c->gbm);
+ if (drm_backend_create_gl_renderer(b) < 0) {
+ gbm_device_destroy(b->gbm);
weston_log("Failed to create GL renderer. Quitting.\n");
/* FIXME: we need a function to shutdown cleanly */
assert(0);
}
- wl_list_for_each(output, &c->base.output_list, base.link)
- drm_output_init_egl(output, c);
+ wl_list_for_each(output, &b->compositor->output_list, base.link)
+ drm_output_init_egl(output, b);
- c->use_pixman = 0;
+ b->use_pixman = 0;
}
static void
renderer_switch_binding(struct weston_seat *seat, uint32_t time, uint32_t key,
void *data)
{
- struct drm_compositor *c = (struct drm_compositor *) seat->compositor;
+ struct drm_backend *b = (struct drm_backend *)seat->compositor->backend;
- switch_to_gl_renderer(c);
+ switch_to_gl_renderer(b);
}
-static struct weston_compositor *
-drm_compositor_create(struct wl_display *display,
+static struct drm_backend *
+drm_backend_create(struct weston_compositor *compositor,
struct drm_parameters *param,
int *argc, char *argv[],
struct weston_config *config)
{
- struct drm_compositor *ec;
+ struct drm_backend *b;
struct weston_config_section *section;
struct udev_device *drm_device;
struct wl_event_loop *loop;
@@ -2845,8 +2848,8 @@
weston_log("initializing drm backend\n");
- ec = zalloc(sizeof *ec);
- if (ec == NULL)
+ b = zalloc(sizeof *b);
+ if (b == NULL)
return NULL;
/*
@@ -2858,162 +2861,164 @@
*
* These can be enabled again when nuclear/atomic support lands.
*/
- ec->sprites_are_broken = 1;
- ec->cursors_are_broken = 1;
+ b->sprites_are_broken = 1;
+ b->cursors_are_broken = 1;
+ b->compositor = compositor;
section = weston_config_get_section(config, "core", NULL, NULL);
if (get_gbm_format_from_section(section,
GBM_FORMAT_XRGB8888,
- &ec->format) == -1)
+ &b->format) == -1)
goto err_base;
- ec->use_pixman = param->use_pixman;
+ b->use_pixman = param->use_pixman;
- if (weston_compositor_init(&ec->base, display, argc, argv,
+ if (weston_compositor_init(compositor, argc, argv,
config) < 0) {
weston_log("%s failed\n", __func__);
goto err_base;
}
/* Check if we run drm-backend using weston-launch */
- ec->base.launcher = weston_launcher_connect(&ec->base, param->tty,
- param->seat_id, true);
- if (ec->base.launcher == NULL) {
+ compositor->launcher = weston_launcher_connect(compositor, param->tty,
+ param->seat_id, true);
+ if (compositor->launcher == NULL) {
weston_log("fatal: drm backend should be run "
"using weston-launch binary or as root\n");
goto err_compositor;
}
- ec->udev = udev_new();
- if (ec->udev == NULL) {
+ b->udev = udev_new();
+ if (b->udev == NULL) {
weston_log("failed to initialize udev context\n");
goto err_launcher;
}
- ec->base.wl_display = display;
- ec->session_listener.notify = session_notify;
- wl_signal_add(&ec->base.session_signal, &ec->session_listener);
+ b->session_listener.notify = session_notify;
+ wl_signal_add(&compositor->session_signal, &b->session_listener);
- drm_device = find_primary_gpu(ec, param->seat_id);
+ drm_device = find_primary_gpu(b, param->seat_id);
if (drm_device == NULL) {
weston_log("no drm device found\n");
goto err_udev;
}
path = udev_device_get_syspath(drm_device);
- if (init_drm(ec, drm_device) < 0) {
+ if (init_drm(b, drm_device) < 0) {
weston_log("failed to initialize kms\n");
goto err_udev_dev;
}
- if (ec->use_pixman) {
- if (init_pixman(ec) < 0) {
+ if (b->use_pixman) {
+ if (init_pixman(b) < 0) {
weston_log("failed to initialize pixman renderer\n");
goto err_udev_dev;
}
} else {
- if (init_egl(ec) < 0) {
+ if (init_egl(b) < 0) {
weston_log("failed to initialize egl\n");
goto err_udev_dev;
}
}
- ec->base.destroy = drm_destroy;
- ec->base.restore = drm_restore;
+ b->base.destroy = drm_destroy;
+ b->base.restore = drm_restore;
- ec->prev_state = WESTON_COMPOSITOR_ACTIVE;
+ b->prev_state = WESTON_COMPOSITOR_ACTIVE;
for (key = KEY_F1; key < KEY_F9; key++)
- weston_compositor_add_key_binding(&ec->base, key,
+ weston_compositor_add_key_binding(compositor, key,
MODIFIER_CTRL | MODIFIER_ALT,
- switch_vt_binding, ec);
+ switch_vt_binding, compositor);
- wl_list_init(&ec->sprite_list);
- create_sprites(ec);
+ wl_list_init(&b->sprite_list);
+ create_sprites(b);
- if (udev_input_init(&ec->input,
- &ec->base, ec->udev, param->seat_id) < 0) {
+ if (udev_input_init(&b->input,
+ compositor, b->udev, param->seat_id) < 0) {
weston_log("failed to create input devices\n");
goto err_sprite;
}
- if (create_outputs(ec, param->connector, drm_device) < 0) {
+ if (create_outputs(b, param->connector, drm_device) < 0) {
weston_log("failed to create output for %s\n", path);
goto err_udev_input;
}
/* A this point we have some idea of whether or not we have a working
* cursor plane. */
- if (!ec->cursors_are_broken)
- ec->base.capabilities |= WESTON_CAP_CURSOR_PLANE;
+ if (!b->cursors_are_broken)
+ compositor->capabilities |= WESTON_CAP_CURSOR_PLANE;
path = NULL;
- loop = wl_display_get_event_loop(ec->base.wl_display);
- ec->drm_source =
- wl_event_loop_add_fd(loop, ec->drm.fd,
- WL_EVENT_READABLE, on_drm_input, ec);
+ loop = wl_display_get_event_loop(compositor->wl_display);
+ b->drm_source =
+ wl_event_loop_add_fd(loop, b->drm.fd,
+ WL_EVENT_READABLE, on_drm_input, b);
- ec->udev_monitor = udev_monitor_new_from_netlink(ec->udev, "udev");
- if (ec->udev_monitor == NULL) {
+ b->udev_monitor = udev_monitor_new_from_netlink(b->udev, "udev");
+ if (b->udev_monitor == NULL) {
weston_log("failed to intialize udev monitor\n");
goto err_drm_source;
}
- udev_monitor_filter_add_match_subsystem_devtype(ec->udev_monitor,
+ udev_monitor_filter_add_match_subsystem_devtype(b->udev_monitor,
"drm", NULL);
- ec->udev_drm_source =
+ b->udev_drm_source =
wl_event_loop_add_fd(loop,
- udev_monitor_get_fd(ec->udev_monitor),
- WL_EVENT_READABLE, udev_drm_event, ec);
+ udev_monitor_get_fd(b->udev_monitor),
+ WL_EVENT_READABLE, udev_drm_event, b);
- if (udev_monitor_enable_receiving(ec->udev_monitor) < 0) {
+ if (udev_monitor_enable_receiving(b->udev_monitor) < 0) {
weston_log("failed to enable udev-monitor receiving\n");
goto err_udev_monitor;
}
udev_device_unref(drm_device);
- weston_compositor_add_debug_binding(&ec->base, KEY_O,
- planes_binding, ec);
- weston_compositor_add_debug_binding(&ec->base, KEY_C,
- planes_binding, ec);
- weston_compositor_add_debug_binding(&ec->base, KEY_V,
- planes_binding, ec);
- weston_compositor_add_debug_binding(&ec->base, KEY_Q,
- recorder_binding, ec);
- weston_compositor_add_debug_binding(&ec->base, KEY_W,
- renderer_switch_binding, ec);
+ weston_compositor_add_debug_binding(compositor, KEY_O,
+ planes_binding, b);
+ weston_compositor_add_debug_binding(compositor, KEY_C,
+ planes_binding, b);
+ weston_compositor_add_debug_binding(compositor, KEY_V,
+ planes_binding, b);
+ weston_compositor_add_debug_binding(compositor, KEY_Q,
+ recorder_binding, b);
+ weston_compositor_add_debug_binding(compositor, KEY_W,
+ renderer_switch_binding, b);
- return &ec->base;
+ compositor->backend = &b->base;
+ return b;
err_udev_monitor:
- wl_event_source_remove(ec->udev_drm_source);
- udev_monitor_unref(ec->udev_monitor);
+ wl_event_source_remove(b->udev_drm_source);
+ udev_monitor_unref(b->udev_monitor);
err_drm_source:
- wl_event_source_remove(ec->drm_source);
+ wl_event_source_remove(b->drm_source);
err_udev_input:
- udev_input_destroy(&ec->input);
+ udev_input_destroy(&b->input);
err_sprite:
- ec->base.renderer->destroy(&ec->base);
- gbm_device_destroy(ec->gbm);
- destroy_sprites(ec);
+ compositor->renderer->destroy(compositor);
+ gbm_device_destroy(b->gbm);
+ destroy_sprites(b);
err_udev_dev:
udev_device_unref(drm_device);
err_launcher:
- weston_launcher_destroy(ec->base.launcher);
+ weston_launcher_destroy(compositor->launcher);
err_udev:
- udev_unref(ec->udev);
+ udev_unref(b->udev);
err_compositor:
- weston_compositor_shutdown(&ec->base);
+ weston_compositor_shutdown(compositor);
err_base:
- free(ec);
+ free(b);
return NULL;
}
-WL_EXPORT struct weston_compositor *
-backend_init(struct wl_display *display, int *argc, char *argv[],
+WL_EXPORT int
+backend_init(struct weston_compositor *compositor, int *argc, char *argv[],
struct weston_config *config)
{
+ struct drm_backend *b;
struct drm_parameters param = { 0, };
const struct weston_option drm_options[] = {
@@ -3028,5 +3033,8 @@
parse_options(drm_options, ARRAY_LENGTH(drm_options), argc, argv);
- return drm_compositor_create(display, ¶m, argc, argv, config);
+ b = drm_backend_create(compositor, ¶m, argc, argv, config);
+ if (b == NULL)
+ return -1;
+ return 0;
}