Mir

Merge lp:~andreas-pokorny/mir/preserve-framebuffer-on-compatible-configurations-in-stub-graphics into lp:mir

Proposed by Andreas Pokorny
Status: Merged
Approved by: Alan Griffiths
Approved revision: no longer in the source branch.
Merged at revision: 3821
Proposed branch: lp:~andreas-pokorny/mir/preserve-framebuffer-on-compatible-configurations-in-stub-graphics
Merge into: lp:mir
Diff against target: 106 lines (+42/-3)
3 files modified
include/test/mir/test/doubles/fake_display.h (+3/-1)
tests/mir_test_doubles/fake_display.cpp (+37/-0)
tests/mir_test_framework/stubbed_graphics_platform.cpp (+2/-2)
To merge this branch: bzr merge lp:~andreas-pokorny/mir/preserve-framebuffer-on-compatible-configurations-in-stub-graphics
Reviewer Review Type Date Requested Status
Alan Griffiths Approve
Chris Halse Rogers Approve
Mir CI Bot continuous-integration Approve
Review via email: mp+310412@code.launchpad.net

Commit message

Make FakeDisplay preserve display buffers when the displayed region stays unchanged

Description of the change

This is a split out of the input configuration work. This change avoids a compositor thread shut down in tests that use only a single simulated display. The stopping of the compositor threads marks the nested surfaces occluded - hence cannot receive input for some time. That time frame is hard to track from the outside.

The rules for preserving the display buffers are based on what kms currently does.

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

PASSED: Continuous integration, rev:3811
https://mir-jenkins.ubuntu.com/job/mir-ci/2137/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/2768
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/2831
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2823
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2823
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2823
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2797
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2797/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2797
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2797/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2797
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2797/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/2797
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/2797/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/2797
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2797/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2797
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2797/artifact/output/*zip*/output.zip

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

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

FAILED: Continuous integration, rev:3812
https://mir-jenkins.ubuntu.com/job/mir-ci/2138/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/2769/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/2832
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2824
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2824
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2824
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2798
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2798/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2798/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2798
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2798/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/2798
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/2798/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/2798
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2798/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2798
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2798/artifact/output/*zip*/output.zip

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

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

PASSED: Continuous integration, rev:3812
https://mir-jenkins.ubuntu.com/job/mir-ci/2139/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/2770
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/2835
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2827
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2827
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2827
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2799
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2799/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2799
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2799/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2799
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2799/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/2799
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/2799/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/2799
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2799/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2799
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2799/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Again, please avoid the long branch names. It messes with Launchpad webpage formatting.

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

Huh. I was sure I'd already reviewed this.

It's conservative - compatible() will return false in lots of cases where DisplayBuffers would not need to be invalidated - but so are all the real hardware implementations.

review: Approve
Revision history for this message
Andreas Pokorny (andreas-pokorny) wrote :

> Huh. I was sure I'd already reviewed this.
>
> It's conservative - compatible() will return false in lots of cases where
> DisplayBuffers would not need to be invalidated - but so are all the real
> hardware implementations.

yes thats the motivation.. I think we could reduce the invalidating cases in the hardware implementations, i.e. we could make the position of the db not be part of the db - but just an information the compositors get from the configuration. Then we can come back here and maybe reiterate on the behavior of fake display.

Revision history for this message
Andreas Pokorny (andreas-pokorny) wrote :

> Huh. I was sure I'd already reviewed this.
>
> It's conservative - compatible() will return false in lots of cases where
> DisplayBuffers would not need to be invalidated - but so are all the real
> hardware implementations.

yes thats the motivation.. I think we could reduce the invalidating cases in the hardware implementations, i.e. we could make the position of the db not be part of the db - but just an information the compositors get from the configuration. Then we can come back here and maybe reiterate on the behavior of fake display.

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

+ auto new_configuration = std::make_shared<StubDisplayConfig>(new_config);

We could probably arrange to defer creating this object until we've tested compatibility, but that's no blocker.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'include/test/mir/test/doubles/fake_display.h'
2--- include/test/mir/test/doubles/fake_display.h 2016-09-06 06:14:17 +0000
3+++ include/test/mir/test/doubles/fake_display.h 2016-11-09 15:08:34 +0000
4@@ -34,6 +34,7 @@
5 {
6 namespace doubles
7 {
8+class StubDisplayConfig;
9 class FakeDisplay : public NullDisplay
10 {
11 public:
12@@ -49,6 +50,7 @@
13 mir::graphics::EventHandlerRegister& handlers,
14 mir::graphics::DisplayConfigurationChangeHandler const& handler) override;
15
16+ bool apply_if_configuration_preserves_display_buffers(graphics::DisplayConfiguration const&) override;
17 void configure(mir::graphics::DisplayConfiguration const&) override;
18
19 void emit_configuration_change_event(
20@@ -57,7 +59,7 @@
21 void wait_for_configuration_change_handler();
22
23 private:
24- std::shared_ptr<mir::graphics::DisplayConfiguration> config;
25+ std::shared_ptr<StubDisplayConfig> config;
26 std::vector<std::unique_ptr<StubDisplaySyncGroup>> groups;
27 Fd const wakeup_trigger;
28 std::atomic<bool> handler_called;
29
30=== modified file 'tests/mir_test_doubles/fake_display.cpp'
31--- tests/mir_test_doubles/fake_display.cpp 2016-09-06 06:14:17 +0000
32+++ tests/mir_test_doubles/fake_display.cpp 2016-11-09 15:08:34 +0000
33@@ -29,7 +29,30 @@
34 #include <sys/eventfd.h>
35
36 namespace mtd = mir::test::doubles;
37+namespace mg = mir::graphics;
38
39+namespace
40+{
41+bool compatible(mtd::StubDisplayConfig const& conf1, mtd::StubDisplayConfig const& conf2)
42+{
43+ auto compatible =
44+ conf1.cards == conf2.cards &&
45+ conf1.outputs.size() == conf2.outputs.size() &&
46+ std::equal(begin(conf1.outputs), end(conf1.outputs),
47+ begin(conf2.outputs),
48+ [] (mg::DisplayConfigurationOutput const& output1, mg::DisplayConfigurationOutput const& output2)
49+ {
50+ // ignore difference in orientation, scale factor, form factor, subpixel arrangement
51+ auto clone = output2;
52+ clone.orientation = output1.orientation;
53+ clone.subpixel_arrangement = output1.subpixel_arrangement;
54+ clone.scale = output1.scale;
55+ clone.form_factor = output1.form_factor;
56+ return clone == output1;
57+ });
58+ return compatible;
59+}
60+}
61
62 mtd::FakeDisplay::FakeDisplay()
63 : config{std::make_shared<StubDisplayConfig>()},
64@@ -90,6 +113,20 @@
65 });
66 }
67
68+bool mtd::FakeDisplay::apply_if_configuration_preserves_display_buffers(graphics::DisplayConfiguration const& new_config)
69+{
70+ auto new_configuration = std::make_shared<StubDisplayConfig>(new_config);
71+
72+ std::lock_guard<decltype(configuration_mutex)> lock{configuration_mutex};
73+ if (compatible(*config, *new_configuration))
74+ {
75+ std::swap(config, new_configuration);
76+ return true;
77+ }
78+
79+ return false;
80+}
81+
82 void mtd::FakeDisplay::configure(mir::graphics::DisplayConfiguration const& new_config)
83 {
84 std::lock_guard<decltype(configuration_mutex)> lock{configuration_mutex};
85
86=== modified file 'tests/mir_test_framework/stubbed_graphics_platform.cpp'
87--- tests/mir_test_framework/stubbed_graphics_platform.cpp 2016-11-08 08:15:29 +0000
88+++ tests/mir_test_framework/stubbed_graphics_platform.cpp 2016-11-09 15:08:34 +0000
89@@ -26,7 +26,7 @@
90
91 #include "mir_toolkit/common.h"
92 #include "mir/test/doubles/stub_buffer_allocator.h"
93-#include "mir/test/doubles/stub_display.h"
94+#include "mir/test/doubles/fake_display.h"
95 #include "mir/fd.h"
96 #include "mir/assert_module_entry_point.h"
97 #include "mir/test/pipe.h"
98@@ -258,7 +258,7 @@
99 return mir::make_module_ptr<WrappingDisplay>(temp);
100 }
101
102- return mir::make_module_ptr<mtd::StubDisplay>(display_rects);
103+ return mir::make_module_ptr<mtd::FakeDisplay>(display_rects);
104 }
105
106 namespace

Subscribers

People subscribed via source and target branches