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
=== modified file 'tests/acceptance-tests/test_latency.cpp'
--- tests/acceptance-tests/test_latency.cpp 2016-04-11 16:56:16 +0000
+++ tests/acceptance-tests/test_latency.cpp 2016-04-12 04:59:57 +0000
@@ -32,7 +32,7 @@
32#include <gtest/gtest.h>32#include <gtest/gtest.h>
33#include <gmock/gmock.h>33#include <gmock/gmock.h>
34#include <deque>34#include <deque>
3535#include <atomic>
36#include <mutex>36#include <mutex>
37#include <condition_variable>37#include <condition_variable>
3838
@@ -116,6 +116,12 @@
116 };116 };
117 std::deque<Submission> submissions;117 std::deque<Submission> submissions;
118};118};
119
120struct Options
121{
122 std::atomic_bool simulate_overlays{false};
123};
124
119/*125/*
120 * Note: we're not aiming to check performance in terms of CPU or GPU time processing126 * Note: we're not aiming to check performance in terms of CPU or GPU time processing
121 * the incoming buffers. Rather, we're checking that we don't have any intrinsic127 * the incoming buffers. Rather, we're checking that we don't have any intrinsic
@@ -124,6 +130,8 @@
124class IdCollectingDB : public mtd::NullDisplayBuffer130class IdCollectingDB : public mtd::NullDisplayBuffer
125{131{
126public:132public:
133 IdCollectingDB(Options const& opt) : options{opt} {}
134
127 mir::geometry::Rectangle view_area() const override135 mir::geometry::Rectangle view_area() const override
128 {136 {
129 return {{0,0}, {1920, 1080}};137 return {{0,0}, {1920, 1080}};
@@ -131,24 +139,43 @@
131139
132 bool post_renderables_if_optimizable(mg::RenderableList const& renderables) override140 bool post_renderables_if_optimizable(mg::RenderableList const& renderables) override
133 {141 {
142 if (options.simulate_overlays)
143 prev_onscreen = next_onscreen;
144
134 //the surface will be the frontmost of the renderables145 //the surface will be the frontmost of the renderables
135 if (!renderables.empty())146 if (!renderables.empty())
136 last = renderables.front()->buffer()->id();147 {
148 auto buffer = renderables.front()->buffer();
149 the_last_id = buffer->id();
150 if (options.simulate_overlays)
151 next_onscreen = buffer;
152 }
137153
138 return true;154 return true;
139 }155 }
156
157 void swap_completed()
158 {
159 prev_onscreen.reset();
160 }
161
140 mg::BufferID last_id()162 mg::BufferID last_id()
141 {163 {
142 return last;164 return the_last_id;
143 }165 }
144private:166private:
145 mg::BufferID last{0};167 Options const& options;
168 mg::BufferID the_last_id{0};
169 std::shared_ptr<mg::Buffer> next_onscreen, prev_onscreen;
146};170};
147171
148class TimeTrackingGroup : public mtd::NullDisplaySyncGroup172class TimeTrackingGroup : public mtd::NullDisplaySyncGroup
149{173{
150public:174public:
151 TimeTrackingGroup(Stats& stats) : stats{stats} {}175 TimeTrackingGroup(Stats& stats, Options const& opt)
176 : stats{stats}, db(opt)
177 {
178 }
152179
153 void for_each_display_buffer(std::function<void(mg::DisplayBuffer&)> const& f) override180 void for_each_display_buffer(std::function<void(mg::DisplayBuffer&)> const& f) override
154 {181 {
@@ -175,6 +202,7 @@
175 * latency would never exceed 1.0. (LP: #1447947)202 * latency would never exceed 1.0. (LP: #1447947)
176 */203 */
177 std::this_thread::sleep_for(vblank_interval);204 std::this_thread::sleep_for(vblank_interval);
205 db.swap_completed();
178 }206 }
179207
180 float average_latency()208 float average_latency()
@@ -224,8 +252,8 @@
224252
225struct TimeTrackingDisplay : mtd::NullDisplay253struct TimeTrackingDisplay : mtd::NullDisplay
226{254{
227 TimeTrackingDisplay(Stats& stats)255 TimeTrackingDisplay(Stats& stats, Options const& opt)
228 : group{stats}256 : group(stats, opt)
229 {257 {
230 }258 }
231259
@@ -240,6 +268,7 @@
240{268{
241 void SetUp() override269 void SetUp() override
242 {270 {
271 options.simulate_overlays = false;
243 preset_display(mt::fake_shared(display));272 preset_display(mt::fake_shared(display));
244 mtf::ConnectedClientHeadlessServer::SetUp();273 mtf::ConnectedClientHeadlessServer::SetUp();
245274
@@ -259,7 +288,8 @@
259 }288 }
260289
261 Stats stats;290 Stats stats;
262 TimeTrackingDisplay display{stats};291 Options options;
292 TimeTrackingDisplay display{stats, options};
263 unsigned int test_submissions{100};293 unsigned int test_submissions{100};
264294
265 // We still have a margin for error here. The client and server will295 // We still have a margin for error here. The client and server will
@@ -296,6 +326,39 @@
296 EXPECT_THAT(observed_latency, Lt(expected_max_latency+error_margin));326 EXPECT_THAT(observed_latency, Lt(expected_max_latency+error_margin));
297}327}
298328
329/*
330 * Overlays/bypass wasn't ever expected to reduce latency, but a quirk of
331 * the algorithm means it does. When you have a buffer overlayed on screen,
332 * you need to hold it till after you have guaranteed that it's been replaced
333 * and definitely not on screen any more. This means the compositor holds
334 * an overlay/bypass buffer for one frame longer than it would for GL.
335 */
336TEST_F(ClientLatency, overlayed_client_has_latency_nbuffers_minus_2)
337{
338 using namespace testing;
339
340 options.simulate_overlays = true;
341
342 auto stream = mir_surface_get_buffer_stream(surface);
343 for(auto i = 0u; i < test_submissions; i++) {
344 auto submission_id = mir_debug_surface_current_buffer_id(surface);
345 stats.record_submission(submission_id);
346 mir_buffer_stream_swap_buffers_sync(stream);
347 }
348
349 ASSERT_TRUE(stats.wait_for_posts(test_submissions,
350 std::chrono::seconds(60)));
351
352 float const expected_max_latency = expected_client_buffers - 2;
353
354 if (server.get_options()->get<bool>(mtd::logging_opt))
355 display.group.dump_latency();
356
357 auto observed_latency = display.group.average_latency();
358
359 EXPECT_THAT(observed_latency, Lt(expected_max_latency+error_margin));
360}
361
299TEST_F(ClientLatency, latency_is_limited_to_nbuffers)362TEST_F(ClientLatency, latency_is_limited_to_nbuffers)
300{363{
301 using namespace testing;364 using namespace testing;

Subscribers

People subscribed via source and target branches