Mir

Merge lp:~afrantzis/mir/drop-stale-frames into lp:mir

Proposed by Alexandros Frantzis
Status: Merged
Approved by: Alan Griffiths
Approved revision: no longer in the source branch.
Merged at revision: 1796
Proposed branch: lp:~afrantzis/mir/drop-stale-frames
Merge into: lp:mir
Diff against target: 531 lines (+315/-18)
15 files modified
include/server/mir/compositor/buffer_stream.h (+1/-0)
include/test/mir_test_doubles/mock_buffer_bundle.h (+1/-0)
include/test/mir_test_doubles/mock_buffer_stream.h (+1/-0)
include/test/mir_test_doubles/stub_buffer_stream.h (+2/-0)
server-ABI-sha1sums (+1/-1)
src/server/compositor/buffer_bundle.h (+1/-0)
src/server/compositor/buffer_queue.cpp (+30/-1)
src/server/compositor/buffer_queue.h (+2/-0)
src/server/compositor/buffer_stream_surfaces.cpp (+5/-0)
src/server/compositor/buffer_stream_surfaces.h (+1/-0)
src/server/scene/basic_surface.cpp (+2/-0)
tests/acceptance-tests/CMakeLists.txt (+1/-0)
tests/acceptance-tests/test_stale_frames.cpp (+206/-0)
tests/integration-tests/test_swapinterval.cpp (+2/-16)
tests/unit-tests/compositor/test_buffer_queue.cpp (+59/-0)
To merge this branch: bzr merge lp:~afrantzis/mir/drop-stale-frames
Reviewer Review Type Date Requested Status
Kevin DuBois (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Robert Carr (community) Approve
Alan Griffiths Approve
Review via email: mp+227961@code.launchpad.net

Commit message

server: Drop stale frames when a surface becomes exposed

When a surface changes from occluded to exposed, at best there is no
point in showing older, stale frames in quick succession, at worst the
stale frames result in visual glitches. We only care about the latest
surface buffer.

Description of the change

server: Drop stale frames when a surface becomes exposed

When a surface changes from occluded to exposed, at best there is no
point in showing older, stale frames in quick succession, at worst the
stale frames result in visual glitches. We only care about the latest
surface buffer.

This fixes one aspect of https://bugs.launchpad.net/unity-system-compositor/+bug/1340510, the stale frame issue, the other aspect being the greeter rendering delay.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Nice

review: Approve
Revision history for this message
Robert Carr (robertcarr) wrote :

LGTM

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Kevin DuBois (kdub) wrote :

lgtm too

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'include/server/mir/compositor/buffer_stream.h'
--- include/server/mir/compositor/buffer_stream.h 2014-05-22 10:00:05 +0000
+++ include/server/mir/compositor/buffer_stream.h 2014-07-25 10:04:16 +0000
@@ -53,6 +53,7 @@
53 virtual void allow_framedropping(bool) = 0;53 virtual void allow_framedropping(bool) = 0;
54 virtual void force_requests_to_complete() = 0;54 virtual void force_requests_to_complete() = 0;
55 virtual int buffers_ready_for_compositor() const = 0;55 virtual int buffers_ready_for_compositor() const = 0;
56 virtual void drop_old_buffers() = 0;
56};57};
5758
58}59}
5960
=== modified file 'include/test/mir_test_doubles/mock_buffer_bundle.h'
--- include/test/mir_test_doubles/mock_buffer_bundle.h 2014-05-21 05:30:50 +0000
+++ include/test/mir_test_doubles/mock_buffer_bundle.h 2014-07-25 10:04:16 +0000
@@ -48,6 +48,7 @@
48 MOCK_METHOD0(force_client_abort, void());48 MOCK_METHOD0(force_client_abort, void());
49 MOCK_METHOD0(force_requests_to_complete, void());49 MOCK_METHOD0(force_requests_to_complete, void());
50 MOCK_METHOD1(resize, void(const geometry::Size &));50 MOCK_METHOD1(resize, void(const geometry::Size &));
51 MOCK_METHOD0(drop_old_buffers, void());
51 int buffers_ready_for_compositor() const override { return 1; }52 int buffers_ready_for_compositor() const override { return 1; }
52 int buffers_free_for_client() const override { return 1; }53 int buffers_free_for_client() const override { return 1; }
53};54};
5455
=== modified file 'include/test/mir_test_doubles/mock_buffer_stream.h'
--- include/test/mir_test_doubles/mock_buffer_stream.h 2014-05-22 10:00:05 +0000
+++ include/test/mir_test_doubles/mock_buffer_stream.h 2014-07-25 10:04:16 +0000
@@ -57,6 +57,7 @@
57 MOCK_METHOD1(allow_framedropping, void(bool));57 MOCK_METHOD1(allow_framedropping, void(bool));
58 MOCK_METHOD0(force_requests_to_complete, void());58 MOCK_METHOD0(force_requests_to_complete, void());
59 MOCK_CONST_METHOD0(buffers_ready_for_compositor, int());59 MOCK_CONST_METHOD0(buffers_ready_for_compositor, int());
60 MOCK_METHOD0(drop_old_buffers, void());
60};61};
61}62}
62}63}
6364
=== modified file 'include/test/mir_test_doubles/stub_buffer_stream.h'
--- include/test/mir_test_doubles/stub_buffer_stream.h 2014-05-22 10:00:05 +0000
+++ include/test/mir_test_doubles/stub_buffer_stream.h 2014-07-25 10:04:16 +0000
@@ -81,6 +81,8 @@
8181
82 int buffers_ready_for_compositor() const override { return 1; }82 int buffers_ready_for_compositor() const override { return 1; }
8383
84 void drop_old_buffers() override {}
85
84 StubBuffer stub_client_buffer;86 StubBuffer stub_client_buffer;
85 std::shared_ptr<graphics::Buffer> stub_compositor_buffer;87 std::shared_ptr<graphics::Buffer> stub_compositor_buffer;
86};88};
8789
=== modified file 'server-ABI-sha1sums'
--- server-ABI-sha1sums 2014-07-24 11:44:53 +0000
+++ server-ABI-sha1sums 2014-07-25 10:04:16 +0000
@@ -9,7 +9,7 @@
9ba79552edce545fafc9a4f401411c44d0cb3b2cf include/server/mir/graphics/gl_extensions_base.h9ba79552edce545fafc9a4f401411c44d0cb3b2cf include/server/mir/graphics/gl_extensions_base.h
107ef3e99901168cda296d74d05a979f47bf9c3ff1 include/server/mir/server_action_queue.h107ef3e99901168cda296d74d05a979f47bf9c3ff1 include/server/mir/server_action_queue.h
11a3e8658107c0c13d41eaf2ca6a1be71d1dc59df6 include/server/mir/compositor/compositor_report.h11a3e8658107c0c13d41eaf2ca6a1be71d1dc59df6 include/server/mir/compositor/compositor_report.h
12e439cc4a7fb8e975bed0771756e7949aad968c14 include/server/mir/compositor/buffer_stream.h12a4c8f0b0c30784ea6930a8ee6651f1d6efa47231 include/server/mir/compositor/buffer_stream.h
13e787879afa46d9c8257ff1f4ae8c7900d4b5f1a4 include/server/mir/compositor/frame_dropping_policy.h13e787879afa46d9c8257ff1f4ae8c7900d4b5f1a4 include/server/mir/compositor/frame_dropping_policy.h
14e0860c43bf5196a792ffd7216826925e16275d07 include/server/mir/compositor/renderer_factory.h14e0860c43bf5196a792ffd7216826925e16275d07 include/server/mir/compositor/renderer_factory.h
15a9f284ba4b05d58fd3eeb628d1f56fe4ac188526 include/server/mir/compositor/compositor_id.h15a9f284ba4b05d58fd3eeb628d1f56fe4ac188526 include/server/mir/compositor/compositor_id.h
1616
=== modified file 'src/server/compositor/buffer_bundle.h'
--- src/server/compositor/buffer_bundle.h 2014-05-21 08:38:47 +0000
+++ src/server/compositor/buffer_bundle.h 2014-07-25 10:04:16 +0000
@@ -67,6 +67,7 @@
67 * nbuffers-1 as it might be less.67 * nbuffers-1 as it might be less.
68 */68 */
69 virtual int buffers_free_for_client() const = 0;69 virtual int buffers_free_for_client() const = 0;
70 virtual void drop_old_buffers() = 0;
7071
71protected:72protected:
72 BufferBundle() = default;73 BufferBundle() = default;
7374
=== modified file 'src/server/compositor/buffer_queue.cpp'
--- src/server/compositor/buffer_queue.cpp 2014-07-21 03:35:31 +0000
+++ src/server/compositor/buffer_queue.cpp 2014-07-25 10:04:16 +0000
@@ -99,6 +99,7 @@
99 : nbuffers{nbuffers},99 : nbuffers{nbuffers},
100 frame_dropping_enabled{false},100 frame_dropping_enabled{false},
101 the_properties{props},101 the_properties{props},
102 force_new_compositor_buffer{false},
102 gralloc{gralloc}103 gralloc{gralloc}
103{104{
104 if (nbuffers < 1)105 if (nbuffers < 1)
@@ -240,7 +241,16 @@
240 use_current_buffer = true;241 use_current_buffer = true;
241 current_buffer_users.push_back(user_id);242 current_buffer_users.push_back(user_id);
242 }243 }
243 use_current_buffer |= ready_to_composite_queue.empty();244
245 if (ready_to_composite_queue.empty())
246 {
247 use_current_buffer = true;
248 }
249 else if (force_new_compositor_buffer)
250 {
251 use_current_buffer = false;
252 force_new_compositor_buffer = false;
253 }
244254
245 mg::Buffer* buffer_to_release = nullptr;255 mg::Buffer* buffer_to_release = nullptr;
246 if (!use_current_buffer)256 if (!use_current_buffer)
@@ -473,3 +483,22 @@
473 }483 }
474 give_buffer_to_client(buffer_to_give, std::move(lock));484 give_buffer_to_client(buffer_to_give, std::move(lock));
475}485}
486
487void mc::BufferQueue::drop_old_buffers()
488{
489 std::vector<mg::Buffer*> to_release;
490
491 {
492 std::lock_guard<decltype(guard)> lock{guard};
493 force_new_compositor_buffer = true;
494
495 while (ready_to_composite_queue.size() > 1)
496 to_release.push_back(pop(ready_to_composite_queue));
497 }
498
499 for (auto buffer : to_release)
500 {
501 std::unique_lock<decltype(guard)> lock{guard};
502 release(buffer, std::move(lock));
503 }
504}
476505
=== modified file 'src/server/compositor/buffer_queue.h'
--- src/server/compositor/buffer_queue.h 2014-07-17 10:28:51 +0000
+++ src/server/compositor/buffer_queue.h 2014-07-25 10:04:16 +0000
@@ -62,6 +62,7 @@
62 int buffers_free_for_client() const override;62 int buffers_free_for_client() const override;
63 bool framedropping_allowed() const;63 bool framedropping_allowed() const;
64 bool is_a_current_buffer_user(void const* user_id) const;64 bool is_a_current_buffer_user(void const* user_id) const;
65 void drop_old_buffers() override;
6566
66private:67private:
67 void give_buffer_to_client(graphics::Buffer* buffer,68 void give_buffer_to_client(graphics::Buffer* buffer,
@@ -87,6 +88,7 @@
87 int nbuffers;88 int nbuffers;
88 bool frame_dropping_enabled;89 bool frame_dropping_enabled;
89 graphics::BufferProperties the_properties;90 graphics::BufferProperties the_properties;
91 bool force_new_compositor_buffer;
9092
91 std::condition_variable snapshot_released;93 std::condition_variable snapshot_released;
92 std::shared_ptr<graphics::GraphicBufferAllocator> gralloc;94 std::shared_ptr<graphics::GraphicBufferAllocator> gralloc;
9395
=== modified file 'src/server/compositor/buffer_stream_surfaces.cpp'
--- src/server/compositor/buffer_stream_surfaces.cpp 2014-05-22 10:00:05 +0000
+++ src/server/compositor/buffer_stream_surfaces.cpp 2014-07-25 10:04:16 +0000
@@ -89,3 +89,8 @@
89{89{
90 return buffer_bundle->buffers_ready_for_compositor();90 return buffer_bundle->buffers_ready_for_compositor();
91}91}
92
93void mc::BufferStreamSurfaces::drop_old_buffers()
94{
95 buffer_bundle->drop_old_buffers();
96}
9297
=== modified file 'src/server/compositor/buffer_stream_surfaces.h'
--- src/server/compositor/buffer_stream_surfaces.h 2014-05-22 10:00:05 +0000
+++ src/server/compositor/buffer_stream_surfaces.h 2014-07-25 10:04:16 +0000
@@ -52,6 +52,7 @@
52 void allow_framedropping(bool) override;52 void allow_framedropping(bool) override;
53 void force_requests_to_complete() override;53 void force_requests_to_complete() override;
54 int buffers_ready_for_compositor() const override;54 int buffers_ready_for_compositor() const override;
55 void drop_old_buffers() override;
5556
56protected:57protected:
57 BufferStreamSurfaces(const BufferStreamSurfaces&) = delete;58 BufferStreamSurfaces(const BufferStreamSurfaces&) = delete;
5859
=== modified file 'src/server/scene/basic_surface.cpp'
--- src/server/scene/basic_surface.cpp 2014-07-21 03:35:31 +0000
+++ src/server/scene/basic_surface.cpp 2014-07-25 10:04:16 +0000
@@ -583,6 +583,8 @@
583 {583 {
584 attrib_values[mir_surface_attrib_visibility] = new_visibility;584 attrib_values[mir_surface_attrib_visibility] = new_visibility;
585 lg.unlock();585 lg.unlock();
586 if (new_visibility == mir_surface_visibility_exposed)
587 surface_buffer_stream->drop_old_buffers();
586 observers.attrib_changed(mir_surface_attrib_visibility, attrib_values[mir_surface_attrib_visibility]);588 observers.attrib_changed(mir_surface_attrib_visibility, attrib_values[mir_surface_attrib_visibility]);
587 }589 }
588590
589591
=== modified file 'tests/acceptance-tests/CMakeLists.txt'
--- tests/acceptance-tests/CMakeLists.txt 2014-07-22 03:26:35 +0000
+++ tests/acceptance-tests/CMakeLists.txt 2014-07-25 10:04:16 +0000
@@ -40,6 +40,7 @@
40 test_client_surface_visibility.cpp40 test_client_surface_visibility.cpp
41 test_client_with_custom_display_config_deadlock.cpp41 test_client_with_custom_display_config_deadlock.cpp
42 test_macros.cpp42 test_macros.cpp
43 test_stale_frames.cpp
43 ${GENERATED_PROTOBUF_SRCS}44 ${GENERATED_PROTOBUF_SRCS}
44 ${GENERATED_PROTOBUF_HDRS}45 ${GENERATED_PROTOBUF_HDRS}
45)46)
4647
=== added file 'tests/acceptance-tests/test_stale_frames.cpp'
--- tests/acceptance-tests/test_stale_frames.cpp 1970-01-01 00:00:00 +0000
+++ tests/acceptance-tests/test_stale_frames.cpp 2014-07-25 10:04:16 +0000
@@ -0,0 +1,206 @@
1/*
2 * Copyright © 2014 Canonical Ltd.
3 *
4 * 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,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Alexandros Frantzis <alexandros.frantzis@canonical.com>
17 */
18
19#include "mir_toolkit/mir_client_library.h"
20#include "mir_toolkit/mir_client_library_debug.h"
21
22#include "mir/compositor/compositor.h"
23#include "mir/compositor/renderer_factory.h"
24#include "mir/graphics/renderable.h"
25#include "mir/graphics/buffer.h"
26#include "mir/graphics/buffer_id.h"
27
28#include "mir_test_framework/using_stub_client_platform.h"
29#include "mir_test_framework/stubbed_server_configuration.h"
30#include "mir_test_framework/basic_client_server_fixture.h"
31#include "mir_test_doubles/stub_renderer.h"
32
33#include <gtest/gtest.h>
34#include <gmock/gmock.h>
35
36#include <mutex>
37#include <condition_variable>
38
39namespace mtf = mir_test_framework;
40namespace mtd = mir::test::doubles;
41namespace mc = mir::compositor;
42namespace mg = mir::graphics;
43namespace geom = mir::geometry;
44
45namespace
46{
47
48struct StubRenderer : mtd::StubRenderer
49{
50 void render(mg::RenderableList const& renderables) const override
51 {
52 std::lock_guard<std::mutex> lock{mutex};
53 for (auto const& r : renderables)
54 rendered_buffers_.push_back(r->buffer()->id());
55
56 if (renderables.size() > 0)
57 new_rendered_buffer_cv.notify_all();
58 }
59
60 std::vector<mg::BufferID> rendered_buffers()
61 {
62 std::lock_guard<std::mutex> lock{mutex};
63 return rendered_buffers_;
64 }
65
66 std::vector<mg::BufferID> wait_for_new_rendered_buffers()
67 {
68 std::unique_lock<std::mutex> lock{mutex};
69
70 new_rendered_buffer_cv.wait_for(
71 lock, std::chrono::seconds{2},
72 [this] { return rendered_buffers_.size() != 0; });
73
74 auto const rendered = std::move(rendered_buffers_);
75 return rendered;
76 }
77
78 mutable std::mutex mutex;
79 mutable std::condition_variable new_rendered_buffer_cv;
80 mutable std::vector<mg::BufferID> rendered_buffers_;
81};
82
83class StubRendererFactory : public mc::RendererFactory
84{
85public:
86 std::unique_ptr<mc::Renderer> create_renderer_for(
87 geom::Rectangle const&, mc::DestinationAlpha) override
88 {
89 std::lock_guard<std::mutex> lock{mutex};
90 renderer_ = new StubRenderer();
91 renderer_created_cv.notify_all();
92 return std::unique_ptr<mc::Renderer>{renderer_};
93 }
94
95 StubRenderer* renderer()
96 {
97 std::unique_lock<std::mutex> lock{mutex};
98
99 renderer_created_cv.wait_for(
100 lock, std::chrono::seconds{2},
101 [this] { return renderer_ != nullptr; });
102
103 return renderer_;
104 }
105
106 void clear_renderer()
107 {
108 std::lock_guard<std::mutex> lock{mutex};
109 renderer_ = nullptr;
110 }
111
112 std::mutex mutex;
113 std::condition_variable renderer_created_cv;
114 StubRenderer* renderer_ = nullptr;
115};
116
117struct StubServerConfig : mtf::StubbedServerConfiguration
118{
119 std::shared_ptr<StubRendererFactory> the_stub_renderer_factory()
120 {
121 return stub_renderer_factory(
122 [] { return std::make_shared<StubRendererFactory>(); });
123 }
124
125 std::shared_ptr<mc::RendererFactory> the_renderer_factory() override
126 {
127 return the_stub_renderer_factory();
128 }
129
130 mir::CachedPtr<StubRendererFactory> stub_renderer_factory;
131};
132
133using BasicFixture = mtf::BasicClientServerFixture<StubServerConfig>;
134
135struct StaleFrames : BasicFixture
136{
137 void SetUp()
138 {
139 BasicFixture::SetUp();
140
141 client_create_surface();
142 }
143
144 void TearDown()
145 {
146 mir_surface_release_sync(surface);
147
148 BasicFixture::TearDown();
149 }
150
151 void client_create_surface()
152 {
153 MirSurfaceParameters const request_params =
154 {
155 __PRETTY_FUNCTION__,
156 640, 480,
157 mir_pixel_format_abgr_8888,
158 mir_buffer_usage_hardware,
159 mir_display_output_id_invalid
160 };
161
162 surface = mir_connection_create_surface_sync(connection, &request_params);
163 ASSERT_TRUE(mir_surface_is_valid(surface));
164 }
165
166 std::vector<mg::BufferID> wait_for_new_rendered_buffers()
167 {
168 return server_configuration.the_stub_renderer_factory()->renderer()->wait_for_new_rendered_buffers();
169 }
170
171 void stop_compositor()
172 {
173 server_configuration.the_compositor()->stop();
174 server_configuration.the_stub_renderer_factory()->clear_renderer();
175 }
176
177 void start_compositor()
178 {
179 server_configuration.the_compositor()->start();
180 }
181
182 MirSurface* surface;
183 mtf::UsingStubClientPlatform using_stub_client_platform;
184};
185
186}
187
188TEST_F(StaleFrames, are_dropped_when_restarting_compositor)
189{
190 using namespace testing;
191
192 stop_compositor();
193
194 auto const stale_buffer_id1 = mg::BufferID{mir_debug_surface_current_buffer_id(surface)};
195 mir_surface_swap_buffers_sync(surface);
196
197 auto const stale_buffer_id2 = mg::BufferID{mir_debug_surface_current_buffer_id(surface)};
198 mir_surface_swap_buffers_sync(surface);
199
200 mir_surface_swap_buffers_sync(surface);
201
202 start_compositor();
203
204 auto const new_buffers = wait_for_new_rendered_buffers();
205 EXPECT_THAT(new_buffers, Not(AnyOf(Contains(stale_buffer_id1), Contains(stale_buffer_id2))));
206}
0207
=== modified file 'tests/integration-tests/test_swapinterval.cpp'
--- tests/integration-tests/test_swapinterval.cpp 2014-05-22 10:00:05 +0000
+++ tests/integration-tests/test_swapinterval.cpp 2014-07-25 10:04:16 +0000
@@ -28,6 +28,7 @@
2828
29#include "mir_test_framework/display_server_test_fixture.h"29#include "mir_test_framework/display_server_test_fixture.h"
30#include "mir_test_doubles/stub_buffer.h"30#include "mir_test_doubles/stub_buffer.h"
31#include "mir_test_doubles/stub_buffer_stream.h"
3132
32#include "mir_toolkit/mir_client_library.h"33#include "mir_toolkit/mir_client_library.h"
3334
@@ -48,7 +49,7 @@
48{49{
49char const* const mir_test_socket = mtf::test_socket_file().c_str();50char const* const mir_test_socket = mtf::test_socket_file().c_str();
5051
51class CountingBufferStream : public mc::BufferStream52class CountingBufferStream : public mtd::StubBufferStream
52{53{
53public:54public:
54 CountingBufferStream(int render_operations_fd)55 CountingBufferStream(int render_operations_fd)
@@ -56,16 +57,6 @@
56 {57 {
57 }58 }
5859
59 void acquire_client_buffer(
60 std::function<void(mg::Buffer* buffer)> complete) override
61 {
62 complete(&stub_buffer);
63 }
64
65 void release_client_buffer(mg::Buffer*) override
66 {
67 }
68
69 std::shared_ptr<mg::Buffer> lock_compositor_buffer(void const*) override60 std::shared_ptr<mg::Buffer> lock_compositor_buffer(void const*) override
70 { return std::make_shared<mtd::StubBuffer>(); }61 { return std::make_shared<mtd::StubBuffer>(); }
7162
@@ -75,18 +66,13 @@
75 MirPixelFormat get_stream_pixel_format() override66 MirPixelFormat get_stream_pixel_format() override
76 { return mir_pixel_format_abgr_8888; }67 { return mir_pixel_format_abgr_8888; }
7768
78 geom::Size stream_size() override { return geom::Size{}; }
79 void resize(geom::Size const&) override {}
80 void force_requests_to_complete() override {}
81 void allow_framedropping(bool) override69 void allow_framedropping(bool) override
82 {70 {
83 while (write(render_operations_fd, "a", 1) != 1) continue;71 while (write(render_operations_fd, "a", 1) != 1) continue;
84 }72 }
85 int buffers_ready_for_compositor() const override { return 1; }
8673
87private:74private:
88 int render_operations_fd;75 int render_operations_fd;
89 mtd::StubBuffer stub_buffer;
90};76};
9177
92class StubStreamFactory : public ms::BufferStreamFactory78class StubStreamFactory : public ms::BufferStreamFactory
9379
=== modified file 'tests/unit-tests/compositor/test_buffer_queue.cpp'
--- tests/unit-tests/compositor/test_buffer_queue.cpp 2014-07-11 05:14:40 +0000
+++ tests/unit-tests/compositor/test_buffer_queue.cpp 2014-07-25 10:04:16 +0000
@@ -1455,3 +1455,62 @@
1455 q.compositor_release(comp);1455 q.compositor_release(comp);
1456 }1456 }
1457}1457}
1458
1459TEST_F(BufferQueueTest, gives_compositor_a_valid_buffer_after_dropping_old_buffers_without_clients)
1460{
1461 int const nbuffers = 3;
1462 mc::BufferQueue q(nbuffers, allocator, basic_properties, policy_factory);
1463
1464 q.drop_old_buffers();
1465
1466 auto comp = q.compositor_acquire(this);
1467 ASSERT_THAT(comp->id(), Ne(mg::BufferID{}));
1468}
1469
1470TEST_F(BufferQueueTest, gives_compositor_the_newest_buffer_after_dropping_old_buffers)
1471{
1472 int const nbuffers = 3;
1473 mc::BufferQueue q(nbuffers, allocator, basic_properties, policy_factory);
1474
1475 auto handle1 = client_acquire_async(q);
1476 ASSERT_THAT(handle1->has_acquired_buffer(), Eq(true));
1477 handle1->release_buffer();
1478
1479 auto handle2 = client_acquire_async(q);
1480 ASSERT_THAT(handle2->has_acquired_buffer(), Eq(true));
1481 handle2->release_buffer();
1482
1483 q.drop_old_buffers();
1484
1485 auto comp = q.compositor_acquire(this);
1486 ASSERT_THAT(comp->id(), Eq(handle2->id()));
1487 q.compositor_release(comp);
1488
1489 comp = q.compositor_acquire(this);
1490 ASSERT_THAT(comp->id(), Eq(handle2->id()));
1491}
1492
1493TEST_F(BufferQueueTest, gives_new_compositor_the_newest_buffer_after_dropping_old_buffers)
1494{
1495 int const nbuffers = 3;
1496 void const* const new_compositor_id{&nbuffers};
1497
1498 mc::BufferQueue q(nbuffers, allocator, basic_properties, policy_factory);
1499
1500 auto handle1 = client_acquire_async(q);
1501 ASSERT_THAT(handle1->has_acquired_buffer(), Eq(true));
1502 handle1->release_buffer();
1503
1504 auto comp = q.compositor_acquire(this);
1505 ASSERT_THAT(comp->id(), Eq(handle1->id()));
1506 q.compositor_release(comp);
1507
1508 auto handle2 = client_acquire_async(q);
1509 ASSERT_THAT(handle2->has_acquired_buffer(), Eq(true));
1510 handle2->release_buffer();
1511
1512 q.drop_old_buffers();
1513
1514 auto comp2 = q.compositor_acquire(new_compositor_id);
1515 ASSERT_THAT(comp2->id(), Eq(handle2->id()));
1516}

Subscribers

People subscribed via source and target branches