It looks good to me Reviewed-by: Emre Ucan <eu...@de.adit-jv.com> Best regards
Emre Ucan Engineering Software Base (ADITG/ESB) Tel. +49 5121 49 6937 > -----Original Message----- > From: wayland-devel [mailto:wayland-devel- > boun...@lists.freedesktop.org] On Behalf Of Daniel Stone > Sent: Dienstag, 18. Juli 2017 15:15 > To: wayland-devel@lists.freedesktop.org > Subject: [PATCH weston v11 01/13] compositor-drm: Refactor sprite > create/destroy into helpers > > From: Pekka Paalanen <pekka.paala...@collabora.co.uk> > > This moves the single sprite creation code from create_sprites() into a > new function. The readability clean-up is small, but my intention is to > write an alternate version of create_sprites(), and sharing the single > sprite creation code is useful. > > [daniels: Genericised from drm_sprite to drm_plane, moving some of the > logic back into create_sprites(), also symmetrical > drm_plane_destroy.] > > Signed-off-by: Pekka Paalanen <pekka.paala...@collabora.co.uk> > Signed-off-by: Daniel Stone <dani...@collabora.com> > --- > libweston/compositor-drm.c | 188 ++++++++++++++++++++++++++++------ > ----------- > 1 file changed, 117 insertions(+), 71 deletions(-) > > diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c > index 10adb463..5967a18f 100644 > --- a/libweston/compositor-drm.c > +++ b/libweston/compositor-drm.c > @@ -1817,6 +1817,123 @@ init_pixman(struct drm_backend *b) > } > > /** > + * Create a drm_plane for a hardware plane > + * > + * Creates one drm_plane structure for a hardware plane, and initialises its > + * properties and formats. > + * > + * This function does not add the plane to the list of usable planes in > Weston > + * itself; the caller is responsible for this. > + * > + * Call drm_plane_destroy to clean up the plane. > + * > + * @param b DRM compositor backend > + * @param kplane DRM plane to create > + */ > +static struct drm_plane * > +drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) > +{ > + struct drm_plane *plane; > + > + plane = zalloc(sizeof(*plane) + ((sizeof(uint32_t)) * > + kplane->count_formats)); > + if (!plane) { > + weston_log("%s: out of memory\n", __func__); > + return NULL; > + } > + > + plane->backend = b; > + plane->possible_crtcs = kplane->possible_crtcs; > + plane->plane_id = kplane->plane_id; > + plane->count_formats = kplane->count_formats; > + memcpy(plane->formats, kplane->formats, > + kplane->count_formats * sizeof(kplane->formats[0])); > + > + weston_plane_init(&plane->base, b->compositor, 0, 0); > + wl_list_insert(&b->sprite_list, &plane->link); > + > + return plane; > +} > + > +/** > + * Destroy one DRM plane > + * > + * Destroy a DRM plane, removing it from screen and releasing its retained > + * buffers in the process. The counterpart to drm_plane_create. > + * > + * @param plane Plane to deallocate (will be freed) > + */ > +static void > +drm_plane_destroy(struct drm_plane *plane) > +{ > + drmModeSetPlane(plane->backend->drm.fd, plane->plane_id, 0, 0, > 0, > + 0, 0, 0, 0, 0, 0, 0, 0); > + assert(!plane->fb_last); > + assert(!plane->fb_pending); > + drm_fb_unref(plane->fb_current); > + weston_plane_release(&plane->base); > + wl_list_remove(&plane->link); > + free(plane); > +} > + > +/** > + * Initialise sprites (overlay planes) > + * > + * Walk the list of provided DRM planes, and add overlay planes. > + * > + * Call destroy_sprites to free these planes. > + * > + * @param b DRM compositor backend > + */ > +static void > +create_sprites(struct drm_backend *b) > +{ > + drmModePlaneRes *kplane_res; > + drmModePlane *kplane; > + struct drm_plane *drm_plane; > + uint32_t i; > + > + kplane_res = drmModeGetPlaneResources(b->drm.fd); > + if (!kplane_res) { > + weston_log("failed to get plane resources: %s\n", > + strerror(errno)); > + return; > + } > + > + for (i = 0; i < kplane_res->count_planes; i++) { > + kplane = drmModeGetPlane(b->drm.fd, kplane_res- > >planes[i]); > + if (!kplane) > + continue; > + > + drm_plane = drm_plane_create(b, kplane); > + drmModeFreePlane(kplane); > + if (!drm_plane) > + continue; > + > + weston_compositor_stack_plane(b->compositor, > &drm_plane->base, > + &b->compositor->primary_plane); > + } > + > + drmModeFreePlaneResources(kplane_res); > +} > + > +/** > + * Clean up sprites (overlay planes) > + * > + * The counterpart to create_sprites. > + * > + * @param b DRM compositor backend > + */ > +static void > +destroy_sprites(struct drm_backend *b) > +{ > + struct drm_plane *plane, *next; > + > + wl_list_for_each_safe(plane, next, &b->sprite_list, link) > + drm_plane_destroy(plane); > +} > + > +/** > * Add a mode to output's mode list > * > * Copy the supplied DRM mode into a Weston mode structure, and add it to > the > @@ -2850,77 +2967,6 @@ err: > return -1; > } > > -static void > -create_sprites(struct drm_backend *b) > -{ > - struct drm_plane *plane; > - drmModePlaneRes *kplane_res; > - drmModePlane *kplane; > - uint32_t i; > - > - kplane_res = drmModeGetPlaneResources(b->drm.fd); > - if (!kplane_res) { > - weston_log("failed to get plane resources: %s\n", > - strerror(errno)); > - return; > - } > - > - for (i = 0; i < kplane_res->count_planes; i++) { > - kplane = drmModeGetPlane(b->drm.fd, kplane_res- > >planes[i]); > - if (!kplane) > - continue; > - > - plane = zalloc(sizeof(*plane) + ((sizeof(uint32_t)) * > - kplane->count_formats)); > - if (!plane) { > - weston_log("%s: out of memory\n", > - __func__); > - drmModeFreePlane(kplane); > - continue; > - } > - > - plane->possible_crtcs = kplane->possible_crtcs; > - plane->plane_id = kplane->plane_id; > - plane->fb_last = NULL; > - plane->fb_current = NULL; > - plane->fb_pending = NULL; > - plane->backend = b; > - 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, b->compositor, 0, 0); > - weston_compositor_stack_plane(b->compositor, &plane- > >base, > - &b->compositor->primary_plane); > - > - wl_list_insert(&b->sprite_list, &plane->link); > - } > - > - drmModeFreePlaneResources(kplane_res); > -} > - > -static void > -destroy_sprites(struct drm_backend *backend) > -{ > - struct drm_plane *plane, *next; > - struct drm_output *output; > - > - output = container_of(backend->compositor->output_list.next, > - struct drm_output, base.link); > - > - wl_list_for_each_safe(plane, next, &backend->sprite_list, link) { > - drmModeSetPlane(backend->drm.fd, > - plane->plane_id, > - output->crtc_id, 0, 0, > - 0, 0, 0, 0, 0, 0, 0, 0); > - assert(!plane->fb_last); > - assert(!plane->fb_pending); > - drm_fb_unref(plane->fb_current); > - weston_plane_release(&plane->base); > - free(plane); > - } > -} > - > static int > create_outputs(struct drm_backend *b, struct udev_device *drm_device) > { > -- > 2.13.3 > > _______________________________________________ > wayland-devel mailing list > wayland-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/wayland-devel _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel