diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index 11d818a80129d488c9b2e5ec13b9bf63012c86b4..133ef58cd5810cae65d9b385091b893a4fac708e 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -166,7 +166,7 @@ struct drm_backend { int min_height, max_height; int no_addfb2; - struct wl_list sprite_list; + struct wl_list plane_list; int sprites_are_broken; int sprites_hidden; @@ -1129,7 +1129,7 @@ drm_output_repaint(struct weston_output *output_base, struct drm_output *output = to_drm_output(output_base); struct drm_backend *backend = to_drm_backend(output->base.compositor); - struct drm_plane *s; + struct drm_plane *p; struct drm_mode *mode; int ret = 0; @@ -1191,28 +1191,29 @@ drm_output_repaint(struct weston_output *output_base, /* * Now, update all the sprite surfaces */ - wl_list_for_each(s, &backend->sprite_list, link) { + wl_list_for_each(p, &backend->plane_list, link) { uint32_t flags = 0, fb_id = 0; drmVBlank vbl = { .request.type = DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT, .request.sequence = 1, }; - /* XXX: Set output much earlier, so we don't attempt to place - * planes on entirely the wrong output. */ - if ((!s->fb_current && !s->fb_pending) || - !drm_plane_crtc_supported(output, s)) + if (p->type != WDRM_PLANE_TYPE_OVERLAY) + continue; + + if ((!p->fb_current && !p->fb_pending) || + !drm_plane_crtc_supported(output, p)) continue; - if (s->fb_pending && !backend->sprites_hidden) - fb_id = s->fb_pending->fb_id; + if (p->fb_pending && !backend->sprites_hidden) + fb_id = p->fb_pending->fb_id; - ret = drmModeSetPlane(backend->drm.fd, s->plane_id, + ret = drmModeSetPlane(backend->drm.fd, p->plane_id, output->crtc_id, fb_id, flags, - s->dest_x, s->dest_y, - s->dest_w, s->dest_h, - s->src_x, s->src_y, - s->src_w, s->src_h); + p->dest_x, p->dest_y, + p->dest_w, p->dest_h, + p->src_x, p->src_y, + p->src_w, p->src_h); if (ret) weston_log("setplane failed: %d: %s\n", ret, strerror(errno)); @@ -1223,17 +1224,17 @@ drm_output_repaint(struct weston_output *output_base, * Queue a vblank signal so we know when the surface * becomes active on the display or has been replaced. */ - vbl.request.signal = (unsigned long)s; + vbl.request.signal = (unsigned long) p; ret = drmWaitVBlank(backend->drm.fd, &vbl); if (ret) { weston_log("vblank event request failed: %d: %s\n", ret, strerror(errno)); } - s->output = output; - s->fb_last = s->fb_current; - s->fb_current = s->fb_pending; - s->fb_pending = NULL; + p->output = output; + p->fb_last = p->fb_current; + p->fb_current = p->fb_pending; + p->fb_pending = NULL; output->vblank_pending++; } @@ -1489,7 +1490,10 @@ drm_output_prepare_overlay_view(struct drm_output *output, if (ev->alpha != 1.0f) return NULL; - wl_list_for_each(p, &b->sprite_list, link) { + wl_list_for_each(p, &b->plane_list, link) { + if (p->type != WDRM_PLANE_TYPE_OVERLAY) + continue; + if (!drm_plane_crtc_supported(output, p)) continue; @@ -2171,7 +2175,7 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) drmModeFreeObjectProperties(props); weston_plane_init(&plane->base, b->compositor, 0, 0); - wl_list_insert(&b->sprite_list, &plane->link); + wl_list_insert(&b->plane_list, &plane->link); return plane; } @@ -2232,14 +2236,10 @@ create_sprites(struct drm_backend *b) if (!drm_plane) continue; - /* Ignore non-overlay planes for now. */ - if (drm_plane->type != WDRM_PLANE_TYPE_OVERLAY) { - drm_plane_destroy(drm_plane); - continue; - } - - weston_compositor_stack_plane(b->compositor, &drm_plane->base, - &b->compositor->primary_plane); + if (drm_plane->type == WDRM_PLANE_TYPE_OVERLAY) + weston_compositor_stack_plane(b->compositor, + &drm_plane->base, + &b->compositor->primary_plane); } drmModeFreePlaneResources(kplane_res); @@ -2257,7 +2257,7 @@ destroy_sprites(struct drm_backend *b) { struct drm_plane *plane, *next; - wl_list_for_each_safe(plane, next, &b->sprite_list, link) + wl_list_for_each_safe(plane, next, &b->plane_list, link) drm_plane_destroy(plane); } @@ -3490,7 +3490,7 @@ session_notify(struct wl_listener *listener, void *data) { struct weston_compositor *compositor = data; struct drm_backend *b = to_drm_backend(compositor); - struct drm_plane *sprite; + struct drm_plane *plane; struct drm_output *output; if (compositor->session_active) { @@ -3524,12 +3524,16 @@ session_notify(struct wl_listener *listener, void *data) output = container_of(compositor->output_list.next, struct drm_output, base.link); - wl_list_for_each(sprite, &b->sprite_list, link) + wl_list_for_each(plane, &b->plane_list, link) { + if (plane->type != WDRM_PLANE_TYPE_OVERLAY) + continue; + drmModeSetPlane(b->drm.fd, - sprite->plane_id, + plane->plane_id, output->crtc_id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - }; + } + } } /** @@ -3950,7 +3954,7 @@ drm_backend_create(struct weston_compositor *compositor, weston_setup_vt_switch_bindings(compositor); - wl_list_init(&b->sprite_list); + wl_list_init(&b->plane_list); create_sprites(b); if (udev_input_init(&b->input,