Mir

Merge lp:~vanvugt/mir/ClientLatency-of-overlays into lp:mir

Proposed by Daniel van Vugt
Status: Work in progress
Proposed branch: lp:~vanvugt/mir/ClientLatency-of-overlays
Merge into: lp:mir
Prerequisite: lp:~vanvugt/mir/fix-ClientLatency-of-zero
Diff against target: 159 lines (+71/-8)
1 file modified
tests/acceptance-tests/test_latency.cpp (+71/-8)
To merge this branch: bzr merge lp:~vanvugt/mir/ClientLatency-of-overlays
Reviewer Review Type Date Requested Status
Mir CI Bot continuous-integration Needs Fixing
Mir development team Pending
Review via email: mp+291348@code.launchpad.net

Commit message

Add a new ClientLatency acceptance test showing how bypass/overlays
actually make latency one frame lower.

Admittedly this is kind of the test testing itself, but it's instructive
anyway.

Description of the change

This was another one of the discoveries to come out of 'mirvanity'.
It does raise an interesting issue though -- if the latency of an
overlay triple-buffered surface is one frame, then that means there's only
one frame of pre-rendering and it doesn't have the smoothness guarantees
that triple buffering usually provides. It's actually only guaranteed the
smoothness of double-buffering (unless you allocate quad buffers).

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

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

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

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

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

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

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

^ The krillin failure is bug 1556045 again.

3451. By Daniel van Vugt

No change

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

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

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

review: Needs Fixing (continuous-integration)
3452. By Daniel van Vugt

Merge latest trunk

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

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

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

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

Sigh. krillin in CI is apparently too slow to pass that new test. But it wasn't too important...

Unmerged revisions

3452. By Daniel van Vugt

Merge latest trunk

3451. By Daniel van Vugt

No change

3450. By Daniel van Vugt

Use a struct instead of bitfield

3449. By Daniel van Vugt

Better comment

3448. By Daniel van Vugt

Enable overlay simulation. Now the test passes.

3447. By Daniel van Vugt

Add overlays test. Presently fails.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'tests/acceptance-tests/test_latency.cpp'
2--- tests/acceptance-tests/test_latency.cpp 2016-04-11 16:56:16 +0000
3+++ tests/acceptance-tests/test_latency.cpp 2016-04-12 04:59:57 +0000
4@@ -32,7 +32,7 @@
5 #include <gtest/gtest.h>
6 #include <gmock/gmock.h>
7 #include <deque>
8-
9+#include <atomic>
10 #include <mutex>
11 #include <condition_variable>
12
13@@ -116,6 +116,12 @@
14 };
15 std::deque<Submission> submissions;
16 };
17+
18+struct Options
19+{
20+ std::atomic_bool simulate_overlays{false};
21+};
22+
23 /*
24 * Note: we're not aiming to check performance in terms of CPU or GPU time processing
25 * the incoming buffers. Rather, we're checking that we don't have any intrinsic
26@@ -124,6 +130,8 @@
27 class IdCollectingDB : public mtd::NullDisplayBuffer
28 {
29 public:
30+ IdCollectingDB(Options const& opt) : options{opt} {}
31+
32 mir::geometry::Rectangle view_area() const override
33 {
34 return {{0,0}, {1920, 1080}};
35@@ -131,24 +139,43 @@
36
37 bool post_renderables_if_optimizable(mg::RenderableList const& renderables) override
38 {
39+ if (options.simulate_overlays)
40+ prev_onscreen = next_onscreen;
41+
42 //the surface will be the frontmost of the renderables
43 if (!renderables.empty())
44- last = renderables.front()->buffer()->id();
45+ {
46+ auto buffer = renderables.front()->buffer();
47+ the_last_id = buffer->id();
48+ if (options.simulate_overlays)
49+ next_onscreen = buffer;
50+ }
51
52 return true;
53 }
54+
55+ void swap_completed()
56+ {
57+ prev_onscreen.reset();
58+ }
59+
60 mg::BufferID last_id()
61 {
62- return last;
63+ return the_last_id;
64 }
65 private:
66- mg::BufferID last{0};
67+ Options const& options;
68+ mg::BufferID the_last_id{0};
69+ std::shared_ptr<mg::Buffer> next_onscreen, prev_onscreen;
70 };
71
72 class TimeTrackingGroup : public mtd::NullDisplaySyncGroup
73 {
74 public:
75- TimeTrackingGroup(Stats& stats) : stats{stats} {}
76+ TimeTrackingGroup(Stats& stats, Options const& opt)
77+ : stats{stats}, db(opt)
78+ {
79+ }
80
81 void for_each_display_buffer(std::function<void(mg::DisplayBuffer&)> const& f) override
82 {
83@@ -175,6 +202,7 @@
84 * latency would never exceed 1.0. (LP: #1447947)
85 */
86 std::this_thread::sleep_for(vblank_interval);
87+ db.swap_completed();
88 }
89
90 float average_latency()
91@@ -224,8 +252,8 @@
92
93 struct TimeTrackingDisplay : mtd::NullDisplay
94 {
95- TimeTrackingDisplay(Stats& stats)
96- : group{stats}
97+ TimeTrackingDisplay(Stats& stats, Options const& opt)
98+ : group(stats, opt)
99 {
100 }
101
102@@ -240,6 +268,7 @@
103 {
104 void SetUp() override
105 {
106+ options.simulate_overlays = false;
107 preset_display(mt::fake_shared(display));
108 mtf::ConnectedClientHeadlessServer::SetUp();
109
110@@ -259,7 +288,8 @@
111 }
112
113 Stats stats;
114- TimeTrackingDisplay display{stats};
115+ Options options;
116+ TimeTrackingDisplay display{stats, options};
117 unsigned int test_submissions{100};
118
119 // We still have a margin for error here. The client and server will
120@@ -296,6 +326,39 @@
121 EXPECT_THAT(observed_latency, Lt(expected_max_latency+error_margin));
122 }
123
124+/*
125+ * Overlays/bypass wasn't ever expected to reduce latency, but a quirk of
126+ * the algorithm means it does. When you have a buffer overlayed on screen,
127+ * you need to hold it till after you have guaranteed that it's been replaced
128+ * and definitely not on screen any more. This means the compositor holds
129+ * an overlay/bypass buffer for one frame longer than it would for GL.
130+ */
131+TEST_F(ClientLatency, overlayed_client_has_latency_nbuffers_minus_2)
132+{
133+ using namespace testing;
134+
135+ options.simulate_overlays = true;
136+
137+ auto stream = mir_surface_get_buffer_stream(surface);
138+ for(auto i = 0u; i < test_submissions; i++) {
139+ auto submission_id = mir_debug_surface_current_buffer_id(surface);
140+ stats.record_submission(submission_id);
141+ mir_buffer_stream_swap_buffers_sync(stream);
142+ }
143+
144+ ASSERT_TRUE(stats.wait_for_posts(test_submissions,
145+ std::chrono::seconds(60)));
146+
147+ float const expected_max_latency = expected_client_buffers - 2;
148+
149+ if (server.get_options()->get<bool>(mtd::logging_opt))
150+ display.group.dump_latency();
151+
152+ auto observed_latency = display.group.average_latency();
153+
154+ EXPECT_THAT(observed_latency, Lt(expected_max_latency+error_margin));
155+}
156+
157 TEST_F(ClientLatency, latency_is_limited_to_nbuffers)
158 {
159 using namespace testing;

Subscribers

People subscribed via source and target branches