EXT: [PATCH weston v6 00/73] Head-based output configuration API a.k.a clone mode infrastructure
Ray, Ian (GE Healthcare)
ian.ray at ge.com
Sat Mar 24 10:16:12 UTC 2018
> On 23 Mar 2018, at 19.16, Ray, Ian (GE Healthcare) <ian.ray at ge.com> wrote:
>
>
>> On 23 Mar 2018, at 15.12, Ray, Ian (GE Healthcare) <ian.ray at ge.com> wrote:
>>
>>
>>> On 16 Feb 2018, at 16.56, Pekka Paalanen <ppaalanen at gmail.com> wrote:
>>>
>>> From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
>>>
>>> Hi all,
>>>
>>> here is the v6 of the shared-CRTC clone mode series. Since v5, quite
>>> many patches have been extracted from this series, sent out and merged
>>> upstream. However, now the series is bigger than ever, because here I am
>>> posting the complete series, including the full DRM-backend migration
>>> and DRM shared-CRTC clone mode implementation, thanks to having the
>>> basic atomic modesetting landed upstream.
>>>
>>> The previous submission is here:
>>> https://lists.freedesktop.org/archives/wayland-devel/2017-December/036236.html
>>>
>>> Design discussion etc. (sequence diagrams!) can be found here:
>>> https://phabricator.freedesktop.org/T7727
>>> https://phabricator.freedesktop.org/w/wayland/weston/atomic-output-config/
>>> https://lists.freedesktop.org/archives/wayland-devel/2017-October/035604.html
>>>
>>> The series is available as a branch at:
>>> https://gitlab.collabora.com/pq/weston/commits/clonemode-6
>>>
>>> Highlights since v5:
>>> - DRM-backend migration
>>> - shared-CRTC clone mode implemented in DRM backend
>>> - applied review comments from v5
>>> - don't create a weston_output just to turn it off (DRM)
>>> - cms-colord will print a warning when used with clone mode
>>> - cms-colord vs. clone mode mentioned in weston-drm.man
>>>
>>> Unfortunately the testing results are not 100%, you can find my testing
>>> procedure below the diffstat.
>>>
>>> The patch series is structured as follows:
>>>
>>> - Patches 1-17 introduce most of the new head-based API, and build the
>>> scaffolding that allows migrating the frontends and the backends one
>>> by one.
>>>
>>
>> Patches 01-17 : Reviewed-by Ian Ray <ian.ray at ge.com>
>>
>>
>>> - Patches 18-24 migrate the frontends one by one. Patch 19 introduces
>>> the simple output configurator which is first used for all backends,
>>> including the DRM-backend.
>>>
>>> - Patches 25-30 clean up libweston after the frontend migration.
>
> Patches 18-30 : Reviewed-by Ian Ray <ian.ray at ge.com>
>
>
>>>
>>> - Patches 31-38 migrate all the backends to the head-based API. At this
>>> point the DRM-backend migration is basically a fake, though.
>>>
>>> - Patch 39 removes weston_output::head with the last bits of the
>>> scaffolding.
Patches 31-39 : Reviewed-by Ian Ray <ian.ray at ge.com>
(May I say that I am really enjoying the review so far. The commits
are well structured and the commit messages are highly informative.)
>>>
>>> - Patches 40-44 enhances libweston core to better support the
>>> DRM-backend's clone mode configuration and improve logging.
>>>
>>> - Patches 45-55 implement the head-based API for real in the
>>> DRM-backend, culminating in patch 55 which creates heads for all
>>> connectors.
>>>
>>> - Patch 56 removes unused_connectors array which has been replace with
>>> the head list.
>>>
>>> - Patches 57-70 finally implement everything needed for shared-CRTC
>>> clone mode in the DRM-backend.
>>>
>>> - Patches 71-73 add a new output configrator logic in the frontend to
>>> handle clone mode, supporting a new weston.ini key "same-as".
>>>
>>>
>>> Do you think we should call the weston.ini key "clone-of" instead, to
>>> leave "same-as" reserved for clone mode where only the desktop area is
>>> the same but the monitors would have different video modes, scaling,
>>> etc.?
>>>
>>> There are several imaginable uses for "same-as" variants:
>>> - get me shared-CRTC clone mode or fail
>>> - get me clone mode, preferring shared-CRTC but automatic fallback to
>>> independent CRTCs
>>> - get me clone mode, but I want one monitor with HiDPI and one with
>>> LoDPI
>>>
>>> Here I have implemented the automatic fallback version, except it cannot
>>> actually fall back, because we have no API to make two weston_outputs
>>> show the same area, and libweston's damage tracking could not handle it
>>> even if we could.
>>>
>>>
>>> Pekka Paalanen (73):
>>> libweston: introduce weston_head
>>> libweston: move wl_output to weston_head
>>> libweston: use head in wl_output global
>>> libweston: make wl_output point to weston_head
>>> libweston: refactor weston_mode_switch_finish
>>> libweston: introduce weston_output::head_list
>>> libweston: properly orphan wl_output resources
>>> libweston: strdup head make, model, serial_number
>>> cms-colord: find a good head
>>> libweston: add name to weston_head
>>> libweston: add weston_head::connected
>>> libweston: add weston_head_is_enabled()
>>> libweston: add compositor list of heads
>>> libweston: add heads_changed hook
>>> libweston: new head-based output management API
>>> libweston: add weston_head destroy signal
>>> libweston: add weston_head_is_device_changed() API
>>> weston: move weston_output_enable() into callers
>>> weston: migrate headless to head-based output API
>>> weston: migrate x11 to head-based output API
>>> weston: migrate wayland to head-based output API
>>> weston: migrate fbdev to head-based output API
>>> weston: migrate RDP to head-based output API
>>> weston: migrate DRM to head-based output API
>>> libweston: change windowed_output_api output_create to create_head
>>> libweston: remove output_pending_signal
>>> libweston: stop auto-adding the implicit head
>>> libweston: assert make/model in weston_output_enable()
>>> libweston: assert current_mode in weston_output_enable()
>>> libweston: cancel idle_repaint on output destroy
>>> compositor-headless: migrate to head-based output API
>>> compositor-rdp: migrate to head-based output API
>>> compositor-fbdev: make re-enable less drastic
>>> compositor-fbdev: migrate to head-based output API
>>> compositor-x11: migrate to head-based output API
>>> compositor-wayland: strict surface create/destroy
>>> compositor-wayland: migrate to head-based output API
>>> compositor-drm: start migration to head-based output API
>>> libweston: remove weston_output::head
>>> libweston: print head names on output enable
>>> libweston: create/find output by name
>>> libweston: support user data on weston_output
>>> libweston: allow attaching heads to enabled outputs
>>> libweston: log head detach on enabled output
>>> compositor-drm: drm_output_find_by_connector from head_list
>>> compositor-drm: use head_find_by_connector in update_unused_outputs
>>> compositor-drm: find disconnects from head_list
>>> compositor-drm: move backlight into drm_head
>>> compositor-drm: move connector fields into drm_head
>>> compositor-drm: allocate CRTC on enable()
>>> compositor-drm: simplify drm_output_find_by_crtc()
>>> compositor-drm: simplify drm_output_find_special_plane()
>>> compositor-drm: get current mode on head discovery
>>> compositor-drm: move mode list to set_mode()
>>> compositor-drm: create heads for all connectors
>>> compositor-drm: remove unused_connectors array
>>> compositor-drm: drm_output_apply_state_legacy heads
>>> compositor-drm: drm_output_apply_state_atomic heads
>>> compositor-drm: drm_set_backlight heads
>>> compositor-drm: unify head status logging
>>> compositor-drm: combine mode list from heads
>>> compositor-drm: backlight control for all heads
>>> compositor-drm: update video mode printing
>>> compositor-drm: introduce drm_head_read_current_setup()
>>> compositor-drm: no need to clear inherited_mode
>>> compositor-drm: rewrite crtc picking for clone mode
>>> compositor-drm: preserve CRTC routing harder
>>> compositor-drm: head detach requires a modeset
>>> compositor-drm: head attach requires a modeset
>>> compositor-drm: allow shared-CRTC cloning
>>> weston: store weston_compositor in wet_compositor
>>> weston: use wet.compositor consistently in main()
>>> weston: support clone mode on DRM-frontend
>>>
>>> compositor/cms-colord.c | 45 +-
>>> compositor/main.c | 818 +++++++++++++++++++++----
>>> compositor/weston-screenshooter.c | 2 +-
>>> desktop-shell/input-panel.c | 4 +-
>>> desktop-shell/shell.c | 4 +-
>>> fullscreen-shell/fullscreen-shell.c | 4 +-
>>> ivi-shell/input-panel-ivi.c | 4 +-
>>> libweston-desktop/wl-shell.c | 2 +-
>>> libweston-desktop/xdg-shell-v6.c | 2 +-
>>> libweston/compositor-drm.c | 1128 +++++++++++++++++++++++------------
>>> libweston/compositor-fbdev.c | 206 ++++---
>>> libweston/compositor-headless.c | 75 ++-
>>> libweston/compositor-rdp.c | 64 +-
>>> libweston/compositor-wayland.c | 254 ++++++--
>>> libweston/compositor-x11.c | 71 ++-
>>> libweston/compositor.c | 1107 +++++++++++++++++++++++++++++++---
>>> libweston/compositor.h | 198 +++++-
>>> libweston/windowed-output-api.h | 23 +-
>>> man/weston-drm.man | 12 +
>>> tests/weston-test.c | 2 +-
>>> 20 files changed, 3249 insertions(+), 776 deletions(-)
>>>
>>>
>>> Testing procedure and results:
>>>
>>> All tests were successful except where otherwise mentioned.
>>>
>>>
>>> headless-backend testing:
>>>
>>> $ make -j7 distcheck
>>>
>>>
>>> x11-backend testing:
>>>
>>> $ weston
>>> $ weston --output-count=3
>>> - close x11 windows one by one
>>> $ weston --fullscreen (equally broken before and after)
>>>
>>>
>>> Wayland-backend testing:
>>>
>>> parent: $ weston --output-count=2 --width=700
>>> outputs have different height
>>>
>>> tests:
>>>
>>> weston --use-pixman
>>> weston --use-pixman --fullscreen
>>> weston --use-pixman --output-count=2
>>> weston --use-pixman --sprawl
>>> - close parent outputs one by one
>>>
>>> In the --sprawl case, closing the first output soon results in the
>>> parent compositor:
>>>
>>> Program received signal SIGSEGV, Segmentation fault.
>>> 0x00007ffff7ba3b8f in wl_signal_emit (signal=0x555555da74a8, data=0x555555da74a0) at /home/pq/local/include/wayland-server-core.h:467
>>> 467 wl_list_for_each_safe(l, next, &signal->listener_list, link)
>>> (gdb) bt
>>> #0 0x00007ffff7ba3b8f in wl_signal_emit (signal=0x555555da74a8, data=0x555555da74a0) at /home/pq/local/include/wayland-server-core.h:467
>>> #1 0x00007ffff7ba8a4c in weston_surface_destroy (surface=0x555555da74a0) at /home/pq/git/weston/libweston/compositor.c:1904
>>> #2 0x00007fffee108196 in fade_out_done_idle_cb (data=0x555555da7d20) at /home/pq/git/weston/desktop-shell/shell.c:2281
>>> #3 0x00007ffff798dcac in wl_event_loop_dispatch_idle (loop=loop at entry=0x55555576c250) at src/event-loop.c:600
>>> #4 0x00007ffff798dd64 in wl_event_loop_dispatch (loop=0x55555576c250, timeout=timeout at entry=-1) at src/event-loop.c:646
>>> #5 0x00007ffff798c4fa in wl_display_run (display=0x55555576c170) at src/wayland-server.c:1260
>>> #6 0x000055555555dd86 in main (argc=1, argv=0x7fffffffdb58) at /home/pq/git/weston/compositor/main.c:2477
>>>
>>>
>>>
>>> parent: $ weston --output-count=2 --width=700 --shell=fullscreen-shell.so
>>>
>>> tests:
>>>
>>> weston --use-pixman
>>> - close parent outputs one by one
>>>
>>>
>>> RDP-backend testing:
>>>
>>> - using remmina as client, connected twice in a row
>>>
>>>
>>>
>>> fbdev-backend testing:
>>>
>>> $ weston -Bfbdev-backend.so
>>>
>>>
>>> DRM-backend testing:
>>>
>>> Two outputs plugged in, third unplugged.
>>> 1. start Weston, ensure both outputs work
>>> 2. unplug one output, ensure remaining output works
>>> 3. re-plug the output, ensure both outputs work
>>> 4. quit
>>>
>>> One output plugged in, the rest unplugged. The plugged-in output is
>>> configured to be off in weston.ini.
>>> 1. start Weston, zero outputs, check via remote login weston-info works
>>> 2. plug in an output, check it works
>>> 3. unplug the output, check weston-info via remote
>>>
>>>
>>>
>>> Thanks,
>>> pq
>>>
>>> _______________________________________________
>>> wayland-devel mailing list
>>> wayland-devel at lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/wayland-devel
>>
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list