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
=== modified file 'src/include/server/mir/input/input_probe.h'
--- src/include/server/mir/input/input_probe.h 2016-03-02 14:54:07 +0000
+++ src/include/server/mir/input/input_probe.h 2016-03-08 16:22:46 +0000
@@ -1,5 +1,5 @@
1/*1/*
2 * Copyright © 2015 Canonical Ltd.2 * Copyright © 2015-2016 Canonical Ltd.
3 *3 *
4 * This program is free software: you can redistribute it and/or modify it4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 3,5 * under the terms of the GNU General Public License version 3,
@@ -23,6 +23,7 @@
2323
24namespace mir24namespace mir
25{25{
26namespace graphics { class Platform; }
26namespace options27namespace options
27{28{
28class Option;29class Option;
@@ -41,6 +42,12 @@
41 std::shared_ptr<InputDeviceRegistry> const& device_registry, std::shared_ptr<InputReport> const& input_report,42 std::shared_ptr<InputDeviceRegistry> const& device_registry, std::shared_ptr<InputReport> const& input_report,
42 SharedLibraryProberReport & prober_report);43 SharedLibraryProberReport & prober_report);
4344
45/// Tries to create an input platform from the graphics module, otherwise returns a null pointer
46auto input_platform_from_graphics_module(
47 graphics::Platform const& graphics_platform,
48 options::Option const& options, std::shared_ptr<EmergencyCleanupRegistry> const& emergency_cleanup,
49 std::shared_ptr<InputDeviceRegistry> const& device_registry, std::shared_ptr<InputReport> const& input_report)
50-> mir::UniqueModulePtr<Platform>;
44}51}
45}52}
4653
4754
=== modified file 'src/server/input/default_configuration.cpp'
--- src/server/input/default_configuration.cpp 2016-03-02 16:38:13 +0000
+++ src/server/input/default_configuration.cpp 2016-03-08 16:22:46 +0000
@@ -233,15 +233,32 @@
233 auto const options = the_options();233 auto const options = the_options();
234 bool input_opt = options->get<bool>(options::enable_input_opt);234 bool input_opt = options->get<bool>(options::enable_input_opt);
235235
236 // TODO nested input handling (== host_socket) should fold into a platform236 if (!input_opt)
237 if (!input_opt || options->is_set(options::host_socket_opt))237 {
238 {238 return std::make_shared<mi::NullInputManager>();
239 }
240 else if (options->is_set(options::host_socket_opt))
241 {
242 // TODO nested input handling (== host_socket) should fold into a platform
239 return std::make_shared<mi::NullInputManager>();243 return std::make_shared<mi::NullInputManager>();
240 }244 }
241 else245 else
242 {246 {
243 auto platform = probe_input_platforms(*options, the_emergency_cleanup(), the_input_device_registry(),247 auto const emergency_cleanup = the_emergency_cleanup();
244 the_input_report(), *the_shared_library_prober_report());248 auto const device_registry = the_input_device_registry();
249 auto const input_report = the_input_report();
250
251 // Maybe the graphics platform also supplies input (e.g. mesa-x11 or nested)
252 // NB this makes the (valid) assumption that graphics initializes before input
253 auto platform = mi::input_platform_from_graphics_module(
254 *the_graphics_platform(), *options, emergency_cleanup, device_registry, input_report);
255
256 // otherwise (usually) we probe for it
257 if (!platform)
258 {
259 platform = probe_input_platforms(*options, emergency_cleanup, device_registry,
260 input_report, *the_shared_library_prober_report());
261 }
245262
246 return std::make_shared<mi::DefaultInputManager>(the_input_reading_multiplexer(), std::move(platform));263 return std::make_shared<mi::DefaultInputManager>(the_input_reading_multiplexer(), std::move(platform));
247 }264 }
248265
=== modified file 'src/server/input/input_probe.cpp'
--- src/server/input/input_probe.cpp 2016-03-03 09:30:33 +0000
+++ src/server/input/input_probe.cpp 2016-03-08 16:22:46 +0000
@@ -1,5 +1,5 @@
1/*1/*
2 * Copyright © 2015 Canonical Ltd.2 * Copyright © 2015-2016 Canonical Ltd.
3 *3 *
4 * This program is free software: you can redistribute it and/or modify it4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 3,5 * under the terms of the GNU General Public License version 3,
@@ -25,7 +25,7 @@
25#include "mir/shared_library_prober.h"25#include "mir/shared_library_prober.h"
26#include "mir/shared_library.h"26#include "mir/shared_library.h"
27#include "mir/log.h"27#include "mir/log.h"
28#include "mir/module_deleter.h"28#include "mir/libname.h"
2929
30#include <stdexcept>30#include <stdexcept>
3131
@@ -39,10 +39,16 @@
39 std::shared_ptr<mir::EmergencyCleanupRegistry> const& cleanup_registry,39 std::shared_ptr<mir::EmergencyCleanupRegistry> const& cleanup_registry,
40 std::shared_ptr<mi::InputDeviceRegistry> const& registry, std::shared_ptr<mi::InputReport> const& report)40 std::shared_ptr<mi::InputDeviceRegistry> const& registry, std::shared_ptr<mi::InputReport> const& report)
41{41{
4242 auto desc = lib.load_function<mi::DescribeModule>("describe_input_module", MIR_SERVER_INPUT_PLATFORM_VERSION)();
43 auto create = lib.load_function<mi::CreatePlatform>("create_input_platform", MIR_SERVER_INPUT_PLATFORM_VERSION);43 auto create = lib.load_function<mi::CreatePlatform>("create_input_platform", MIR_SERVER_INPUT_PLATFORM_VERSION);
4444
45 return create(options, cleanup_registry, registry, report);45 auto result = create(options, cleanup_registry, registry, report);
46
47 mir::log_info(
48 "Selected input driver: %s (version: %d.%d.%d)",
49 desc->name, desc->major_version, desc->minor_version, desc->micro_version);
50
51 return result;
46}52}
47}53}
4854
@@ -63,12 +69,6 @@
63 auto const probe = module->load_function<mi::ProbePlatform>(69 auto const probe = module->load_function<mi::ProbePlatform>(
64 "probe_input_platform", MIR_SERVER_INPUT_PLATFORM_VERSION);70 "probe_input_platform", MIR_SERVER_INPUT_PLATFORM_VERSION);
6571
66 // We process the modules in descending .sonumber order so, luckily, we try mesa-x11 before evdev.
67 // But only because the graphics platform version is currently higher than the input platform version.
68 // Similarly, We only take the first found of duplicate modules, as that will be the most recent.
69 // This is a heuristic that assumes we're always looking for the most up-to-date driver,
70 // TODO find a way to coordinate the selection of mesa-x11 and input platforms
71
72 if (probe(options) > reject_platform_priority)72 if (probe(options) > reject_platform_priority)
73 {73 {
74 platform_module = module;74 platform_module = module;
@@ -97,14 +97,28 @@
97 if (!platform_module)97 if (!platform_module)
98 BOOST_THROW_EXCEPTION(std::runtime_error{"No appropriate input platform module found"});98 BOOST_THROW_EXCEPTION(std::runtime_error{"No appropriate input platform module found"});
9999
100 auto const desc = platform_module->load_function<mi::DescribeModule>(100 return create_input_platform(*platform_module, options, emergency_cleanup, device_registry, input_report);
101 "describe_input_module", MIR_SERVER_INPUT_PLATFORM_VERSION)();101}
102102
103 auto result = create_input_platform(*platform_module, options, emergency_cleanup, device_registry, input_report);103auto mi::input_platform_from_graphics_module(
104104 graphics::Platform const& graphics_platform,
105 mir::log_info(105 options::Option const& options,
106 "Selected input driver: %s (version: %d.%d.%d)",106 std::shared_ptr<EmergencyCleanupRegistry> const& emergency_cleanup,
107 desc->name, desc->major_version, desc->minor_version, desc->micro_version);107 std::shared_ptr<InputDeviceRegistry> const& device_registry,
108108 std::shared_ptr<InputReport> const& input_report)
109 return result;109-> mir::UniqueModulePtr<Platform>
110{
111 try
112 {
113 // Yes, this is dirty code that assumes the object layout. Sorry!
114 auto* const vtab = (void*&)(graphics_platform);
115 SharedLibrary const platform_module{detail::libname_impl(vtab)};
116
117 return create_input_platform(platform_module, options, emergency_cleanup, device_registry, input_report);
118 }
119 catch (std::runtime_error const&)
120 {
121 // Assume the graphics platform is not also an input module.
122 return {};
123 }
110}124}

Subscribers

People subscribed via source and target branches