Mir

Merge lp:~vanvugt/mir/fix-missing-vsync into lp:mir

Proposed by Daniel van Vugt
Status: Merged
Merged at revision: 4008
Proposed branch: lp:~vanvugt/mir/fix-missing-vsync
Merge into: lp:mir
Diff against target: 77 lines (+51/-3)
2 files modified
src/client/mir_surface.cpp (+14/-2)
tests/unit-tests/client/test_client_mir_surface.cpp (+37/-1)
To merge this branch: bzr merge lp:~vanvugt/mir/fix-missing-vsync
Reviewer Review Type Date Requested Status
Mir CI Bot continuous-integration Needs Fixing
Alberto Aguirre (community) Approve
Kevin DuBois (community) Approve
Review via email: mp+316200@code.launchpad.net

Commit message

Fix missing vsync in clients that create windows with custom streams
in the creation spec (i.e. nested servers like Unity8).
Fixes LP: #1661128 and LP: #1661072

Description of the change

The problem didn't show up in manual testing because our demo servers are an order of magnitude faster than Unity8, so appeared to be smooth even when not in sync. But it was easy to see the problem using MIR_CLIENT_PERF_REPORT=log on a nested server (with a frame dropping client).

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

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

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

review: Approve (continuous-integration)
Revision history for this message
Kevin DuBois (kdub) wrote :

lgtm

review: Approve
Revision history for this message
Alberto Aguirre (albaguirre) wrote :

Ok.

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

FAILED: Autolanding.
More details in the following jenkins job:
https://mir-jenkins.ubuntu.com/job/mir-autolanding/1063/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3866/console
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/1121/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3945
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3935
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3935
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/3935
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/3893/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3893
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3893/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/3893
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/3893/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/3893
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3893/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/3893
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3893/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/3893
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3893/artifact/output/*zip*/output.zip

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

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/client/mir_surface.cpp'
2--- src/client/mir_surface.cpp 2017-01-18 05:00:05 +0000
3+++ src/client/mir_surface.cpp 2017-02-02 09:31:49 +0000
4@@ -144,11 +144,23 @@
5 output_id(spec.output_id.is_set() ? spec.output_id.value() : static_cast<uint32_t>(mir_display_output_id_invalid))
6 {
7 if (default_stream)
8- {
9 streams.insert(default_stream);
10- default_stream->adopted_by(this);
11+
12+ if (spec.streams.is_set())
13+ {
14+ auto& map = connection_->connection_surface_map();
15+ auto const& spec_streams = spec.streams.value();
16+ for (auto& ci : spec_streams)
17+ {
18+ mir::frontend::BufferStreamId id(ci.stream_id);
19+ if (auto bs = map->stream(id))
20+ streams.insert(bs);
21+ }
22 }
23
24+ for (auto& s : streams)
25+ s->adopted_by(this);
26+
27 for(int i = 0; i < surface_proto.attributes_size(); i++)
28 {
29 auto const& attrib = surface_proto.attributes(i);
30
31=== modified file 'tests/unit-tests/client/test_client_mir_surface.cpp'
32--- tests/unit-tests/client/test_client_mir_surface.cpp 2017-01-30 05:18:36 +0000
33+++ tests/unit-tests/client/test_client_mir_surface.cpp 2017-02-02 09:31:49 +0000
34@@ -441,7 +441,43 @@
35 EXPECT_EQ(adopted_by, unadopted_by);
36 }
37
38-TEST_F(MirClientSurfaceTest, adopts_custom_streams_if_set)
39+TEST_F(MirClientSurfaceTest, adopts_custom_streams_set_before_construction)
40+{ // Regression test for nested server bugs LP: #1661128, LP: #1661072
41+ using namespace ::testing;
42+
43+ mir::frontend::BufferStreamId const mock_stream_id(777888);
44+ auto mock_input_platform = std::make_shared<MockClientInputPlatform>();
45+ auto mock_stream = std::make_shared<mtd::MockMirBufferStream>();
46+
47+ MirWindow* adopted_by = nullptr;
48+ MirWindow* unadopted_by = nullptr;
49+ ON_CALL(*mock_stream, rpc_id())
50+ .WillByDefault(Return(mock_stream_id));
51+ EXPECT_CALL(*mock_stream, adopted_by(_))
52+ .WillOnce(SaveArg<0>(&adopted_by));
53+ EXPECT_CALL(*mock_stream, unadopted_by(_))
54+ .WillOnce(SaveArg<0>(&unadopted_by));
55+
56+ surface_map->insert(mock_stream_id, mock_stream);
57+
58+ {
59+ MirWindowSpec spec;
60+ std::vector<ContentInfo> replacements
61+ {
62+ {geom::Displacement{0,0}, mock_stream_id.as_value(), geom::Size{1,1}}
63+ };
64+ spec.streams = replacements;
65+ MirWindow win{connection.get(), *client_comm_channel, nullptr,
66+ nullptr, mock_input_platform, spec, surface_proto, wh};
67+ ASSERT_EQ(&win, adopted_by);
68+ ASSERT_EQ(nullptr, unadopted_by);
69+ }
70+
71+ EXPECT_NE(nullptr, unadopted_by);
72+ EXPECT_EQ(adopted_by, unadopted_by);
73+}
74+
75+TEST_F(MirClientSurfaceTest, adopts_custom_streams_set_after_construction)
76 {
77 using namespace testing;
78

Subscribers

People subscribed via source and target branches