We make the differentiation where planes are an abstract framebuffer
with a position within a CRTC/output, and sprites are special cases of
planes that are neither the primary (base/framebuffer) nor cursor plane.

drm_sprite, OTOH, contains nothing that's actually specific to sprites,
and we end up duplicating a lot of code to deal with them, especially
when we come to use an entirely plane-based interface with atomic
modesetting.

Rename drm_sprite to drm_plane, to reflect that it's actually generic.

No functional changes.

Signed-off-by: Daniel Stone <dani...@collabora.com>
Reviewed-by: Pekka Paalanen <pekka.paala...@collabora.co.uk>
---
 src/compositor-drm.c | 179 +++++++++++++++++++++++++++------------------------
 1 file changed, 95 insertions(+), 84 deletions(-)

diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index 1b26756..8c14b4f 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -157,6 +157,42 @@ struct drm_edid {
        char serial_number[13];
 };
 
+/**
+ * A plane represents one buffer, positioned within a CRTC, and stacked
+ * relative to other planes on the same CRTC.
+ *
+ * Each CRTC has a 'primary plane', which use used to display the classic
+ * framebuffer contents, as accessed through the legacy drmModeSetCrtc
+ * call (which combines setting the CRTC's actual physical mode, and the
+ * properties of the primary plane).
+ *
+ * The cursor plane also has its own alternate legacy API.
+ *
+ * Other planes are used opportunistically to display content we do not
+ * wish to blit into the primary plane. These non-primary/cursor planes
+ * are referred to as 'sprites'.
+ */
+struct drm_plane {
+       struct wl_list link;
+
+       struct weston_plane base;
+
+       struct drm_fb *current, *next;
+       struct drm_output *output;
+       struct drm_compositor *compositor;
+
+       uint32_t possible_crtcs;
+       uint32_t plane_id;
+       uint32_t count_formats;
+
+       int32_t src_x, src_y;
+       uint32_t src_w, src_h;
+       uint32_t dest_x, dest_y;
+       uint32_t dest_w, dest_h;
+
+       uint32_t formats[];
+};
+
 struct drm_output {
        struct weston_output   base;
 
@@ -192,31 +228,6 @@ struct drm_output {
        struct wl_listener recorder_frame_listener;
 };
 
-/*
- * An output has a primary display plane plus zero or more sprites for
- * blending display contents.
- */
-struct drm_sprite {
-       struct wl_list link;
-
-       struct weston_plane plane;
-
-       struct drm_fb *current, *next;
-       struct drm_output *output;
-       struct drm_compositor *compositor;
-
-       uint32_t possible_crtcs;
-       uint32_t plane_id;
-       uint32_t count_formats;
-
-       int32_t src_x, src_y;
-       uint32_t src_w, src_h;
-       uint32_t dest_x, dest_y;
-       uint32_t dest_w, dest_h;
-
-       uint32_t formats[];
-};
-
 struct drm_parameters {
        int connector;
        int tty;
@@ -232,7 +243,7 @@ static void
 drm_output_set_cursor(struct drm_output *output);
 
 static int
-drm_sprite_crtc_supported(struct drm_output *output, uint32_t supported)
+drm_plane_crtc_supported(struct drm_output *output, uint32_t supported)
 {
        struct weston_compositor *ec = output->base.compositor;
        struct drm_compositor *c = (struct drm_compositor *)ec;
@@ -606,7 +617,7 @@ drm_output_repaint(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_sprite *s;
+       struct drm_plane *s;
        struct drm_mode *mode;
        int ret = 0;
 
@@ -654,7 +665,7 @@ drm_output_repaint(struct weston_output *output_base,
                };
 
                if ((!s->current && !s->next) ||
-                   !drm_sprite_crtc_supported(output, s->possible_crtcs))
+                   !drm_plane_crtc_supported(output, s->possible_crtcs))
                        continue;
 
                if (s->next && !compositor->sprites_hidden)
@@ -749,7 +760,7 @@ static void
 vblank_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec,
               void *data)
 {
-       struct drm_sprite *s = (struct drm_sprite *)data;
+       struct drm_plane *s = (struct drm_plane *)data;
        struct drm_output *output = s->output;
        struct timespec ts;
        uint32_t flags = PRESENTATION_FEEDBACK_KIND_HW_COMPLETION |
@@ -810,7 +821,7 @@ page_flip_handler(int fd, unsigned int frame,
 }
 
 static uint32_t
-drm_output_check_sprite_format(struct drm_sprite *s,
+drm_output_check_plane_format(struct drm_plane *p,
                               struct weston_view *ev, struct gbm_bo *bo)
 {
        uint32_t i, format;
@@ -831,8 +842,8 @@ drm_output_check_sprite_format(struct drm_sprite *s,
                pixman_region32_fini(&r);
        }
 
-       for (i = 0; i < s->count_formats; i++)
-               if (s->formats[i] == format)
+       for (i = 0; i < p->count_formats; i++)
+               if (p->formats[i] == format)
                        return format;
 
        return 0;
@@ -852,7 +863,7 @@ drm_output_prepare_overlay_view(struct drm_output *output,
        struct weston_compositor *ec = output->base.compositor;
        struct drm_compositor *c = (struct drm_compositor *)ec;
        struct weston_buffer_viewport *viewport = &ev->surface->buffer_viewport;
-       struct drm_sprite *s;
+       struct drm_plane *p;
        int found = 0;
        struct gbm_bo *bo;
        pixman_region32_t dest_rect, src_rect;
@@ -887,11 +898,11 @@ drm_output_prepare_overlay_view(struct drm_output *output,
        if (!drm_view_transform_supported(ev))
                return NULL;
 
-       wl_list_for_each(s, &c->sprite_list, link) {
-               if (!drm_sprite_crtc_supported(output, s->possible_crtcs))
+       wl_list_for_each(p, &c->sprite_list, link) {
+               if (!drm_plane_crtc_supported(output, p->possible_crtcs))
                        continue;
 
-               if (!s->next) {
+               if (!p->next) {
                        found = 1;
                        break;
                }
@@ -907,23 +918,23 @@ drm_output_prepare_overlay_view(struct drm_output *output,
        if (!bo)
                return NULL;
 
-       format = drm_output_check_sprite_format(s, ev, bo);
+       format = drm_output_check_plane_format(p, ev, bo);
        if (format == 0) {
                gbm_bo_destroy(bo);
                return NULL;
        }
 
-       s->next = drm_fb_get_from_bo(bo, c, format);
-       if (!s->next) {
+       p->next = drm_fb_get_from_bo(bo, c, format);
+       if (!p->next) {
                gbm_bo_destroy(bo);
                return NULL;
        }
 
-       drm_fb_set_buffer(s->next, ev->surface->buffer_ref.buffer);
+       drm_fb_set_buffer(p->next, ev->surface->buffer_ref.buffer);
 
        box = pixman_region32_extents(&ev->transform.boundingbox);
-       s->plane.x = box->x1;
-       s->plane.y = box->y1;
+       p->base.x = box->x1;
+       p->base.y = box->y1;
 
        /*
         * Calculate the source & dest rects properly based on actual
@@ -940,10 +951,10 @@ drm_output_prepare_overlay_view(struct drm_output *output,
                                       output->base.transform,
                                       output->base.current_scale,
                                       *box);
-       s->dest_x = tbox.x1;
-       s->dest_y = tbox.y1;
-       s->dest_w = tbox.x2 - tbox.x1;
-       s->dest_h = tbox.y2 - tbox.y1;
+       p->dest_x = tbox.x1;
+       p->dest_y = tbox.y1;
+       p->dest_w = tbox.x2 - tbox.x1;
+       p->dest_h = tbox.y2 - tbox.y1;
        pixman_region32_fini(&dest_rect);
 
        pixman_region32_init(&src_rect);
@@ -980,13 +991,13 @@ drm_output_prepare_overlay_view(struct drm_output *output,
                                       viewport->buffer.scale,
                                       tbox);
 
-       s->src_x = tbox.x1 << 8;
-       s->src_y = tbox.y1 << 8;
-       s->src_w = (tbox.x2 - tbox.x1) << 8;
-       s->src_h = (tbox.y2 - tbox.y1) << 8;
+       p->src_x = tbox.x1 << 8;
+       p->src_y = tbox.y1 << 8;
+       p->src_w = (tbox.x2 - tbox.x1) << 8;
+       p->src_h = (tbox.y2 - tbox.y1) << 8;
        pixman_region32_fini(&src_rect);
 
-       return &s->plane;
+       return &p->base;
 }
 
 static struct weston_plane *
@@ -2342,69 +2353,69 @@ err_free:
 static void
 create_sprites(struct drm_compositor *ec)
 {
-       struct drm_sprite *sprite;
-       drmModePlaneRes *plane_res;
-       drmModePlane *plane;
+       struct drm_plane *plane;
+       drmModePlaneRes *kplane_res;
+       drmModePlane *kplane;
        uint32_t i;
 
-       plane_res = drmModeGetPlaneResources(ec->drm.fd);
-       if (!plane_res) {
+       kplane_res = drmModeGetPlaneResources(ec->drm.fd);
+       if (!kplane_res) {
                weston_log("failed to get plane resources: %s\n",
                        strerror(errno));
                return;
        }
 
-       for (i = 0; i < plane_res->count_planes; i++) {
-               plane = drmModeGetPlane(ec->drm.fd, plane_res->planes[i]);
-               if (!plane)
+       for (i = 0; i < kplane_res->count_planes; i++) {
+               kplane = drmModeGetPlane(ec->drm.fd, kplane_res->planes[i]);
+               if (!kplane)
                        continue;
 
-               sprite = zalloc(sizeof(*sprite) + ((sizeof(uint32_t)) *
-                                                  plane->count_formats));
-               if (!sprite) {
+               plane = zalloc(sizeof(*plane) + ((sizeof(uint32_t)) *
+                                                 kplane->count_formats));
+               if (!plane) {
                        weston_log("%s: out of memory\n",
                                __func__);
-                       drmModeFreePlane(plane);
+                       drmModeFreePlane(kplane);
                        continue;
                }
 
-               sprite->possible_crtcs = plane->possible_crtcs;
-               sprite->plane_id = plane->plane_id;
-               sprite->current = NULL;
-               sprite->next = NULL;
-               sprite->compositor = ec;
-               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,
+               plane->possible_crtcs = kplane->possible_crtcs;
+               plane->plane_id = kplane->plane_id;
+               plane->current = NULL;
+               plane->next = NULL;
+               plane->compositor = ec;
+               plane->count_formats = kplane->count_formats;
+               memcpy(plane->formats, kplane->formats,
+                      kplane->count_formats * sizeof(kplane->formats[0]));
+               drmModeFreePlane(kplane);
+               weston_plane_init(&plane->base, &ec->base, 0, 0);
+               weston_compositor_stack_plane(&ec->base, &plane->base,
                                              &ec->base.primary_plane);
 
-               wl_list_insert(&ec->sprite_list, &sprite->link);
+               wl_list_insert(&ec->sprite_list, &plane->link);
        }
 
-       drmModeFreePlaneResources(plane_res);
+       drmModeFreePlaneResources(kplane_res);
 }
 
 static void
 destroy_sprites(struct drm_compositor *compositor)
 {
-       struct drm_sprite *sprite, *next;
+       struct drm_plane *plane, *next;
        struct drm_output *output;
 
        output = container_of(compositor->base.output_list.next,
                              struct drm_output, base.link);
 
-       wl_list_for_each_safe(sprite, next, &compositor->sprite_list, link) {
+       wl_list_for_each_safe(plane, next, &compositor->sprite_list, link) {
                drmModeSetPlane(compositor->drm.fd,
-                               sprite->plane_id,
+                               plane->plane_id,
                                output->crtc_id, 0, 0,
                                0, 0, 0, 0, 0, 0, 0, 0);
-               drm_output_release_fb(output, sprite->current);
-               drm_output_release_fb(output, sprite->next);
-               weston_plane_release(&sprite->plane);
-               free(sprite);
+               drm_output_release_fb(output, plane->current);
+               drm_output_release_fb(output, plane->next);
+               weston_plane_release(&plane->base);
+               free(plane);
        }
 }
 
@@ -2642,7 +2653,7 @@ session_notify(struct wl_listener *listener, void *data)
 {
        struct weston_compositor *compositor = data;
        struct drm_compositor *ec = data;
-       struct drm_sprite *sprite;
+       struct drm_plane *sprite;
        struct drm_output *output;
 
        if (ec->base.session_active) {
-- 
2.4.3

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to