Merge lp:~kdub/mir/fix-1444047 into lp:mir
- fix-1444047
- Merge into development-branch
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Kevin DuBois | ||||
Approved revision: | no longer in the source branch. | ||||
Merged at revision: | 2516 | ||||
Proposed branch: | lp:~kdub/mir/fix-1444047 | ||||
Merge into: | lp:mir | ||||
Diff against target: |
533 lines (+162/-37) 16 files modified
src/client/buffer_stream.cpp (+5/-0) src/client/buffer_stream.h (+1/-0) src/client/client_buffer_depository.cpp (+14/-3) src/client/client_buffer_depository.h (+2/-2) src/common/graphics/android/mir_native_window.cpp (+4/-3) src/include/client/mir/egl_native_surface.h (+1/-0) src/include/common/mir/graphics/android/android_driver_interpreter.h (+1/-0) src/platforms/android/client/egl_native_surface_interpreter.cpp (+7/-0) src/platforms/android/client/egl_native_surface_interpreter.h (+6/-5) src/platforms/android/server/server_render_window.cpp (+5/-0) src/platforms/android/server/server_render_window.h (+6/-5) tests/include/mir_test_doubles/mock_egl_native_surface.h (+1/-0) tests/include/mir_test_doubles/stub_driver_interpreter.h (+12/-4) tests/unit-tests/client/android/test_android_native_window.cpp (+9/-0) tests/unit-tests/client/android/test_egl_native_surface_interpreter.cpp (+21/-0) tests/unit-tests/client/test_client_buffer_depository.cpp (+67/-15) |
||||
To merge this branch: | bzr merge lp:~kdub/mir/fix-1444047 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Alberto Aguirre (community) | Approve | ||
Alan Griffiths | Approve | ||
Alexandros Frantzis (community) | Approve | ||
PS Jenkins bot (community) | continuous-integration | Approve | |
Review via email:
|
Commit message
Honor the android driver's request to have a specific number of recently-
fixes: lp: #1444047
Description of the change
Honor the android driver's request to have a specific number of recently-
If you want to reproduce/test, the bug only appears on krillin (probably other mali drivers too), and only happens in the situation where we get an overallocation in BufferQueue due to a framedrop timeout being triggered. This is a pretty rare situation, so lp:~afrantzis/mir/reproduce-1444047 is around that forces the situation more commonly.
fixes: lp: #1444047
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
PS Jenkins bot (ps-jenkins) wrote : | # |
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:2517
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Daniel van Vugt (vanvugt) wrote : | # |
Tested for bug 1270245 on krillin. Sadly that one is still happening.
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Alexandros Frantzis (afrantzis) wrote : | # |
Looks good and works well.
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Alan Griffiths (alan-griffiths) wrote : | # |
180+void mga::ServerRend
181+{
182+}
Maybe a comment to explain why there can be no bad implications to ignoring this request?
Preview Diff
1 | === modified file 'src/client/buffer_stream.cpp' | |||
2 | --- src/client/buffer_stream.cpp 2015-04-01 20:00:19 +0000 | |||
3 | +++ src/client/buffer_stream.cpp 2015-04-27 19:10:30 +0000 | |||
4 | @@ -398,3 +398,8 @@ | |||
5 | 398 | std::unique_lock<decltype(mutex)> lock(mutex); | 398 | std::unique_lock<decltype(mutex)> lock(mutex); |
6 | 399 | return protobuf_bs.has_id() && !protobuf_bs.has_error(); | 399 | return protobuf_bs.has_id() && !protobuf_bs.has_error(); |
7 | 400 | } | 400 | } |
8 | 401 | |||
9 | 402 | void mcl::BufferStream::set_buffer_cache_size(unsigned int cache_size) | ||
10 | 403 | { | ||
11 | 404 | buffer_depository.set_max_buffers(cache_size); | ||
12 | 405 | } | ||
13 | 401 | 406 | ||
14 | === modified file 'src/client/buffer_stream.h' | |||
15 | --- src/client/buffer_stream.h 2015-04-01 20:00:19 +0000 | |||
16 | +++ src/client/buffer_stream.h 2015-04-27 19:10:30 +0000 | |||
17 | @@ -83,6 +83,7 @@ | |||
18 | 83 | 83 | ||
19 | 84 | int swap_interval() const override; | 84 | int swap_interval() const override; |
20 | 85 | void set_swap_interval(int interval) override; | 85 | void set_swap_interval(int interval) override; |
21 | 86 | void set_buffer_cache_size(unsigned int) override; | ||
22 | 86 | 87 | ||
23 | 87 | EGLNativeWindowType egl_native_window() override; | 88 | EGLNativeWindowType egl_native_window() override; |
24 | 88 | std::shared_ptr<MemoryRegion> secure_for_cpu_write() override; | 89 | std::shared_ptr<MemoryRegion> secure_for_cpu_write() override; |
25 | 89 | 90 | ||
26 | === modified file 'src/client/client_buffer_depository.cpp' | |||
27 | --- src/client/client_buffer_depository.cpp 2015-01-21 07:34:50 +0000 | |||
28 | +++ src/client/client_buffer_depository.cpp 2015-04-27 19:10:30 +0000 | |||
29 | @@ -22,16 +22,18 @@ | |||
30 | 22 | #include "mir/client_buffer.h" | 22 | #include "mir/client_buffer.h" |
31 | 23 | #include "mir/client_buffer_factory.h" | 23 | #include "mir/client_buffer_factory.h" |
32 | 24 | 24 | ||
33 | 25 | #include <boost/throw_exception.hpp> | ||
34 | 25 | #include <stdexcept> | 26 | #include <stdexcept> |
35 | 26 | #include <memory> | 27 | #include <memory> |
36 | 27 | #include <map> | 28 | #include <map> |
37 | 28 | 29 | ||
38 | 29 | namespace mcl=mir::client; | 30 | namespace mcl=mir::client; |
39 | 30 | 31 | ||
43 | 31 | mcl::ClientBufferDepository::ClientBufferDepository(std::shared_ptr<ClientBufferFactory> const& factory, int max_buffers) | 32 | mcl::ClientBufferDepository::ClientBufferDepository( |
44 | 32 | : factory(factory), | 33 | std::shared_ptr<ClientBufferFactory> const& factory, int max_buffers) : |
45 | 33 | max_buffers(max_buffers) | 34 | factory(factory) |
46 | 34 | { | 35 | { |
47 | 36 | set_max_buffers(max_buffers); | ||
48 | 35 | } | 37 | } |
49 | 36 | 38 | ||
50 | 37 | void mcl::ClientBufferDepository::deposit_package(std::shared_ptr<MirBufferPackage> const& package, int id, geometry::Size size, MirPixelFormat pf) | 39 | void mcl::ClientBufferDepository::deposit_package(std::shared_ptr<MirBufferPackage> const& package, int id, geometry::Size size, MirPixelFormat pf) |
51 | @@ -72,3 +74,12 @@ | |||
52 | 72 | { | 74 | { |
53 | 73 | return buffers.front().first; | 75 | return buffers.front().first; |
54 | 74 | } | 76 | } |
55 | 77 | |||
56 | 78 | void mcl::ClientBufferDepository::set_max_buffers(unsigned int new_max_buffers) | ||
57 | 79 | { | ||
58 | 80 | if (!new_max_buffers) | ||
59 | 81 | BOOST_THROW_EXCEPTION(std::logic_error("ClientBufferDepository cache size cannot be 0")); | ||
60 | 82 | max_buffers = new_max_buffers; | ||
61 | 83 | while (buffers.size() > max_buffers) | ||
62 | 84 | buffers.pop_back(); | ||
63 | 85 | } | ||
64 | 75 | 86 | ||
65 | === modified file 'src/client/client_buffer_depository.h' | |||
66 | --- src/client/client_buffer_depository.h 2014-03-06 06:05:17 +0000 | |||
67 | +++ src/client/client_buffer_depository.h 2015-04-27 19:10:30 +0000 | |||
68 | @@ -64,11 +64,11 @@ | |||
69 | 64 | geometry::Size, MirPixelFormat); | 64 | geometry::Size, MirPixelFormat); |
70 | 65 | std::shared_ptr<ClientBuffer> current_buffer(); | 65 | std::shared_ptr<ClientBuffer> current_buffer(); |
71 | 66 | uint32_t current_buffer_id() const; | 66 | uint32_t current_buffer_id() const; |
73 | 67 | 67 | void set_max_buffers(unsigned int max_buffers); | |
74 | 68 | private: | 68 | private: |
75 | 69 | std::shared_ptr<ClientBufferFactory> const factory; | 69 | std::shared_ptr<ClientBufferFactory> const factory; |
76 | 70 | std::list<std::pair<int, std::shared_ptr<ClientBuffer>>> buffers; | 70 | std::list<std::pair<int, std::shared_ptr<ClientBuffer>>> buffers; |
78 | 71 | unsigned int const max_buffers; | 71 | unsigned int max_buffers; |
79 | 72 | }; | 72 | }; |
80 | 73 | } | 73 | } |
81 | 74 | } | 74 | } |
82 | 75 | 75 | ||
83 | === modified file 'src/common/graphics/android/mir_native_window.cpp' | |||
84 | --- src/common/graphics/android/mir_native_window.cpp 2015-04-24 15:52:14 +0000 | |||
85 | +++ src/common/graphics/android/mir_native_window.cpp 2015-04-27 19:10:30 +0000 | |||
86 | @@ -252,12 +252,13 @@ | |||
87 | 252 | va_list args; | 252 | va_list args; |
88 | 253 | va_copy(args, arg_list); | 253 | va_copy(args, arg_list); |
89 | 254 | 254 | ||
90 | 255 | int driver_format; | ||
91 | 256 | switch(key) | 255 | switch(key) |
92 | 257 | { | 256 | { |
93 | 258 | case NATIVE_WINDOW_SET_BUFFERS_FORMAT: | 257 | case NATIVE_WINDOW_SET_BUFFERS_FORMAT: |
96 | 259 | driver_format = va_arg(args, int); | 258 | driver_interpreter->dispatch_driver_request_format(va_arg(args, int)); |
97 | 260 | driver_interpreter->dispatch_driver_request_format(driver_format); | 259 | break; |
98 | 260 | case NATIVE_WINDOW_SET_BUFFER_COUNT: | ||
99 | 261 | driver_interpreter->dispatch_driver_request_buffer_count(va_arg(args, int)); | ||
100 | 261 | break; | 262 | break; |
101 | 262 | default: | 263 | default: |
102 | 263 | break; | 264 | break; |
103 | 264 | 265 | ||
104 | === modified file 'src/include/client/mir/egl_native_surface.h' | |||
105 | --- src/include/client/mir/egl_native_surface.h 2015-03-31 02:35:42 +0000 | |||
106 | +++ src/include/client/mir/egl_native_surface.h 2015-04-27 19:10:30 +0000 | |||
107 | @@ -35,6 +35,7 @@ | |||
108 | 35 | virtual std::shared_ptr<ClientBuffer> get_current_buffer() = 0; | 35 | virtual std::shared_ptr<ClientBuffer> get_current_buffer() = 0; |
109 | 36 | virtual void request_and_wait_for_next_buffer() = 0; | 36 | virtual void request_and_wait_for_next_buffer() = 0; |
110 | 37 | virtual void request_and_wait_for_configure(MirSurfaceAttrib a, int value) = 0; | 37 | virtual void request_and_wait_for_configure(MirSurfaceAttrib a, int value) = 0; |
111 | 38 | virtual void set_buffer_cache_size(unsigned int) = 0; | ||
112 | 38 | 39 | ||
113 | 39 | protected: | 40 | protected: |
114 | 40 | EGLNativeSurface() = default; | 41 | EGLNativeSurface() = default; |
115 | 41 | 42 | ||
116 | === modified file 'src/include/common/mir/graphics/android/android_driver_interpreter.h' | |||
117 | --- src/include/common/mir/graphics/android/android_driver_interpreter.h 2015-01-21 07:34:50 +0000 | |||
118 | +++ src/include/common/mir/graphics/android/android_driver_interpreter.h 2015-04-27 19:10:30 +0000 | |||
119 | @@ -35,6 +35,7 @@ | |||
120 | 35 | virtual NativeBuffer* driver_requests_buffer() = 0; | 35 | virtual NativeBuffer* driver_requests_buffer() = 0; |
121 | 36 | virtual void driver_returns_buffer(ANativeWindowBuffer*, int fence) = 0; | 36 | virtual void driver_returns_buffer(ANativeWindowBuffer*, int fence) = 0; |
122 | 37 | virtual void dispatch_driver_request_format(int format) = 0; | 37 | virtual void dispatch_driver_request_format(int format) = 0; |
123 | 38 | virtual void dispatch_driver_request_buffer_count(unsigned int count) = 0; | ||
124 | 38 | virtual int driver_requests_info(int key) const = 0; | 39 | virtual int driver_requests_info(int key) const = 0; |
125 | 39 | virtual void sync_to_display(bool sync) = 0; | 40 | virtual void sync_to_display(bool sync) = 0; |
126 | 40 | protected: | 41 | protected: |
127 | 41 | 42 | ||
128 | === modified file 'src/platforms/android/client/egl_native_surface_interpreter.cpp' | |||
129 | --- src/platforms/android/client/egl_native_surface_interpreter.cpp 2015-03-31 02:35:42 +0000 | |||
130 | +++ src/platforms/android/client/egl_native_surface_interpreter.cpp 2015-04-27 19:10:30 +0000 | |||
131 | @@ -18,6 +18,7 @@ | |||
132 | 18 | 18 | ||
133 | 19 | #include "egl_native_surface_interpreter.h" | 19 | #include "egl_native_surface_interpreter.h" |
134 | 20 | #include "mir/graphics/android/sync_fence.h" | 20 | #include "mir/graphics/android/sync_fence.h" |
135 | 21 | #include "mir/frontend/client_constants.h" | ||
136 | 21 | #include "mir/client_buffer.h" | 22 | #include "mir/client_buffer.h" |
137 | 22 | #include <system/window.h> | 23 | #include <system/window.h> |
138 | 23 | #include <stdexcept> | 24 | #include <stdexcept> |
139 | @@ -84,3 +85,9 @@ | |||
140 | 84 | { | 85 | { |
141 | 85 | surface.request_and_wait_for_configure(mir_surface_attrib_swapinterval, should_sync); | 86 | surface.request_and_wait_for_configure(mir_surface_attrib_swapinterval, should_sync); |
142 | 86 | } | 87 | } |
143 | 88 | |||
144 | 89 | void mcla::EGLNativeSurfaceInterpreter::dispatch_driver_request_buffer_count(unsigned int count) | ||
145 | 90 | { | ||
146 | 91 | if (count > mir::frontend::client_buffer_cache_size) | ||
147 | 92 | surface.set_buffer_cache_size(count); | ||
148 | 93 | } | ||
149 | 87 | 94 | ||
150 | === modified file 'src/platforms/android/client/egl_native_surface_interpreter.h' | |||
151 | --- src/platforms/android/client/egl_native_surface_interpreter.h 2015-03-31 02:35:42 +0000 | |||
152 | +++ src/platforms/android/client/egl_native_surface_interpreter.h 2015-04-27 19:10:30 +0000 | |||
153 | @@ -41,11 +41,12 @@ | |||
154 | 41 | public: | 41 | public: |
155 | 42 | explicit EGLNativeSurfaceInterpreter(EGLNativeSurface& surface); | 42 | explicit EGLNativeSurfaceInterpreter(EGLNativeSurface& surface); |
156 | 43 | 43 | ||
162 | 44 | graphics::NativeBuffer* driver_requests_buffer(); | 44 | graphics::NativeBuffer* driver_requests_buffer() override; |
163 | 45 | void driver_returns_buffer(ANativeWindowBuffer*, int fence_fd ); | 45 | void driver_returns_buffer(ANativeWindowBuffer*, int fence_fd) override; |
164 | 46 | void dispatch_driver_request_format(int format); | 46 | void dispatch_driver_request_format(int format) override; |
165 | 47 | int driver_requests_info(int key) const; | 47 | void dispatch_driver_request_buffer_count(unsigned int count) override; |
166 | 48 | void sync_to_display(bool); | 48 | int driver_requests_info(int key) const override; |
167 | 49 | void sync_to_display(bool) override; | ||
168 | 49 | 50 | ||
169 | 50 | private: | 51 | private: |
170 | 51 | EGLNativeSurface& surface; | 52 | EGLNativeSurface& surface; |
171 | 52 | 53 | ||
172 | === modified file 'src/platforms/android/server/server_render_window.cpp' | |||
173 | --- src/platforms/android/server/server_render_window.cpp 2015-03-31 02:35:42 +0000 | |||
174 | +++ src/platforms/android/server/server_render_window.cpp 2015-04-27 19:10:30 +0000 | |||
175 | @@ -96,3 +96,8 @@ | |||
176 | 96 | void mga::ServerRenderWindow::sync_to_display(bool) | 96 | void mga::ServerRenderWindow::sync_to_display(bool) |
177 | 97 | { | 97 | { |
178 | 98 | } | 98 | } |
179 | 99 | |||
180 | 100 | void mga::ServerRenderWindow::dispatch_driver_request_buffer_count(unsigned int) | ||
181 | 101 | { | ||
182 | 102 | //note: Haven't seen a good reason to honor this request for a fb context | ||
183 | 103 | } | ||
184 | 99 | 104 | ||
185 | === modified file 'src/platforms/android/server/server_render_window.h' | |||
186 | --- src/platforms/android/server/server_render_window.h 2015-03-31 02:35:42 +0000 | |||
187 | +++ src/platforms/android/server/server_render_window.h 2015-04-27 19:10:30 +0000 | |||
188 | @@ -41,11 +41,12 @@ | |||
189 | 41 | MirPixelFormat format, | 41 | MirPixelFormat format, |
190 | 42 | std::shared_ptr<InterpreterResourceCache> const&); | 42 | std::shared_ptr<InterpreterResourceCache> const&); |
191 | 43 | 43 | ||
197 | 44 | graphics::NativeBuffer* driver_requests_buffer(); | 44 | graphics::NativeBuffer* driver_requests_buffer() override; |
198 | 45 | void driver_returns_buffer(ANativeWindowBuffer*, int fence_fd); | 45 | void driver_returns_buffer(ANativeWindowBuffer*, int fence_fd) override; |
199 | 46 | void dispatch_driver_request_format(int format); | 46 | void dispatch_driver_request_format(int format) override; |
200 | 47 | int driver_requests_info(int key) const; | 47 | void dispatch_driver_request_buffer_count(unsigned int count) override; |
201 | 48 | void sync_to_display(bool sync); | 48 | int driver_requests_info(int key) const override; |
202 | 49 | void sync_to_display(bool sync) override; | ||
203 | 49 | 50 | ||
204 | 50 | private: | 51 | private: |
205 | 51 | std::shared_ptr<FramebufferBundle> const fb_bundle; | 52 | std::shared_ptr<FramebufferBundle> const fb_bundle; |
206 | 52 | 53 | ||
207 | === modified file 'tests/include/mir_test_doubles/mock_egl_native_surface.h' | |||
208 | --- tests/include/mir_test_doubles/mock_egl_native_surface.h 2015-03-31 02:35:42 +0000 | |||
209 | +++ tests/include/mir_test_doubles/mock_egl_native_surface.h 2015-04-27 19:10:30 +0000 | |||
210 | @@ -36,6 +36,7 @@ | |||
211 | 36 | MOCK_METHOD0(get_current_buffer, std::shared_ptr<client::ClientBuffer>()); | 36 | MOCK_METHOD0(get_current_buffer, std::shared_ptr<client::ClientBuffer>()); |
212 | 37 | MOCK_METHOD0(request_and_wait_for_next_buffer, void()); | 37 | MOCK_METHOD0(request_and_wait_for_next_buffer, void()); |
213 | 38 | MOCK_METHOD2(request_and_wait_for_configure, void(MirSurfaceAttrib,int)); | 38 | MOCK_METHOD2(request_and_wait_for_configure, void(MirSurfaceAttrib,int)); |
214 | 39 | MOCK_METHOD1(set_buffer_cache_size, void(unsigned int)); | ||
215 | 39 | }; | 40 | }; |
216 | 40 | 41 | ||
217 | 41 | } | 42 | } |
218 | 42 | 43 | ||
219 | === modified file 'tests/include/mir_test_doubles/stub_driver_interpreter.h' | |||
220 | --- tests/include/mir_test_doubles/stub_driver_interpreter.h 2014-03-06 06:05:17 +0000 | |||
221 | +++ tests/include/mir_test_doubles/stub_driver_interpreter.h 2015-04-27 19:10:30 +0000 | |||
222 | @@ -42,17 +42,20 @@ | |||
223 | 42 | { | 42 | { |
224 | 43 | } | 43 | } |
225 | 44 | 44 | ||
227 | 45 | mir::graphics::NativeBuffer* driver_requests_buffer() | 45 | mir::graphics::NativeBuffer* driver_requests_buffer() override |
228 | 46 | { | 46 | { |
229 | 47 | return nullptr; | 47 | return nullptr; |
230 | 48 | } | 48 | } |
231 | 49 | |||
232 | 49 | void driver_returns_buffer(ANativeWindowBuffer*, int) | 50 | void driver_returns_buffer(ANativeWindowBuffer*, int) |
233 | 50 | { | 51 | { |
234 | 51 | } | 52 | } |
236 | 52 | void dispatch_driver_request_format(int) | 53 | |
237 | 54 | void dispatch_driver_request_format(int) override | ||
238 | 53 | { | 55 | { |
239 | 54 | } | 56 | } |
241 | 55 | int driver_requests_info(int index) const | 57 | |
242 | 58 | int driver_requests_info(int index) const override | ||
243 | 56 | { | 59 | { |
244 | 57 | if (index == NATIVE_WINDOW_WIDTH) | 60 | if (index == NATIVE_WINDOW_WIDTH) |
245 | 58 | return sz.width.as_uint32_t(); | 61 | return sz.width.as_uint32_t(); |
246 | @@ -62,9 +65,14 @@ | |||
247 | 62 | return visual_id; | 65 | return visual_id; |
248 | 63 | return 0; | 66 | return 0; |
249 | 64 | } | 67 | } |
251 | 65 | void sync_to_display(bool) | 68 | |
252 | 69 | void sync_to_display(bool) override | ||
253 | 66 | { | 70 | { |
254 | 67 | } | 71 | } |
255 | 72 | |||
256 | 73 | void dispatch_driver_request_buffer_count(unsigned int) override | ||
257 | 74 | { | ||
258 | 75 | } | ||
259 | 68 | private: | 76 | private: |
260 | 69 | mir::geometry::Size sz; | 77 | mir::geometry::Size sz; |
261 | 70 | int visual_id; | 78 | int visual_id; |
262 | 71 | 79 | ||
263 | === modified file 'tests/unit-tests/client/android/test_android_native_window.cpp' | |||
264 | --- tests/unit-tests/client/android/test_android_native_window.cpp 2015-03-31 02:35:42 +0000 | |||
265 | +++ tests/unit-tests/client/android/test_android_native_window.cpp 2015-04-27 19:10:30 +0000 | |||
266 | @@ -47,6 +47,7 @@ | |||
267 | 47 | MOCK_METHOD1(dispatch_driver_request_format, void(int)); | 47 | MOCK_METHOD1(dispatch_driver_request_format, void(int)); |
268 | 48 | MOCK_CONST_METHOD1(driver_requests_info, int(int)); | 48 | MOCK_CONST_METHOD1(driver_requests_info, int(int)); |
269 | 49 | MOCK_METHOD1(sync_to_display, void(bool)); | 49 | MOCK_METHOD1(sync_to_display, void(bool)); |
270 | 50 | MOCK_METHOD1(dispatch_driver_request_buffer_count, void(unsigned int)); | ||
271 | 50 | 51 | ||
272 | 51 | std::shared_ptr<mir::graphics::NativeBuffer> buffer; | 52 | std::shared_ptr<mir::graphics::NativeBuffer> buffer; |
273 | 52 | }; | 53 | }; |
274 | @@ -113,6 +114,14 @@ | |||
275 | 113 | window.perform(&window, NATIVE_WINDOW_SET_BUFFERS_FORMAT, format); | 114 | window.perform(&window, NATIVE_WINDOW_SET_BUFFERS_FORMAT, format); |
276 | 114 | } | 115 | } |
277 | 115 | 116 | ||
278 | 117 | TEST_F(AndroidNativeWindowTest, native_window_perform_hook_calls_set_buffer) | ||
279 | 118 | { | ||
280 | 119 | int const size = 4; | ||
281 | 120 | EXPECT_CALL(*mock_driver_interpreter, dispatch_driver_request_buffer_count(size)); | ||
282 | 121 | ASSERT_NE(nullptr, window.perform); | ||
283 | 122 | window.perform(&window, NATIVE_WINDOW_SET_BUFFER_COUNT, size); | ||
284 | 123 | } | ||
285 | 124 | |||
286 | 116 | /* setSwapInterval hook tests */ | 125 | /* setSwapInterval hook tests */ |
287 | 117 | TEST_F(AndroidNativeWindowTest, native_window_setswapinterval_hook_callable) | 126 | TEST_F(AndroidNativeWindowTest, native_window_setswapinterval_hook_callable) |
288 | 118 | { | 127 | { |
289 | 119 | 128 | ||
290 | === modified file 'tests/unit-tests/client/android/test_egl_native_surface_interpreter.cpp' | |||
291 | --- tests/unit-tests/client/android/test_egl_native_surface_interpreter.cpp 2015-03-31 02:35:42 +0000 | |||
292 | +++ tests/unit-tests/client/android/test_egl_native_surface_interpreter.cpp 2015-04-27 19:10:30 +0000 | |||
293 | @@ -20,6 +20,7 @@ | |||
294 | 20 | #include "mir/graphics/android/native_buffer.h" | 20 | #include "mir/graphics/android/native_buffer.h" |
295 | 21 | #include "mir/egl_native_surface.h" | 21 | #include "mir/egl_native_surface.h" |
296 | 22 | #include "mir/client_buffer.h" | 22 | #include "mir/client_buffer.h" |
297 | 23 | #include "mir/frontend/client_constants.h" | ||
298 | 23 | #include "src/platforms/android/client/egl_native_surface_interpreter.h" | 24 | #include "src/platforms/android/client/egl_native_surface_interpreter.h" |
299 | 24 | #include "mir_test_doubles/stub_android_native_buffer.h" | 25 | #include "mir_test_doubles/stub_android_native_buffer.h" |
300 | 25 | #include "mir_test/fake_shared.h" | 26 | #include "mir_test/fake_shared.h" |
301 | @@ -79,6 +80,7 @@ | |||
302 | 79 | MOCK_METHOD0(get_current_buffer, std::shared_ptr<mcl::ClientBuffer>()); | 80 | MOCK_METHOD0(get_current_buffer, std::shared_ptr<mcl::ClientBuffer>()); |
303 | 80 | MOCK_METHOD0(request_and_wait_for_next_buffer, void()); | 81 | MOCK_METHOD0(request_and_wait_for_next_buffer, void()); |
304 | 81 | MOCK_METHOD2(request_and_wait_for_configure, void(MirSurfaceAttrib, int)); | 82 | MOCK_METHOD2(request_and_wait_for_configure, void(MirSurfaceAttrib, int)); |
305 | 83 | MOCK_METHOD1(set_buffer_cache_size, void(unsigned int)); | ||
306 | 82 | MirSurfaceParameters params; | 84 | MirSurfaceParameters params; |
307 | 83 | }; | 85 | }; |
308 | 84 | 86 | ||
309 | @@ -246,3 +248,22 @@ | |||
310 | 246 | interpreter.sync_to_display(true); | 248 | interpreter.sync_to_display(true); |
311 | 247 | interpreter.sync_to_display(false); | 249 | interpreter.sync_to_display(false); |
312 | 248 | } | 250 | } |
313 | 251 | |||
314 | 252 | TEST_F(AndroidInterpreter, request_to_set_buffer_count_sets_cache_size) | ||
315 | 253 | { | ||
316 | 254 | int new_size = 5; | ||
317 | 255 | testing::NiceMock<MockMirSurface> mock_surface{surf_params}; | ||
318 | 256 | EXPECT_CALL(mock_surface, set_buffer_cache_size(new_size)); | ||
319 | 257 | mcla::EGLNativeSurfaceInterpreter interpreter(mock_surface); | ||
320 | 258 | interpreter.dispatch_driver_request_buffer_count(new_size); | ||
321 | 259 | } | ||
322 | 260 | |||
323 | 261 | TEST_F(AndroidInterpreter, does_not_set_lower_than_mir_frontend_cache_size) | ||
324 | 262 | { | ||
325 | 263 | int new_size = mir::frontend::client_buffer_cache_size - 1; | ||
326 | 264 | testing::NiceMock<MockMirSurface> mock_surface{surf_params}; | ||
327 | 265 | EXPECT_CALL(mock_surface, set_buffer_cache_size(new_size)) | ||
328 | 266 | .Times(0); | ||
329 | 267 | mcla::EGLNativeSurfaceInterpreter interpreter(mock_surface); | ||
330 | 268 | interpreter.dispatch_driver_request_buffer_count(new_size); | ||
331 | 269 | } | ||
332 | 249 | 270 | ||
333 | === modified file 'tests/unit-tests/client/test_client_buffer_depository.cpp' | |||
334 | --- tests/unit-tests/client/test_client_buffer_depository.cpp 2015-01-21 07:34:50 +0000 | |||
335 | +++ tests/unit-tests/client/test_client_buffer_depository.cpp 2015-04-27 19:10:30 +0000 | |||
336 | @@ -26,6 +26,7 @@ | |||
337 | 26 | 26 | ||
338 | 27 | #include <gtest/gtest.h> | 27 | #include <gtest/gtest.h> |
339 | 28 | #include <gmock/gmock.h> | 28 | #include <gmock/gmock.h> |
340 | 29 | #include <stdexcept> | ||
341 | 29 | 30 | ||
342 | 30 | namespace geom=mir::geometry; | 31 | namespace geom=mir::geometry; |
343 | 31 | namespace mcl=mir::client; | 32 | namespace mcl=mir::client; |
344 | @@ -94,7 +95,7 @@ | |||
345 | 94 | std::weak_ptr<mcl::ClientBuffer> first_allocated_buffer; | 95 | std::weak_ptr<mcl::ClientBuffer> first_allocated_buffer; |
346 | 95 | }; | 96 | }; |
347 | 96 | 97 | ||
349 | 97 | struct MirBufferDepositoryTest : public testing::Test | 98 | struct ClientBufferDepository : public testing::Test |
350 | 98 | { | 99 | { |
351 | 99 | void SetUp() | 100 | void SetUp() |
352 | 100 | { | 101 | { |
353 | @@ -120,7 +121,7 @@ | |||
354 | 120 | return value == arg; | 121 | return value == arg; |
355 | 121 | } | 122 | } |
356 | 122 | 123 | ||
358 | 123 | TEST_F(MirBufferDepositoryTest, depository_sets_width_and_height) | 124 | TEST_F(ClientBufferDepository, sets_width_and_height) |
359 | 124 | { | 125 | { |
360 | 125 | using namespace testing; | 126 | using namespace testing; |
361 | 126 | 127 | ||
362 | @@ -131,7 +132,7 @@ | |||
363 | 131 | depository.deposit_package(package, 8, size, pf); | 132 | depository.deposit_package(package, 8, size, pf); |
364 | 132 | } | 133 | } |
365 | 133 | 134 | ||
367 | 134 | TEST_F(MirBufferDepositoryTest, depository_new_deposit_changes_current_buffer) | 135 | TEST_F(ClientBufferDepository, changes_current_buffer_on_new_deposit) |
368 | 135 | { | 136 | { |
369 | 136 | using namespace testing; | 137 | using namespace testing; |
370 | 137 | 138 | ||
371 | @@ -147,7 +148,7 @@ | |||
372 | 147 | EXPECT_NE(buffer1, buffer2); | 148 | EXPECT_NE(buffer1, buffer2); |
373 | 148 | } | 149 | } |
374 | 149 | 150 | ||
376 | 150 | TEST_F(MirBufferDepositoryTest, depository_sets_buffer_age_to_zero_for_new_buffer) | 151 | TEST_F(ClientBufferDepository, sets_buffer_age_to_zero_for_new_buffer) |
377 | 151 | { | 152 | { |
378 | 152 | using namespace testing; | 153 | using namespace testing; |
379 | 153 | 154 | ||
380 | @@ -159,7 +160,7 @@ | |||
381 | 159 | EXPECT_EQ(0u, buffer1->age()); | 160 | EXPECT_EQ(0u, buffer1->age()); |
382 | 160 | } | 161 | } |
383 | 161 | 162 | ||
385 | 162 | TEST_F(MirBufferDepositoryTest, just_sumbitted_buffer_has_age_1) | 163 | TEST_F(ClientBufferDepository, has_age_1_for_just_sumbitted_buffer) |
386 | 163 | { | 164 | { |
387 | 164 | using namespace testing; | 165 | using namespace testing; |
388 | 165 | 166 | ||
389 | @@ -177,7 +178,7 @@ | |||
390 | 177 | EXPECT_EQ(1u, buffer1->age()); | 178 | EXPECT_EQ(1u, buffer1->age()); |
391 | 178 | } | 179 | } |
392 | 179 | 180 | ||
394 | 180 | TEST_F(MirBufferDepositoryTest, submitting_buffer_ages_other_buffers) | 181 | TEST_F(ClientBufferDepository, ages_other_buffers_on_new_submission) |
395 | 181 | { | 182 | { |
396 | 182 | using namespace testing; | 183 | using namespace testing; |
397 | 183 | 184 | ||
398 | @@ -204,7 +205,7 @@ | |||
399 | 204 | EXPECT_EQ(0u, buffer3->age()); | 205 | EXPECT_EQ(0u, buffer3->age()); |
400 | 205 | } | 206 | } |
401 | 206 | 207 | ||
403 | 207 | TEST_F(MirBufferDepositoryTest, double_buffering_reaches_steady_state_age) | 208 | TEST_F(ClientBufferDepository, reaches_steady_state_age_for_double_buffering) |
404 | 208 | { | 209 | { |
405 | 209 | using namespace testing; | 210 | using namespace testing; |
406 | 210 | 211 | ||
407 | @@ -233,7 +234,7 @@ | |||
408 | 233 | EXPECT_EQ(2u, buffer2->age()); | 234 | EXPECT_EQ(2u, buffer2->age()); |
409 | 234 | } | 235 | } |
410 | 235 | 236 | ||
412 | 236 | TEST_F(MirBufferDepositoryTest, triple_buffering_reaches_steady_state_age) | 237 | TEST_F(ClientBufferDepository, reaches_steady_state_age_when_triple_buffering) |
413 | 237 | { | 238 | { |
414 | 238 | using namespace testing; | 239 | using namespace testing; |
415 | 239 | 240 | ||
416 | @@ -273,7 +274,7 @@ | |||
417 | 273 | EXPECT_EQ(3u, buffer3->age()); | 274 | EXPECT_EQ(3u, buffer3->age()); |
418 | 274 | } | 275 | } |
419 | 275 | 276 | ||
421 | 276 | TEST_F(MirBufferDepositoryTest, depository_destroys_old_buffers) | 277 | TEST_F(ClientBufferDepository, destroys_old_buffers) |
422 | 277 | { | 278 | { |
423 | 278 | using namespace testing; | 279 | using namespace testing; |
424 | 279 | const int num_buffers = 3; | 280 | const int num_buffers = 3; |
425 | @@ -295,7 +296,7 @@ | |||
426 | 295 | EXPECT_TRUE(mock_factory->first_buffer_allocated_and_then_freed()); | 296 | EXPECT_TRUE(mock_factory->first_buffer_allocated_and_then_freed()); |
427 | 296 | } | 297 | } |
428 | 297 | 298 | ||
430 | 298 | TEST_F(MirBufferDepositoryTest, depositing_packages_implicitly_submits_current_buffer) | 299 | TEST_F(ClientBufferDepository, implicitly_submits_current_buffer_on_deposit) |
431 | 299 | { | 300 | { |
432 | 300 | using namespace testing; | 301 | using namespace testing; |
433 | 301 | const int num_buffers = 3; | 302 | const int num_buffers = 3; |
434 | @@ -310,7 +311,7 @@ | |||
435 | 310 | depository.deposit_package(package2, 2, size, pf); | 311 | depository.deposit_package(package2, 2, size, pf); |
436 | 311 | } | 312 | } |
437 | 312 | 313 | ||
439 | 313 | TEST_F(MirBufferDepositoryTest, depository_frees_buffers_after_reaching_capacity) | 314 | TEST_F(ClientBufferDepository, frees_buffers_after_reaching_capacity) |
440 | 314 | { | 315 | { |
441 | 315 | using namespace testing; | 316 | using namespace testing; |
442 | 316 | std::shared_ptr<mcl::ClientBufferDepository> depository; | 317 | std::shared_ptr<mcl::ClientBufferDepository> depository; |
443 | @@ -334,7 +335,7 @@ | |||
444 | 334 | } | 335 | } |
445 | 335 | } | 336 | } |
446 | 336 | 337 | ||
448 | 337 | TEST_F(MirBufferDepositoryTest, depository_caches_recently_seen_buffer) | 338 | TEST_F(ClientBufferDepository, caches_recently_seen_buffer) |
449 | 338 | { | 339 | { |
450 | 339 | using namespace testing; | 340 | using namespace testing; |
451 | 340 | 341 | ||
452 | @@ -358,7 +359,7 @@ | |||
453 | 358 | depository.deposit_package(package3, 8, size, pf); | 359 | depository.deposit_package(package3, 8, size, pf); |
454 | 359 | } | 360 | } |
455 | 360 | 361 | ||
457 | 361 | TEST_F(MirBufferDepositoryTest, depository_creates_new_buffer_for_different_id) | 362 | TEST_F(ClientBufferDepository, creates_new_buffer_for_different_id) |
458 | 362 | { | 363 | { |
459 | 363 | using namespace testing; | 364 | using namespace testing; |
460 | 364 | 365 | ||
461 | @@ -374,7 +375,7 @@ | |||
462 | 374 | depository.deposit_package(package2, 9, size, pf); | 375 | depository.deposit_package(package2, 9, size, pf); |
463 | 375 | } | 376 | } |
464 | 376 | 377 | ||
466 | 377 | TEST_F(MirBufferDepositoryTest, depository_keeps_last_2_buffers_regardless_of_age) | 378 | TEST_F(ClientBufferDepository, keeps_last_2_buffers_regardless_of_age) |
467 | 378 | { | 379 | { |
468 | 379 | using namespace testing; | 380 | using namespace testing; |
469 | 380 | 381 | ||
470 | @@ -389,7 +390,7 @@ | |||
471 | 389 | depository.deposit_package(package, 8, size, pf); | 390 | depository.deposit_package(package, 8, size, pf); |
472 | 390 | } | 391 | } |
473 | 391 | 392 | ||
475 | 392 | TEST_F(MirBufferDepositoryTest, depository_keeps_last_3_buffers_regardless_of_age) | 393 | TEST_F(ClientBufferDepository, keeps_last_3_buffers_regardless_of_age) |
476 | 393 | { | 394 | { |
477 | 394 | using namespace testing; | 395 | using namespace testing; |
478 | 395 | 396 | ||
479 | @@ -406,3 +407,54 @@ | |||
480 | 406 | depository.deposit_package(package, 10, size, pf); | 407 | depository.deposit_package(package, 10, size, pf); |
481 | 407 | depository.deposit_package(package, 8, size, pf); | 408 | depository.deposit_package(package, 8, size, pf); |
482 | 408 | } | 409 | } |
483 | 410 | |||
484 | 411 | TEST_F(ClientBufferDepository, can_decrease_cache_size) | ||
485 | 412 | { | ||
486 | 413 | using namespace testing; | ||
487 | 414 | int initial_size{3}; | ||
488 | 415 | int changed_size{2}; | ||
489 | 416 | mcl::ClientBufferDepository depository{mock_factory, initial_size}; | ||
490 | 417 | EXPECT_CALL(*mock_factory, create_buffer(_,_,_)) | ||
491 | 418 | .Times(4); | ||
492 | 419 | |||
493 | 420 | depository.deposit_package(package, 8, size, pf); | ||
494 | 421 | depository.deposit_package(package, 9, size, pf); | ||
495 | 422 | depository.deposit_package(package, 10, size, pf); | ||
496 | 423 | depository.deposit_package(package, 9, size, pf); | ||
497 | 424 | depository.deposit_package(package, 10, size, pf); | ||
498 | 425 | |||
499 | 426 | depository.set_max_buffers(changed_size); //8 should be kicked out | ||
500 | 427 | depository.deposit_package(package, 8, size, pf); | ||
501 | 428 | } | ||
502 | 429 | |||
503 | 430 | TEST_F(ClientBufferDepository, can_increase_cache_size) | ||
504 | 431 | { | ||
505 | 432 | using namespace testing; | ||
506 | 433 | int initial_size{3}; | ||
507 | 434 | int changed_size{4}; | ||
508 | 435 | mcl::ClientBufferDepository depository{mock_factory, initial_size}; | ||
509 | 436 | EXPECT_CALL(*mock_factory, create_buffer(_,_,_)) | ||
510 | 437 | .Times(4); | ||
511 | 438 | |||
512 | 439 | depository.deposit_package(package, 8, size, pf); | ||
513 | 440 | depository.deposit_package(package, 9, size, pf); | ||
514 | 441 | depository.deposit_package(package, 10, size, pf); | ||
515 | 442 | depository.deposit_package(package, 9, size, pf); | ||
516 | 443 | depository.deposit_package(package, 10, size, pf); | ||
517 | 444 | depository.set_max_buffers(changed_size); | ||
518 | 445 | depository.deposit_package(package, 7, size, pf); | ||
519 | 446 | depository.deposit_package(package, 8, size, pf); | ||
520 | 447 | } | ||
521 | 448 | |||
522 | 449 | TEST_F(ClientBufferDepository, cannot_have_zero_size) | ||
523 | 450 | { | ||
524 | 451 | int initial_size{3}; | ||
525 | 452 | EXPECT_THROW({ | ||
526 | 453 | mcl::ClientBufferDepository depository(mock_factory, 0); | ||
527 | 454 | }, std::logic_error); | ||
528 | 455 | |||
529 | 456 | mcl::ClientBufferDepository depository{mock_factory, initial_size}; | ||
530 | 457 | EXPECT_THROW({ | ||
531 | 458 | depository.set_max_buffers(0); | ||
532 | 459 | }, std::logic_error); | ||
533 | 460 | } |
PASSED: Continuous integration, rev:2508 jenkins. qa.ubuntu. com/job/ mir-ci/ 3590/ jenkins. qa.ubuntu. com/job/ mir-android- vivid-i386- build/2148 jenkins. qa.ubuntu. com/job/ mir-clang- vivid-amd64- build/2147 jenkins. qa.ubuntu. com/job/ mir-mediumtests -vivid- touch/2098 jenkins. qa.ubuntu. com/job/ mir-vivid- amd64-ci/ 1587 jenkins. qa.ubuntu. com/job/ mir-vivid- amd64-ci/ 1587/artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ mir-mediumtests -builder- vivid-armhf/ 2098 jenkins. qa.ubuntu. com/job/ mir-mediumtests -builder- vivid-armhf/ 2098/artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ mir-mediumtests -runner- mako/5022 s-jenkins. ubuntu- ci:8080/ job/touch- flash-device/ 19856
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/mir- ci/3590/ rebuild
http://