Mir

Merge lp:~alan-griffiths/mir/spike-input-from-the-existing-graphics-module into lp:mir

Proposed by Alan Griffiths
Status: Merged
Approved by: Alan Griffiths
Approved revision: no longer in the source branch.
Merged at revision: 3377
Proposed branch: lp:~alan-griffiths/mir/spike-input-from-the-existing-graphics-module
Merge into: lp:mir
Prerequisite: lp:~alan-griffiths/mir/fix-1528110
Diff against target: 164 lines (+64/-26)
3 files modified
src/include/server/mir/input/input_probe.h (+8/-1)
src/server/input/default_configuration.cpp (+22/-5)
src/server/input/input_probe.cpp (+34/-20)
To merge this branch: bzr merge lp:~alan-griffiths/mir/spike-input-from-the-existing-graphics-module
Reviewer Review Type Date Requested Status
Mir CI Bot continuous-integration Approve
Chris Halse Rogers Approve
Cemil Azizoglu (community) Approve
Review via email: mp+287964@code.launchpad.net

Commit message

input, config: try loading an input platform from the graphics before probing

Description of the change

input, config: try loading an input platform from the graphics before probing

I'm not yet sure how to write a decent test for this. My best idea so far is a stub graphics module (or two) that allows this support to be switched and can be force loaded in acceptance tests.

Suggestions welcome.

To post a comment you must log in.
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3360
https://mir-jenkins.ubuntu.com/job/mir-ci/482/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/310
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/335
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/327
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/327
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/319
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/319/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/319
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/319/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/319
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/319/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/319
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/319/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/319
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/319/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/482/rebuild

review: Approve (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3361
https://mir-jenkins.ubuntu.com/job/mir-ci/483/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/312
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/337
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/329
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/329
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/321
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/321/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/321
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/321/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/321
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/321/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/321
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/321/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/321
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/321/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/483/rebuild

review: Approve (continuous-integration)
Revision history for this message
Cemil Azizoglu (cemil-azizoglu) wrote :

Ok

review: Approve
Revision history for this message
Chris Halse Rogers (raof) wrote :

Would be nice to have some tests, but seems reasonableish :)

review: Approve
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3362
https://mir-jenkins.ubuntu.com/job/mir-ci/520/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/381
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/411
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/403
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/403
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/390
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/390/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/390
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/390/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/390
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/390/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/390
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/390/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/390
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/390/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/520/rebuild

review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/include/server/mir/input/input_probe.h'
2--- src/include/server/mir/input/input_probe.h 2016-03-02 14:54:07 +0000
3+++ src/include/server/mir/input/input_probe.h 2016-03-08 16:22:46 +0000
4@@ -1,5 +1,5 @@
5 /*
6- * Copyright © 2015 Canonical Ltd.
7+ * Copyright © 2015-2016 Canonical Ltd.
8 *
9 * This program is free software: you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License version 3,
11@@ -23,6 +23,7 @@
12
13 namespace mir
14 {
15+namespace graphics { class Platform; }
16 namespace options
17 {
18 class Option;
19@@ -41,6 +42,12 @@
20 std::shared_ptr<InputDeviceRegistry> const& device_registry, std::shared_ptr<InputReport> const& input_report,
21 SharedLibraryProberReport & prober_report);
22
23+/// Tries to create an input platform from the graphics module, otherwise returns a null pointer
24+auto input_platform_from_graphics_module(
25+ graphics::Platform const& graphics_platform,
26+ options::Option const& options, std::shared_ptr<EmergencyCleanupRegistry> const& emergency_cleanup,
27+ std::shared_ptr<InputDeviceRegistry> const& device_registry, std::shared_ptr<InputReport> const& input_report)
28+-> mir::UniqueModulePtr<Platform>;
29 }
30 }
31
32
33=== modified file 'src/server/input/default_configuration.cpp'
34--- src/server/input/default_configuration.cpp 2016-03-02 16:38:13 +0000
35+++ src/server/input/default_configuration.cpp 2016-03-08 16:22:46 +0000
36@@ -233,15 +233,32 @@
37 auto const options = the_options();
38 bool input_opt = options->get<bool>(options::enable_input_opt);
39
40- // TODO nested input handling (== host_socket) should fold into a platform
41- if (!input_opt || options->is_set(options::host_socket_opt))
42- {
43+ if (!input_opt)
44+ {
45+ return std::make_shared<mi::NullInputManager>();
46+ }
47+ else if (options->is_set(options::host_socket_opt))
48+ {
49+ // TODO nested input handling (== host_socket) should fold into a platform
50 return std::make_shared<mi::NullInputManager>();
51 }
52 else
53 {
54- auto platform = probe_input_platforms(*options, the_emergency_cleanup(), the_input_device_registry(),
55- the_input_report(), *the_shared_library_prober_report());
56+ auto const emergency_cleanup = the_emergency_cleanup();
57+ auto const device_registry = the_input_device_registry();
58+ auto const input_report = the_input_report();
59+
60+ // Maybe the graphics platform also supplies input (e.g. mesa-x11 or nested)
61+ // NB this makes the (valid) assumption that graphics initializes before input
62+ auto platform = mi::input_platform_from_graphics_module(
63+ *the_graphics_platform(), *options, emergency_cleanup, device_registry, input_report);
64+
65+ // otherwise (usually) we probe for it
66+ if (!platform)
67+ {
68+ platform = probe_input_platforms(*options, emergency_cleanup, device_registry,
69+ input_report, *the_shared_library_prober_report());
70+ }
71
72 return std::make_shared<mi::DefaultInputManager>(the_input_reading_multiplexer(), std::move(platform));
73 }
74
75=== modified file 'src/server/input/input_probe.cpp'
76--- src/server/input/input_probe.cpp 2016-03-03 09:30:33 +0000
77+++ src/server/input/input_probe.cpp 2016-03-08 16:22:46 +0000
78@@ -1,5 +1,5 @@
79 /*
80- * Copyright © 2015 Canonical Ltd.
81+ * Copyright © 2015-2016 Canonical Ltd.
82 *
83 * This program is free software: you can redistribute it and/or modify it
84 * under the terms of the GNU General Public License version 3,
85@@ -25,7 +25,7 @@
86 #include "mir/shared_library_prober.h"
87 #include "mir/shared_library.h"
88 #include "mir/log.h"
89-#include "mir/module_deleter.h"
90+#include "mir/libname.h"
91
92 #include <stdexcept>
93
94@@ -39,10 +39,16 @@
95 std::shared_ptr<mir::EmergencyCleanupRegistry> const& cleanup_registry,
96 std::shared_ptr<mi::InputDeviceRegistry> const& registry, std::shared_ptr<mi::InputReport> const& report)
97 {
98-
99+ auto desc = lib.load_function<mi::DescribeModule>("describe_input_module", MIR_SERVER_INPUT_PLATFORM_VERSION)();
100 auto create = lib.load_function<mi::CreatePlatform>("create_input_platform", MIR_SERVER_INPUT_PLATFORM_VERSION);
101
102- return create(options, cleanup_registry, registry, report);
103+ auto result = create(options, cleanup_registry, registry, report);
104+
105+ mir::log_info(
106+ "Selected input driver: %s (version: %d.%d.%d)",
107+ desc->name, desc->major_version, desc->minor_version, desc->micro_version);
108+
109+ return result;
110 }
111 }
112
113@@ -63,12 +69,6 @@
114 auto const probe = module->load_function<mi::ProbePlatform>(
115 "probe_input_platform", MIR_SERVER_INPUT_PLATFORM_VERSION);
116
117- // We process the modules in descending .sonumber order so, luckily, we try mesa-x11 before evdev.
118- // But only because the graphics platform version is currently higher than the input platform version.
119- // Similarly, We only take the first found of duplicate modules, as that will be the most recent.
120- // This is a heuristic that assumes we're always looking for the most up-to-date driver,
121- // TODO find a way to coordinate the selection of mesa-x11 and input platforms
122-
123 if (probe(options) > reject_platform_priority)
124 {
125 platform_module = module;
126@@ -97,14 +97,28 @@
127 if (!platform_module)
128 BOOST_THROW_EXCEPTION(std::runtime_error{"No appropriate input platform module found"});
129
130- auto const desc = platform_module->load_function<mi::DescribeModule>(
131- "describe_input_module", MIR_SERVER_INPUT_PLATFORM_VERSION)();
132-
133- auto result = create_input_platform(*platform_module, options, emergency_cleanup, device_registry, input_report);
134-
135- mir::log_info(
136- "Selected input driver: %s (version: %d.%d.%d)",
137- desc->name, desc->major_version, desc->minor_version, desc->micro_version);
138-
139- return result;
140+ return create_input_platform(*platform_module, options, emergency_cleanup, device_registry, input_report);
141+}
142+
143+auto mi::input_platform_from_graphics_module(
144+ graphics::Platform const& graphics_platform,
145+ options::Option const& options,
146+ std::shared_ptr<EmergencyCleanupRegistry> const& emergency_cleanup,
147+ std::shared_ptr<InputDeviceRegistry> const& device_registry,
148+ std::shared_ptr<InputReport> const& input_report)
149+-> mir::UniqueModulePtr<Platform>
150+{
151+ try
152+ {
153+ // Yes, this is dirty code that assumes the object layout. Sorry!
154+ auto* const vtab = (void*&)(graphics_platform);
155+ SharedLibrary const platform_module{detail::libname_impl(vtab)};
156+
157+ return create_input_platform(platform_module, options, emergency_cleanup, device_registry, input_report);
158+ }
159+ catch (std::runtime_error const&)
160+ {
161+ // Assume the graphics platform is not also an input module.
162+ return {};
163+ }
164 }

Subscribers

People subscribed via source and target branches