Mir

Merge lp:~kdub/mir/fix-1503317 into lp:mir

Proposed by Kevin DuBois
Status: Merged
Approved by: Chris Halse Rogers
Approved revision: no longer in the source branch.
Merged at revision: 3009
Proposed branch: lp:~kdub/mir/fix-1503317
Merge into: lp:mir
Diff against target: 260 lines (+87/-18)
7 files modified
include/test/mir_test_framework/connected_client_with_a_surface.h (+3/-0)
src/server/scene/basic_surface.cpp (+1/-1)
tests/acceptance-tests/test_buffer_stream_arrangement.cpp (+47/-15)
tests/include/mir/test/doubles/mock_buffer_bundle.h (+3/-1)
tests/include/mir/test/doubles/mock_buffer_stream.h (+2/-0)
tests/mir_test_framework/connected_client_with_a_surface.cpp (+1/-1)
tests/unit-tests/scene/test_basic_surface.cpp (+30/-0)
To merge this branch: bzr merge lp:~kdub/mir/fix-1503317
Reviewer Review Type Date Requested Status
Chris Halse Rogers Approve
PS Jenkins bot (community) continuous-integration Approve
Alan Griffiths Approve
Review via email: mp+273694@code.launchpad.net

Commit message

In multibuffer stream scenarios, ensure that the size of the renderable generated from the stream is the size of the stream.

fixes lp: #1503317

Description of the change

In multibuffer stream scenarios, ensure that the size of the renderable generated from the stream is the size of the stream.

fixes lp: #1503317

problem came to my attention when working on switching the demo servers from the 'titlebars' being a surface to being a stream.

To post a comment you must log in.
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Looks reasonable.

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Chris Halse Rogers (raof) wrote :

+ std::vector<std::vector<std::tuple<geom::Displacement, geom::Size>>> displacements;

This (in it's many positions) is no longer really a list of displacements. You're renamed it “positions” in one location, and that seems reasonable.

Also, tuple<Displacement, Size> is pretty much a geom::Rectangle. It looks like you could just drop that in (although if you wanted to type-encode you'd need a RelativeRectangle).

Otherwise looks good.

review: Needs Fixing
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Chris Halse Rogers (raof) wrote :

LGTM

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_framework/connected_client_with_a_surface.h'
2--- include/test/mir_test_framework/connected_client_with_a_surface.h 2015-06-22 03:04:56 +0000
3+++ include/test/mir_test_framework/connected_client_with_a_surface.h 2015-10-08 12:19:30 +0000
4@@ -20,6 +20,7 @@
5 #define MIR_TEST_FRAMEWORK_CONNECTED_CLIENT_WITH_A_SURFACE_H_
6
7 #include "mir_test_framework/connected_client_headless_server.h"
8+#include "mir/geometry/size.h"
9
10 namespace mir_test_framework
11 {
12@@ -30,6 +31,8 @@
13 void SetUp() override;
14
15 void TearDown() override;
16+
17+ mir::geometry::Size const surface_size {640, 480};
18 };
19 }
20
21
22=== modified file 'src/server/scene/basic_surface.cpp'
23--- src/server/scene/basic_surface.cpp 2015-10-02 01:56:04 +0000
24+++ src/server/scene/basic_surface.cpp 2015-10-08 12:19:30 +0000
25@@ -877,7 +877,7 @@
26 {
27 list.emplace_back(std::make_shared<SurfaceSnapshot>(
28 info.stream, id,
29- geom::Rectangle{surface_rect.top_left + info.displacement, surface_rect.size},
30+ geom::Rectangle{surface_rect.top_left + info.displacement, info.stream->stream_size()},
31 transformation_matrix, surface_alpha, nonrectangular, info.stream.get()));
32 }
33 }
34
35=== modified file 'tests/acceptance-tests/test_buffer_stream_arrangement.cpp'
36--- tests/acceptance-tests/test_buffer_stream_arrangement.cpp 2015-06-22 03:04:56 +0000
37+++ tests/acceptance-tests/test_buffer_stream_arrangement.cpp 2015-10-08 12:19:30 +0000
38@@ -38,6 +38,23 @@
39 namespace
40 {
41
42+struct RelativeRectangle
43+{
44+ RelativeRectangle() = default;
45+
46+ RelativeRectangle(geom::Displacement const& displacement, geom::Size const& size)
47+ : displacement{displacement}, size{size}
48+ {
49+ }
50+
51+ geom::Displacement displacement;
52+ geom::Size size;
53+};
54+bool operator==(RelativeRectangle const& a, RelativeRectangle const& b)
55+{
56+ return (a.displacement == b.displacement) && (a.size == b.size);
57+}
58+
59 MirPixelFormat an_available_format(MirConnection* connection)
60 {
61 using namespace testing;
62@@ -49,9 +66,10 @@
63
64 struct Stream
65 {
66- Stream(MirBufferStream* stream, geom::Point pt) :
67+ Stream(MirBufferStream* stream, geom::Point pt, geom::Size sz) :
68 stream(stream),
69 pos{pt},
70+ stream_size{sz},
71 needs_release{false}
72 {
73 mir_buffer_stream_swap_buffers_sync(stream);
74@@ -65,6 +83,7 @@
75 an_available_format(connection),
76 mir_buffer_usage_hardware)),
77 pos{rect.top_left},
78+ stream_size{rect.size},
79 needs_release{true}
80 {
81 mir_buffer_stream_swap_buffers_sync(stream);
82@@ -86,11 +105,17 @@
83 return pos;
84 }
85
86+ geom::Size size()
87+ {
88+ return stream_size;
89+ }
90+
91 Stream(Stream const&) = delete;
92 Stream& operator=(Stream const&) = delete;
93 private:
94 MirBufferStream* stream;
95 geom::Point const pos;
96+ geom::Size stream_size;
97 bool const needs_release;
98 };
99
100@@ -102,24 +127,26 @@
101 return;
102
103 std::unique_lock<decltype(mutex)> lk(mutex);
104- std::vector<geom::Displacement> displacement;
105+ std::vector<RelativeRectangle> position;
106 auto first_position = (*sequence.begin())->renderable()->screen_position().top_left;
107 for (auto const& element : sequence)
108- displacement.emplace_back(element->renderable()->screen_position().top_left - first_position);
109- displacements.push_back(displacement);
110+ position.emplace_back(
111+ element->renderable()->screen_position().top_left - first_position,
112+ element->renderable()->screen_position().size);
113+ positions.push_back(position);
114 cv.notify_all();
115 }
116
117 template<typename T, typename S>
118- bool wait_for_ordering_within(
119- std::vector<geom::Displacement> const& ordering,
120+ bool wait_for_positions_within(
121+ std::vector<RelativeRectangle> const& awaited_positions,
122 std::chrono::duration<T,S> duration)
123 {
124 std::unique_lock<decltype(mutex)> lk(mutex);
125- return cv.wait_for(lk, duration, [this, ordering] {
126- for (auto& displacement : displacements)
127- if (displacement == ordering) return true;
128- displacements.clear();
129+ return cv.wait_for(lk, duration, [this, awaited_positions] {
130+ for (auto& position : positions)
131+ if (position == awaited_positions) return true;
132+ positions.clear();
133 return false;
134 });
135 }
136@@ -127,7 +154,7 @@
137 private:
138 std::mutex mutex;
139 std::condition_variable cv;
140- std::vector<std::vector<geom::Displacement>> displacements;
141+ std::vector<std::vector<RelativeRectangle>> positions;
142 };
143
144 struct OrderTrackingDBC : mc::DisplayBufferCompositor
145@@ -186,7 +213,7 @@
146 server.the_cursor()->hide();
147
148 streams.emplace_back(
149- std::make_unique<Stream>(mir_surface_get_buffer_stream(surface), geom::Point{0,0}));
150+ std::make_unique<Stream>(mir_surface_get_buffer_stream(surface), geom::Point{0,0}, surface_size));
151 int const additional_streams{3};
152 for (auto i = 0; i < additional_streams; i++)
153 {
154@@ -226,12 +253,17 @@
155 mir_surface_apply_spec(surface, change_spec);
156 mir_surface_spec_release(change_spec);
157
158- std::vector<geom::Displacement> displacements;
159+ std::vector<RelativeRectangle> positions;
160+ i = 0;
161 for (auto& info : infos)
162- displacements.emplace_back(geom::Displacement{info.displacement_x, info.displacement_y});
163+ {
164+ positions.emplace_back(
165+ geom::Displacement{info.displacement_x, info.displacement_y},
166+ streams[i++]->size());
167+ }
168
169 //check that the compositor rendered correctly
170 using namespace std::literals::chrono_literals;
171- EXPECT_TRUE(ordering->wait_for_ordering_within(displacements, 5s))
172+ EXPECT_TRUE(ordering->wait_for_positions_within(positions, 5s))
173 << "timed out waiting to see the compositor post the streams in the right arrangement";
174 }
175
176=== modified file 'tests/include/mir/test/doubles/mock_buffer_bundle.h'
177--- tests/include/mir/test/doubles/mock_buffer_bundle.h 2015-09-14 16:46:44 +0000
178+++ tests/include/mir/test/doubles/mock_buffer_bundle.h 2015-10-08 12:19:30 +0000
179@@ -37,7 +37,9 @@
180 ON_CALL(*this, buffers_ready_for_compositor(testing::_))
181 .WillByDefault(testing::Return(1));
182 ON_CALL(*this, properties())
183- .WillByDefault(testing::Return(graphics::BufferProperties()));
184+ .WillByDefault(testing::Return(
185+ graphics::BufferProperties{geometry::Size{1,1},
186+ mir_pixel_format_abgr_8888, graphics::BufferUsage::hardware}));
187 }
188
189 MOCK_METHOD1(client_acquire, void(std::function<void(graphics::Buffer*)>));
190
191=== modified file 'tests/include/mir/test/doubles/mock_buffer_stream.h'
192--- tests/include/mir/test/doubles/mock_buffer_stream.h 2015-09-14 14:45:36 +0000
193+++ tests/include/mir/test/doubles/mock_buffer_stream.h 2015-10-08 12:19:30 +0000
194@@ -53,6 +53,8 @@
195 .WillByDefault(testing::Return(true));
196 ON_CALL(*this, pixel_format())
197 .WillByDefault(testing::Return(mir_pixel_format_abgr_8888));
198+ ON_CALL(*this, stream_size())
199+ .WillByDefault(testing::Return(geometry::Size{0,0}));
200 }
201 MOCK_METHOD1(acquire_client_buffer, void(std::function<void(graphics::Buffer* buffer)>));
202 MOCK_METHOD1(release_client_buffer, void(graphics::Buffer*));
203
204=== modified file 'tests/mir_test_framework/connected_client_with_a_surface.cpp'
205--- tests/mir_test_framework/connected_client_with_a_surface.cpp 2015-06-17 05:20:42 +0000
206+++ tests/mir_test_framework/connected_client_with_a_surface.cpp 2015-10-08 12:19:30 +0000
207@@ -25,7 +25,7 @@
208 ConnectedClientHeadlessServer::SetUp();
209
210 auto const spec = mir_connection_create_spec_for_normal_surface(
211- connection, 640, 480, mir_pixel_format_abgr_8888);
212+ connection, surface_size.width.as_int(), surface_size.height.as_int(), mir_pixel_format_abgr_8888);
213 mir_surface_spec_set_name(spec, "ConnectedClientWithASurfaceFixtureSurface");
214 mir_surface_spec_set_buffer_usage(spec, mir_buffer_usage_hardware);
215
216
217=== modified file 'tests/unit-tests/scene/test_basic_surface.cpp'
218--- tests/unit-tests/scene/test_basic_surface.cpp 2015-07-27 07:24:50 +0000
219+++ tests/unit-tests/scene/test_basic_surface.cpp 2015-10-08 12:19:30 +0000
220@@ -760,6 +760,11 @@
221 return (pos == arg->screen_position().top_left);
222 }
223
224+MATCHER_P(IsRenderableOfSize, size, "is renderable with size")
225+{
226+ return (size == arg->screen_position().size);
227+}
228+
229 MATCHER_P(IsRenderableOfAlpha, alpha, "is renderable with alpha")
230 {
231 EXPECT_THAT(static_cast<float>(alpha), testing::FloatEq(arg->alpha()));
232@@ -965,3 +970,28 @@
233 EXPECT_THAT(surface.buffers_ready_for_compositor(this), Eq(0));
234 EXPECT_THAT(surface.buffers_ready_for_compositor(this), Eq(2));
235 }
236+
237+TEST_F(BasicSurfaceTest, buffer_streams_produce_correctly_sized_renderables)
238+{
239+ using namespace testing;
240+ auto buffer_stream = std::make_shared<NiceMock<mtd::MockBufferStream>>();
241+ geom::Displacement d0{0,0};
242+ geom::Displacement d1{19,99};
243+ geom::Size size0 {100, 101};
244+ geom::Size size1 {102, 103};
245+ ON_CALL(*mock_buffer_stream, stream_size())
246+ .WillByDefault(Return(size0));
247+ ON_CALL(*buffer_stream, stream_size())
248+ .WillByDefault(Return(size1));
249+
250+ std::list<ms::StreamInfo> streams = {
251+ { mock_buffer_stream, d0 },
252+ { buffer_stream, d1 },
253+ };
254+ surface.set_streams(streams);
255+
256+ auto renderables = surface.generate_renderables(this);
257+ ASSERT_THAT(renderables.size(), Eq(2));
258+ EXPECT_THAT(renderables[0], IsRenderableOfSize(size0));
259+ EXPECT_THAT(renderables[1], IsRenderableOfSize(size1));
260+}

Subscribers

People subscribed via source and target branches