Merge lp:~kdub/mir/interval0-signal into lp:~mir-team/mir/trunk
- interval0-signal
- Merge into trunk
Status: | Superseded | ||||
---|---|---|---|---|---|
Proposed branch: | lp:~kdub/mir/interval0-signal | ||||
Merge into: | lp:~mir-team/mir/trunk | ||||
Diff against target: |
1401 lines (+687/-108) 43 files modified
include/client/mir_toolkit/mir_client_library.h (+18/-0) include/server/mir/compositor/buffer_allocation_strategy.h (+1/-1) include/server/mir/compositor/buffer_stream_surfaces.h (+1/-0) include/server/mir/compositor/swapper_factory.h (+6/-2) include/server/mir/graphics/gl_renderer.h (+0/-1) include/server/mir/graphics/renderer.h (+0/-1) include/server/mir/shell/surface.h (+1/-0) include/server/mir/surfaces/buffer_stream.h (+1/-0) include/server/mir/surfaces/surface.h (+2/-0) include/shared/mir/graphics/android/mir_native_buffer.h (+59/-0) include/shared/mir_toolkit/common.h (+7/-0) include/test/mir_test_doubles/mock_buffer_stream.h (+2/-0) include/test/mir_test_doubles/mock_surface_renderer.h (+1/-2) include/test/mir_test_doubles/mock_swapper_factory.h (+2/-2) include/test/mir_test_doubles/null_buffer_stream.h (+4/-0) src/client/android/android_client_buffer.cpp (+29/-11) src/client/mir_client_library.cpp (+32/-0) src/client/mir_surface.cpp (+2/-0) src/server/compositor/buffer_stream_surfaces.cpp (+4/-0) src/server/compositor/rendering_operator.cpp (+0/-1) src/server/compositor/swapper_factory.cpp (+35/-9) src/server/compositor/switching_bundle.cpp (+2/-2) src/server/graphics/android/android_alloc_adaptor.cpp (+8/-19) src/server/graphics/gl_renderer.cpp (+0/-8) src/server/shell/surface.cpp (+14/-1) src/server/surfaces/surface.cpp (+5/-0) src/shared/graphics/android/CMakeLists.txt (+1/-0) src/shared/graphics/android/mir_native_buffer.cpp (+73/-0) tests/acceptance-tests/test_server_shutdown.cpp (+0/-3) tests/integration-tests/CMakeLists.txt (+1/-0) tests/integration-tests/test_surface_first_frame_sync.cpp (+0/-2) tests/integration-tests/test_swapinterval.cpp (+226/-0) tests/mir_test_framework/testing_server_options.cpp (+0/-4) tests/unit-tests/client/android/test_client_android_buffer.cpp (+2/-2) tests/unit-tests/compositor/test_buffer_stream.cpp (+9/-0) tests/unit-tests/compositor/test_rendering_operator.cpp (+0/-12) tests/unit-tests/compositor/test_swapper_factory.cpp (+50/-2) tests/unit-tests/compositor/test_switching_bundle.cpp (+3/-3) tests/unit-tests/graphics/android/CMakeLists.txt (+1/-0) tests/unit-tests/graphics/android/test_android_alloc_adaptor.cpp (+3/-10) tests/unit-tests/graphics/android/test_external_refcount.cpp (+70/-0) tests/unit-tests/graphics/test_gl_renderer.cpp (+0/-10) tests/unit-tests/surfaces/test_surface.cpp (+12/-0) |
||||
To merge this branch: | bzr merge lp:~kdub/mir/interval0-signal | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
PS Jenkins bot (community) | continuous-integration | Approve | |
Mir development team | Pending | ||
Review via email: mp+169941@code.launchpad.net |
This proposal has been superseded by a proposal from 2013-06-19.
Commit message
Activate sending a "swapinterval" signal over IPC. Add client api for software clients to request different swapintervals. (eglSwapInterval is not glued together just yet). Currently only swapinterval of 0 or 1 is supported.
Description of the change
Activate sending a "swapinterval" signal over IPC. Add client api for software clients to request different swapintervals. (eglSwapInterval is not glued together just yet)
Currently only swapinterval of 0 or 1 is supported.
note that the actual path taken over ipc is via the surface parameters, there is no new protobuf message introduced to support the message.
tests/integrati
still in pre-review, dependent on anativewindow-
PS Jenkins bot (ps-jenkins) wrote : | # |
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:758
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
UNSTABLE: http://
Click here to trigger a rebuild:
http://
Preview Diff
1 | === modified file 'include/client/mir_toolkit/mir_client_library.h' | |||
2 | --- include/client/mir_toolkit/mir_client_library.h 2013-06-06 08:36:17 +0000 | |||
3 | +++ include/client/mir_toolkit/mir_client_library.h 2013-06-19 18:36:29 +0000 | |||
4 | @@ -293,6 +293,24 @@ | |||
5 | 293 | */ | 293 | */ |
6 | 294 | MirSurfaceState mir_surface_get_state(MirSurface *surface); | 294 | MirSurfaceState mir_surface_get_state(MirSurface *surface); |
7 | 295 | 295 | ||
8 | 296 | /** | ||
9 | 297 | * Set the swapinterval for mir_surface_swap_buffers. EGL users should use | ||
10 | 298 | * eglSwapInterval directly. | ||
11 | 299 | * \param [in] surface The surface to operate on | ||
12 | 300 | * \param [in] interval The number of vblank signals that | ||
13 | 301 | * mir_surface_swap_buffers will wait for | ||
14 | 302 | * \return A wait handle that can be passed to mir_wait_for | ||
15 | 303 | */ | ||
16 | 304 | MirWaitHandle* mir_surface_set_swapinterval(MirSurface* surface, int interval); | ||
17 | 305 | |||
18 | 306 | /** | ||
19 | 307 | * Query the swapinterval that the surface is operating with. | ||
20 | 308 | * The default interval is 1. | ||
21 | 309 | * \param [in] surface The surface to operate on | ||
22 | 310 | * \return The swapinterval value that the client is operating with | ||
23 | 311 | */ | ||
24 | 312 | int mir_surface_get_swapinterval(MirSurface* surface); | ||
25 | 313 | |||
26 | 296 | #ifdef __cplusplus | 314 | #ifdef __cplusplus |
27 | 297 | } | 315 | } |
28 | 298 | /**@}*/ | 316 | /**@}*/ |
29 | 299 | 317 | ||
30 | === modified file 'include/server/mir/compositor/buffer_allocation_strategy.h' | |||
31 | --- include/server/mir/compositor/buffer_allocation_strategy.h 2013-06-11 14:27:33 +0000 | |||
32 | +++ include/server/mir/compositor/buffer_allocation_strategy.h 2013-06-19 18:36:29 +0000 | |||
33 | @@ -45,7 +45,7 @@ | |||
34 | 45 | class BufferAllocationStrategy | 45 | class BufferAllocationStrategy |
35 | 46 | { | 46 | { |
36 | 47 | public: | 47 | public: |
38 | 48 | virtual std::shared_ptr<BufferSwapper> create_swapper_reuse_buffers( | 48 | virtual std::shared_ptr<BufferSwapper> create_swapper_reuse_buffers(BufferProperties const&, |
39 | 49 | std::vector<std::shared_ptr<Buffer>>&, size_t, SwapperType) const = 0; | 49 | std::vector<std::shared_ptr<Buffer>>&, size_t, SwapperType) const = 0; |
40 | 50 | virtual std::shared_ptr<BufferSwapper> create_swapper_new_buffers( | 50 | virtual std::shared_ptr<BufferSwapper> create_swapper_new_buffers( |
41 | 51 | BufferProperties& actual_properties, BufferProperties const& requested_properties, SwapperType) const = 0; | 51 | BufferProperties& actual_properties, BufferProperties const& requested_properties, SwapperType) const = 0; |
42 | 52 | 52 | ||
43 | === modified file 'include/server/mir/compositor/buffer_stream_surfaces.h' | |||
44 | --- include/server/mir/compositor/buffer_stream_surfaces.h 2013-06-18 09:44:11 +0000 | |||
45 | +++ include/server/mir/compositor/buffer_stream_surfaces.h 2013-06-19 18:36:29 +0000 | |||
46 | @@ -47,6 +47,7 @@ | |||
47 | 47 | 47 | ||
48 | 48 | geometry::PixelFormat get_stream_pixel_format(); | 48 | geometry::PixelFormat get_stream_pixel_format(); |
49 | 49 | geometry::Size stream_size(); | 49 | geometry::Size stream_size(); |
50 | 50 | void allow_framedropping(bool); | ||
51 | 50 | void force_requests_to_complete(); | 51 | void force_requests_to_complete(); |
52 | 51 | 52 | ||
53 | 52 | protected: | 53 | protected: |
54 | 53 | 54 | ||
55 | === modified file 'include/server/mir/compositor/swapper_factory.h' | |||
56 | --- include/server/mir/compositor/swapper_factory.h 2013-06-11 15:05:27 +0000 | |||
57 | +++ include/server/mir/compositor/swapper_factory.h 2013-06-19 18:36:29 +0000 | |||
58 | @@ -38,14 +38,18 @@ | |||
59 | 38 | std::shared_ptr<GraphicBufferAllocator> const& gr_alloc, | 38 | std::shared_ptr<GraphicBufferAllocator> const& gr_alloc, |
60 | 39 | int number_of_buffers); | 39 | int number_of_buffers); |
61 | 40 | 40 | ||
63 | 41 | std::shared_ptr<BufferSwapper> create_swapper_reuse_buffers( | 41 | std::shared_ptr<BufferSwapper> create_swapper_reuse_buffers(BufferProperties const&, |
64 | 42 | std::vector<std::shared_ptr<Buffer>>&, size_t, SwapperType) const; | 42 | std::vector<std::shared_ptr<Buffer>>&, size_t, SwapperType) const; |
65 | 43 | std::shared_ptr<BufferSwapper> create_swapper_new_buffers( | 43 | std::shared_ptr<BufferSwapper> create_swapper_new_buffers( |
66 | 44 | BufferProperties& actual_properties, BufferProperties const& requested_properties, SwapperType) const; | 44 | BufferProperties& actual_properties, BufferProperties const& requested_properties, SwapperType) const; |
67 | 45 | 45 | ||
68 | 46 | private: | 46 | private: |
69 | 47 | void change_swapper_size( | ||
70 | 48 | std::vector<std::shared_ptr<Buffer>>&, size_t const, size_t, BufferProperties const&) const; | ||
71 | 49 | |||
72 | 47 | std::shared_ptr<GraphicBufferAllocator> const gr_allocator; | 50 | std::shared_ptr<GraphicBufferAllocator> const gr_allocator; |
74 | 48 | int const number_of_buffers; | 51 | unsigned int const synchronous_number_of_buffers; |
75 | 52 | unsigned int const spin_number_of_buffers; | ||
76 | 49 | }; | 53 | }; |
77 | 50 | } | 54 | } |
78 | 51 | } | 55 | } |
79 | 52 | 56 | ||
80 | === modified file 'include/server/mir/graphics/gl_renderer.h' | |||
81 | --- include/server/mir/graphics/gl_renderer.h 2013-05-21 15:11:41 +0000 | |||
82 | +++ include/server/mir/graphics/gl_renderer.h 2013-06-19 18:36:29 +0000 | |||
83 | @@ -37,7 +37,6 @@ | |||
84 | 37 | 37 | ||
85 | 38 | /* From renderer */ | 38 | /* From renderer */ |
86 | 39 | void render(std::function<void(std::shared_ptr<void> const&)> save_resource, Renderable& renderable); | 39 | void render(std::function<void(std::shared_ptr<void> const&)> save_resource, Renderable& renderable); |
87 | 40 | void ensure_no_live_buffers_bound(); | ||
88 | 41 | void clear(); | 40 | void clear(); |
89 | 42 | 41 | ||
90 | 43 | ~GLRenderer() noexcept {} | 42 | ~GLRenderer() noexcept {} |
91 | 44 | 43 | ||
92 | === modified file 'include/server/mir/graphics/renderer.h' | |||
93 | --- include/server/mir/graphics/renderer.h 2013-05-21 15:11:41 +0000 | |||
94 | +++ include/server/mir/graphics/renderer.h 2013-06-19 18:36:29 +0000 | |||
95 | @@ -36,7 +36,6 @@ | |||
96 | 36 | 36 | ||
97 | 37 | virtual void clear() = 0; | 37 | virtual void clear() = 0; |
98 | 38 | virtual void render(std::function<void(std::shared_ptr<void> const&)> save_resource, Renderable& renderable) = 0; | 38 | virtual void render(std::function<void(std::shared_ptr<void> const&)> save_resource, Renderable& renderable) = 0; |
99 | 39 | virtual void ensure_no_live_buffers_bound() = 0; | ||
100 | 40 | 39 | ||
101 | 41 | protected: | 40 | protected: |
102 | 42 | Renderer() = default; | 41 | Renderer() = default; |
103 | 43 | 42 | ||
104 | === modified file 'include/server/mir/shell/surface.h' | |||
105 | --- include/server/mir/shell/surface.h 2013-06-17 19:47:07 +0000 | |||
106 | +++ include/server/mir/shell/surface.h 2013-06-19 18:36:29 +0000 | |||
107 | @@ -87,6 +87,7 @@ | |||
108 | 87 | 87 | ||
109 | 88 | virtual void take_input_focus(std::shared_ptr<InputTargeter> const& targeter); | 88 | virtual void take_input_focus(std::shared_ptr<InputTargeter> const& targeter); |
110 | 89 | 89 | ||
111 | 90 | virtual void allow_framedropping(bool); | ||
112 | 90 | private: | 91 | private: |
113 | 91 | bool set_type(MirSurfaceType t); // Use configure() to make public changes | 92 | bool set_type(MirSurfaceType t); // Use configure() to make public changes |
114 | 92 | bool set_state(MirSurfaceState s); | 93 | bool set_state(MirSurfaceState s); |
115 | 93 | 94 | ||
116 | === modified file 'include/server/mir/surfaces/buffer_stream.h' | |||
117 | --- include/server/mir/surfaces/buffer_stream.h 2013-06-13 10:40:42 +0000 | |||
118 | +++ include/server/mir/surfaces/buffer_stream.h 2013-06-19 18:36:29 +0000 | |||
119 | @@ -44,6 +44,7 @@ | |||
120 | 44 | virtual std::shared_ptr<surfaces::GraphicRegion> lock_back_buffer() = 0; | 44 | virtual std::shared_ptr<surfaces::GraphicRegion> lock_back_buffer() = 0; |
121 | 45 | virtual geometry::PixelFormat get_stream_pixel_format() = 0; | 45 | virtual geometry::PixelFormat get_stream_pixel_format() = 0; |
122 | 46 | virtual geometry::Size stream_size() = 0; | 46 | virtual geometry::Size stream_size() = 0; |
123 | 47 | virtual void allow_framedropping(bool) = 0; | ||
124 | 47 | virtual void force_requests_to_complete() = 0; | 48 | virtual void force_requests_to_complete() = 0; |
125 | 48 | }; | 49 | }; |
126 | 49 | 50 | ||
127 | 50 | 51 | ||
128 | === modified file 'include/server/mir/surfaces/surface.h' | |||
129 | --- include/server/mir/surfaces/surface.h 2013-06-12 15:36:31 +0000 | |||
130 | +++ include/server/mir/surfaces/surface.h 2013-06-19 18:36:29 +0000 | |||
131 | @@ -83,6 +83,8 @@ | |||
132 | 83 | bool supports_input() const; | 83 | bool supports_input() const; |
133 | 84 | int client_input_fd() const; | 84 | int client_input_fd() const; |
134 | 85 | int server_input_fd() const; | 85 | int server_input_fd() const; |
135 | 86 | |||
136 | 87 | void allow_framedropping(bool); | ||
137 | 86 | private: | 88 | private: |
138 | 87 | std::string surface_name; | 89 | std::string surface_name; |
139 | 88 | geometry::Point top_left_point; | 90 | geometry::Point top_left_point; |
140 | 89 | 91 | ||
141 | === added file 'include/shared/mir/graphics/android/mir_native_buffer.h' | |||
142 | --- include/shared/mir/graphics/android/mir_native_buffer.h 1970-01-01 00:00:00 +0000 | |||
143 | +++ include/shared/mir/graphics/android/mir_native_buffer.h 2013-06-19 18:36:29 +0000 | |||
144 | @@ -0,0 +1,59 @@ | |||
145 | 1 | /* | ||
146 | 2 | * Copyright © 2013 Canonical Ltd. | ||
147 | 3 | * | ||
148 | 4 | * This program is free software: you can redistribute it and/or modify it | ||
149 | 5 | * under the terms of the GNU Lesser General Public License version 3, | ||
150 | 6 | * as published by the Free Software Foundation. | ||
151 | 7 | * | ||
152 | 8 | * This program is distributed in the hope that it will be useful, | ||
153 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
154 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
155 | 11 | * GNU Lesser General Public License for more details. | ||
156 | 12 | * | ||
157 | 13 | * You should have received a copy of the GNU Lesser General Public License | ||
158 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
159 | 15 | * | ||
160 | 16 | * Authored by: Kevin DuBois <kevin.dubois@canonical.com> | ||
161 | 17 | */ | ||
162 | 18 | |||
163 | 19 | #ifndef MIR_GRAPHICS_ANDROID_MIR_NATIVE_BUFFER_H_ | ||
164 | 20 | #define MIR_GRAPHICS_ANDROID_MIR_NATIVE_BUFFER_H_ | ||
165 | 21 | |||
166 | 22 | #include <system/window.h> | ||
167 | 23 | #include <functional> | ||
168 | 24 | #include <atomic> | ||
169 | 25 | |||
170 | 26 | namespace mir | ||
171 | 27 | { | ||
172 | 28 | namespace graphics | ||
173 | 29 | { | ||
174 | 30 | namespace android | ||
175 | 31 | { | ||
176 | 32 | struct MirNativeBuffer : public ANativeWindowBuffer | ||
177 | 33 | { | ||
178 | 34 | MirNativeBuffer(std::function<void(MirNativeBuffer*)> free); | ||
179 | 35 | void driver_reference(); | ||
180 | 36 | void driver_dereference(); | ||
181 | 37 | void mir_dereference(); | ||
182 | 38 | |||
183 | 39 | private: | ||
184 | 40 | ~MirNativeBuffer(); | ||
185 | 41 | |||
186 | 42 | std::function<void(MirNativeBuffer*)> free_fn; | ||
187 | 43 | std::atomic<bool> mir_reference; | ||
188 | 44 | std::atomic<int> driver_references; | ||
189 | 45 | |||
190 | 46 | }; | ||
191 | 47 | |||
192 | 48 | struct MirNativeBufferDeleter | ||
193 | 49 | { | ||
194 | 50 | void operator()(MirNativeBuffer* a) | ||
195 | 51 | { | ||
196 | 52 | a->mir_dereference(); | ||
197 | 53 | } | ||
198 | 54 | }; | ||
199 | 55 | } | ||
200 | 56 | } | ||
201 | 57 | } | ||
202 | 58 | |||
203 | 59 | #endif /* MIR_GRAPHICS_ANDROID_MIR_NATIVE_BUFFER_H_ */ | ||
204 | 0 | 60 | ||
205 | === modified file 'include/shared/mir_toolkit/common.h' | |||
206 | --- include/shared/mir_toolkit/common.h 2013-05-03 22:53:42 +0000 | |||
207 | +++ include/shared/mir_toolkit/common.h 2013-06-19 18:36:29 +0000 | |||
208 | @@ -35,6 +35,7 @@ | |||
209 | 35 | { | 35 | { |
210 | 36 | mir_surface_attrib_type, | 36 | mir_surface_attrib_type, |
211 | 37 | mir_surface_attrib_state, | 37 | mir_surface_attrib_state, |
212 | 38 | mir_surface_attrib_performance_hint, | ||
213 | 38 | mir_surface_attrib_arraysize_ | 39 | mir_surface_attrib_arraysize_ |
214 | 39 | } MirSurfaceAttrib; | 40 | } MirSurfaceAttrib; |
215 | 40 | 41 | ||
216 | @@ -63,6 +64,12 @@ | |||
217 | 63 | mir_surface_state_arraysize_ | 64 | mir_surface_state_arraysize_ |
218 | 64 | } MirSurfaceState; | 65 | } MirSurfaceState; |
219 | 65 | 66 | ||
220 | 67 | typedef enum MirSurfacePerformanceHint | ||
221 | 68 | { | ||
222 | 69 | mir_surface_hint_synchronous, | ||
223 | 70 | mir_surface_hint_drop_frames, | ||
224 | 71 | mir_surface_hint_arraysize_ | ||
225 | 72 | } MirSurfacePerformanceHint; | ||
226 | 66 | /**@}*/ | 73 | /**@}*/ |
227 | 67 | 74 | ||
228 | 68 | #endif | 75 | #endif |
229 | 69 | 76 | ||
230 | === modified file 'include/test/mir_test_doubles/mock_buffer_stream.h' | |||
231 | --- include/test/mir_test_doubles/mock_buffer_stream.h 2013-06-13 10:40:42 +0000 | |||
232 | +++ include/test/mir_test_doubles/mock_buffer_stream.h 2013-06-19 18:36:29 +0000 | |||
233 | @@ -36,6 +36,8 @@ | |||
234 | 36 | 36 | ||
235 | 37 | MOCK_METHOD0(get_stream_pixel_format, geometry::PixelFormat()); | 37 | MOCK_METHOD0(get_stream_pixel_format, geometry::PixelFormat()); |
236 | 38 | MOCK_METHOD0(stream_size, geometry::Size()); | 38 | MOCK_METHOD0(stream_size, geometry::Size()); |
237 | 39 | MOCK_METHOD0(force_client_completion, void()); | ||
238 | 40 | MOCK_METHOD1(allow_framedropping, void(bool)); | ||
239 | 39 | MOCK_METHOD0(force_requests_to_complete, void()); | 41 | MOCK_METHOD0(force_requests_to_complete, void()); |
240 | 40 | }; | 42 | }; |
241 | 41 | } | 43 | } |
242 | 42 | 44 | ||
243 | === modified file 'include/test/mir_test_doubles/mock_surface_renderer.h' | |||
244 | --- include/test/mir_test_doubles/mock_surface_renderer.h 2013-05-21 15:11:41 +0000 | |||
245 | +++ include/test/mir_test_doubles/mock_surface_renderer.h 2013-06-19 18:36:29 +0000 | |||
246 | @@ -32,8 +32,7 @@ | |||
247 | 32 | struct MockSurfaceRenderer : public graphics::Renderer | 32 | struct MockSurfaceRenderer : public graphics::Renderer |
248 | 33 | { | 33 | { |
249 | 34 | MOCK_METHOD2(render, void(std::function<void(std::shared_ptr<void> const&)>, graphics::Renderable&)); | 34 | MOCK_METHOD2(render, void(std::function<void(std::shared_ptr<void> const&)>, graphics::Renderable&)); |
252 | 35 | MOCK_METHOD0(ensure_no_live_buffers_bound, void()); | 35 | MOCK_METHOD0(clear, void()); |
251 | 36 | MOCK_METHOD0(clear, void ()); | ||
253 | 37 | 36 | ||
254 | 38 | ~MockSurfaceRenderer() noexcept {} | 37 | ~MockSurfaceRenderer() noexcept {} |
255 | 39 | }; | 38 | }; |
256 | 40 | 39 | ||
257 | === modified file 'include/test/mir_test_doubles/mock_swapper_factory.h' | |||
258 | --- include/test/mir_test_doubles/mock_swapper_factory.h 2013-06-11 14:27:33 +0000 | |||
259 | +++ include/test/mir_test_doubles/mock_swapper_factory.h 2013-06-19 18:36:29 +0000 | |||
260 | @@ -33,8 +33,8 @@ | |||
261 | 33 | public: | 33 | public: |
262 | 34 | ~MockSwapperFactory() noexcept {} | 34 | ~MockSwapperFactory() noexcept {} |
263 | 35 | 35 | ||
266 | 36 | MOCK_CONST_METHOD3(create_swapper_reuse_buffers, | 36 | MOCK_CONST_METHOD4(create_swapper_reuse_buffers, |
267 | 37 | std::shared_ptr<compositor::BufferSwapper>( | 37 | std::shared_ptr<compositor::BufferSwapper>(compositor::BufferProperties const&, |
268 | 38 | std::vector<std::shared_ptr<compositor::Buffer>>&, size_t, compositor::SwapperType)); | 38 | std::vector<std::shared_ptr<compositor::Buffer>>&, size_t, compositor::SwapperType)); |
269 | 39 | MOCK_CONST_METHOD3(create_swapper_new_buffers, | 39 | MOCK_CONST_METHOD3(create_swapper_new_buffers, |
270 | 40 | std::shared_ptr<compositor::BufferSwapper>( | 40 | std::shared_ptr<compositor::BufferSwapper>( |
271 | 41 | 41 | ||
272 | === modified file 'include/test/mir_test_doubles/null_buffer_stream.h' | |||
273 | --- include/test/mir_test_doubles/null_buffer_stream.h 2013-06-13 10:40:42 +0000 | |||
274 | +++ include/test/mir_test_doubles/null_buffer_stream.h 2013-06-19 18:36:29 +0000 | |||
275 | @@ -60,6 +60,10 @@ | |||
276 | 60 | { | 60 | { |
277 | 61 | } | 61 | } |
278 | 62 | 62 | ||
279 | 63 | void allow_framedropping(bool) | ||
280 | 64 | { | ||
281 | 65 | } | ||
282 | 66 | |||
283 | 63 | std::shared_ptr<compositor::Buffer> stub_buffer; | 67 | std::shared_ptr<compositor::Buffer> stub_buffer; |
284 | 64 | }; | 68 | }; |
285 | 65 | 69 | ||
286 | 66 | 70 | ||
287 | === modified file 'src/client/android/android_client_buffer.cpp' | |||
288 | --- src/client/android/android_client_buffer.cpp 2013-06-12 09:36:20 +0000 | |||
289 | +++ src/client/android/android_client_buffer.cpp 2013-06-19 18:36:29 +0000 | |||
290 | @@ -16,6 +16,7 @@ | |||
291 | 16 | * Authored by: Kevin DuBois<kevin.dubois@canonical.com> | 16 | * Authored by: Kevin DuBois<kevin.dubois@canonical.com> |
292 | 17 | */ | 17 | */ |
293 | 18 | 18 | ||
294 | 19 | #include "mir/graphics/android/mir_native_buffer.h" | ||
295 | 19 | #include "mir_toolkit/mir_client_library.h" | 20 | #include "mir_toolkit/mir_client_library.h" |
296 | 20 | #include "android_client_buffer.h" | 21 | #include "android_client_buffer.h" |
297 | 21 | 22 | ||
298 | @@ -23,6 +24,23 @@ | |||
299 | 23 | namespace mcl=mir::client; | 24 | namespace mcl=mir::client; |
300 | 24 | namespace mcla=mir::client::android; | 25 | namespace mcla=mir::client::android; |
301 | 25 | namespace geom=mir::geometry; | 26 | namespace geom=mir::geometry; |
302 | 27 | namespace mga=mir::graphics::android; | ||
303 | 28 | namespace | ||
304 | 29 | { | ||
305 | 30 | struct AndroidBufferHandleDeleter | ||
306 | 31 | { | ||
307 | 32 | AndroidBufferHandleDeleter(std::shared_ptr<mcla::AndroidRegistrar> const& alloc_dev) | ||
308 | 33 | : buffer_registrar(alloc_dev) | ||
309 | 34 | {} | ||
310 | 35 | |||
311 | 36 | void operator()(mga::MirNativeBuffer* t) | ||
312 | 37 | { | ||
313 | 38 | buffer_registrar->unregister_buffer(t->handle); | ||
314 | 39 | } | ||
315 | 40 | private: | ||
316 | 41 | std::shared_ptr<mcla::AndroidRegistrar> const buffer_registrar; | ||
317 | 42 | }; | ||
318 | 43 | } | ||
319 | 26 | 44 | ||
320 | 27 | mcla::AndroidClientBuffer::AndroidClientBuffer(std::shared_ptr<AndroidRegistrar> const& registrar, | 45 | mcla::AndroidClientBuffer::AndroidClientBuffer(std::shared_ptr<AndroidRegistrar> const& registrar, |
321 | 28 | std::shared_ptr<MirBufferPackage> const& package, | 46 | std::shared_ptr<MirBufferPackage> const& package, |
322 | @@ -30,20 +48,24 @@ | |||
323 | 30 | : creation_package(package), | 48 | : creation_package(package), |
324 | 31 | buffer_registrar(registrar), | 49 | buffer_registrar(registrar), |
325 | 32 | rect({{geom::X(0),geom::Y(0)}, size}), | 50 | rect({{geom::X(0),geom::Y(0)}, size}), |
328 | 33 | buffer_pf(pf), | 51 | buffer_pf(pf) |
327 | 34 | native_window_buffer(std::make_shared<ANativeWindowBuffer>()) | ||
329 | 35 | { | 52 | { |
331 | 36 | creation_package = std::move(package); | 53 | AndroidBufferHandleDeleter del1(registrar); |
332 | 54 | auto tmp = new mga::MirNativeBuffer(del1); | ||
333 | 55 | mga::MirNativeBufferDeleter del; | ||
334 | 56 | native_window_buffer = std::shared_ptr<mga::MirNativeBuffer>(tmp, del); | ||
335 | 37 | native_handle = std::shared_ptr<const native_handle_t> (convert_to_native_handle(creation_package)); | 57 | native_handle = std::shared_ptr<const native_handle_t> (convert_to_native_handle(creation_package)); |
336 | 38 | 58 | ||
338 | 39 | buffer_registrar->register_buffer(native_handle.get()); | 59 | try{ |
339 | 60 | buffer_registrar->register_buffer(native_handle.get()); | ||
340 | 61 | } catch (...) | ||
341 | 62 | { | ||
342 | 63 | //TODO: log failure | ||
343 | 64 | } | ||
344 | 40 | 65 | ||
345 | 41 | pack_native_window_buffer(); | 66 | pack_native_window_buffer(); |
346 | 42 | } | 67 | } |
347 | 43 | 68 | ||
348 | 44 | static void incRef(android_native_base_t*) | ||
349 | 45 | { | ||
350 | 46 | } | ||
351 | 47 | void mcla::AndroidClientBuffer::pack_native_window_buffer() | 69 | void mcla::AndroidClientBuffer::pack_native_window_buffer() |
352 | 48 | { | 70 | { |
353 | 49 | native_window_buffer->height = static_cast<int32_t>(rect.size.height.as_uint32_t()); | 71 | native_window_buffer->height = static_cast<int32_t>(rect.size.height.as_uint32_t()); |
354 | @@ -51,15 +73,11 @@ | |||
355 | 51 | native_window_buffer->stride = creation_package->stride / | 73 | native_window_buffer->stride = creation_package->stride / |
356 | 52 | geom::bytes_per_pixel(buffer_pf); | 74 | geom::bytes_per_pixel(buffer_pf); |
357 | 53 | native_window_buffer->usage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_RENDER; | 75 | native_window_buffer->usage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_RENDER; |
358 | 54 | |||
359 | 55 | native_window_buffer->handle = native_handle.get(); | 76 | native_window_buffer->handle = native_handle.get(); |
360 | 56 | native_window_buffer->common.incRef = &incRef; | ||
361 | 57 | native_window_buffer->common.decRef = &incRef; | ||
362 | 58 | } | 77 | } |
363 | 59 | 78 | ||
364 | 60 | mcla::AndroidClientBuffer::~AndroidClientBuffer() noexcept | 79 | mcla::AndroidClientBuffer::~AndroidClientBuffer() noexcept |
365 | 61 | { | 80 | { |
366 | 62 | buffer_registrar->unregister_buffer(native_handle.get()); | ||
367 | 63 | } | 81 | } |
368 | 64 | 82 | ||
369 | 65 | const native_handle_t* mcla::AndroidClientBuffer::convert_to_native_handle(const std::shared_ptr<MirBufferPackage>& package) | 83 | const native_handle_t* mcla::AndroidClientBuffer::convert_to_native_handle(const std::shared_ptr<MirBufferPackage>& package) |
370 | 66 | 84 | ||
371 | === modified file 'src/client/mir_client_library.cpp' | |||
372 | --- src/client/mir_client_library.cpp 2013-06-06 08:36:17 +0000 | |||
373 | +++ src/client/mir_client_library.cpp 2013-06-19 18:36:29 +0000 | |||
374 | @@ -316,3 +316,35 @@ | |||
375 | 316 | 316 | ||
376 | 317 | return state; | 317 | return state; |
377 | 318 | } | 318 | } |
378 | 319 | |||
379 | 320 | MirWaitHandle* mir_surface_set_swapinterval(MirSurface* surf, int interval) | ||
380 | 321 | { | ||
381 | 322 | int hint = mir_surface_hint_synchronous; | ||
382 | 323 | switch (interval) | ||
383 | 324 | { | ||
384 | 325 | case 0: | ||
385 | 326 | hint = mir_surface_hint_drop_frames; | ||
386 | 327 | break; | ||
387 | 328 | case 1: | ||
388 | 329 | hint = mir_surface_hint_synchronous; | ||
389 | 330 | break; | ||
390 | 331 | default: | ||
391 | 332 | return NULL; | ||
392 | 333 | } | ||
393 | 334 | |||
394 | 335 | return surf ? surf->configure(mir_surface_attrib_performance_hint, hint) : NULL; | ||
395 | 336 | } | ||
396 | 337 | |||
397 | 338 | int mir_surface_get_swapinterval(MirSurface* surf) | ||
398 | 339 | { | ||
399 | 340 | if (!surf) | ||
400 | 341 | return -1; | ||
401 | 342 | |||
402 | 343 | int s = surf->attrib(mir_surface_attrib_performance_hint); | ||
403 | 344 | if (s == mir_surface_hint_synchronous) | ||
404 | 345 | return 1; | ||
405 | 346 | if (s == mir_surface_hint_drop_frames) | ||
406 | 347 | return 0; | ||
407 | 348 | |||
408 | 349 | return -1; | ||
409 | 350 | } | ||
410 | 319 | 351 | ||
411 | === modified file 'src/client/mir_surface.cpp' | |||
412 | --- src/client/mir_surface.cpp 2013-06-07 10:38:34 +0000 | |||
413 | +++ src/client/mir_surface.cpp 2013-06-19 18:36:29 +0000 | |||
414 | @@ -58,6 +58,7 @@ | |||
415 | 58 | attrib_cache[i] = -1; | 58 | attrib_cache[i] = -1; |
416 | 59 | attrib_cache[mir_surface_attrib_type] = mir_surface_type_normal; | 59 | attrib_cache[mir_surface_attrib_type] = mir_surface_type_normal; |
417 | 60 | attrib_cache[mir_surface_attrib_state] = mir_surface_state_unknown; | 60 | attrib_cache[mir_surface_attrib_state] = mir_surface_state_unknown; |
418 | 61 | attrib_cache[mir_surface_attrib_performance_hint] = mir_surface_hint_synchronous; | ||
419 | 61 | } | 62 | } |
420 | 62 | 63 | ||
421 | 63 | MirSurface::~MirSurface() | 64 | MirSurface::~MirSurface() |
422 | @@ -269,6 +270,7 @@ | |||
423 | 269 | { | 270 | { |
424 | 270 | case mir_surface_attrib_type: | 271 | case mir_surface_attrib_type: |
425 | 271 | case mir_surface_attrib_state: | 272 | case mir_surface_attrib_state: |
426 | 273 | case mir_surface_attrib_performance_hint: | ||
427 | 272 | if (configure_result.has_ivalue()) | 274 | if (configure_result.has_ivalue()) |
428 | 273 | attrib_cache[a] = configure_result.ivalue(); | 275 | attrib_cache[a] = configure_result.ivalue(); |
429 | 274 | else | 276 | else |
430 | 275 | 277 | ||
431 | === modified file 'src/server/compositor/buffer_stream_surfaces.cpp' | |||
432 | --- src/server/compositor/buffer_stream_surfaces.cpp 2013-06-18 09:44:11 +0000 | |||
433 | +++ src/server/compositor/buffer_stream_surfaces.cpp 2013-06-19 18:36:29 +0000 | |||
434 | @@ -64,3 +64,7 @@ | |||
435 | 64 | buffer_bundle->force_requests_to_complete(); | 64 | buffer_bundle->force_requests_to_complete(); |
436 | 65 | } | 65 | } |
437 | 66 | 66 | ||
438 | 67 | void mc::BufferStreamSurfaces::allow_framedropping(bool allow) | ||
439 | 68 | { | ||
440 | 69 | buffer_bundle->allow_framedropping(allow); | ||
441 | 70 | } | ||
442 | 67 | 71 | ||
443 | === modified file 'src/server/compositor/rendering_operator.cpp' | |||
444 | --- src/server/compositor/rendering_operator.cpp 2013-05-22 09:56:40 +0000 | |||
445 | +++ src/server/compositor/rendering_operator.cpp 2013-06-19 18:36:29 +0000 | |||
446 | @@ -30,7 +30,6 @@ | |||
447 | 30 | 30 | ||
448 | 31 | mc::RenderingOperator::~RenderingOperator() | 31 | mc::RenderingOperator::~RenderingOperator() |
449 | 32 | { | 32 | { |
450 | 33 | renderer.ensure_no_live_buffers_bound(); | ||
451 | 34 | } | 33 | } |
452 | 35 | 34 | ||
453 | 36 | void mc::RenderingOperator::operator()(graphics::Renderable& renderable) | 35 | void mc::RenderingOperator::operator()(graphics::Renderable& renderable) |
454 | 37 | 36 | ||
455 | === modified file 'src/server/compositor/swapper_factory.cpp' | |||
456 | --- src/server/compositor/swapper_factory.cpp 2013-06-11 19:55:10 +0000 | |||
457 | +++ src/server/compositor/swapper_factory.cpp 2013-06-19 18:36:29 +0000 | |||
458 | @@ -36,7 +36,8 @@ | |||
459 | 36 | std::shared_ptr<GraphicBufferAllocator> const& gr_alloc, | 36 | std::shared_ptr<GraphicBufferAllocator> const& gr_alloc, |
460 | 37 | int number_of_buffers) | 37 | int number_of_buffers) |
461 | 38 | : gr_allocator(gr_alloc), | 38 | : gr_allocator(gr_alloc), |
463 | 39 | number_of_buffers(number_of_buffers) | 39 | synchronous_number_of_buffers(number_of_buffers), |
464 | 40 | spin_number_of_buffers(3) //spin algorithm always takes 3 buffers | ||
465 | 40 | { | 41 | { |
466 | 41 | } | 42 | } |
467 | 42 | 43 | ||
468 | @@ -46,16 +47,42 @@ | |||
469 | 46 | { | 47 | { |
470 | 47 | } | 48 | } |
471 | 48 | 49 | ||
472 | 50 | void mc::SwapperFactory::change_swapper_size( | ||
473 | 51 | std::vector<std::shared_ptr<mc::Buffer>>& list, | ||
474 | 52 | size_t const desired_size, size_t current_size, BufferProperties const& buffer_properties) const | ||
475 | 53 | { | ||
476 | 54 | while (current_size < desired_size) | ||
477 | 55 | { | ||
478 | 56 | list.push_back(gr_allocator->alloc_buffer(buffer_properties)); | ||
479 | 57 | current_size++; | ||
480 | 58 | } | ||
481 | 59 | |||
482 | 60 | while (current_size > desired_size) | ||
483 | 61 | { | ||
484 | 62 | if (list.empty()) | ||
485 | 63 | { | ||
486 | 64 | BOOST_THROW_EXCEPTION(std::logic_error("SwapperFactory could not change algorithm")); | ||
487 | 65 | } else | ||
488 | 66 | { | ||
489 | 67 | list.pop_back(); | ||
490 | 68 | current_size--; | ||
491 | 69 | } | ||
492 | 70 | } | ||
493 | 71 | } | ||
494 | 72 | |||
495 | 49 | std::shared_ptr<mc::BufferSwapper> mc::SwapperFactory::create_swapper_reuse_buffers( | 73 | std::shared_ptr<mc::BufferSwapper> mc::SwapperFactory::create_swapper_reuse_buffers( |
497 | 50 | std::vector<std::shared_ptr<Buffer>>& list, size_t buffer_num, SwapperType type) const | 74 | BufferProperties const& buffer_properties, std::vector<std::shared_ptr<Buffer>>& list, |
498 | 75 | size_t buffer_num, SwapperType type) const | ||
499 | 51 | { | 76 | { |
500 | 52 | if (type == mc::SwapperType::synchronous) | 77 | if (type == mc::SwapperType::synchronous) |
501 | 53 | { | 78 | { |
503 | 54 | return std::make_shared<mc::BufferSwapperMulti>(list, buffer_num); | 79 | change_swapper_size(list, synchronous_number_of_buffers, buffer_num, buffer_properties); |
504 | 80 | return std::make_shared<mc::BufferSwapperMulti>(list, synchronous_number_of_buffers); | ||
505 | 55 | } | 81 | } |
506 | 56 | else | 82 | else |
507 | 57 | { | 83 | { |
509 | 58 | return std::make_shared<mc::BufferSwapperSpin>(list, buffer_num); | 84 | change_swapper_size(list, spin_number_of_buffers, buffer_num, buffer_properties); |
510 | 85 | return std::make_shared<mc::BufferSwapperSpin>(list, spin_number_of_buffers); | ||
511 | 59 | } | 86 | } |
512 | 60 | } | 87 | } |
513 | 61 | 88 | ||
514 | @@ -68,20 +95,19 @@ | |||
515 | 68 | 95 | ||
516 | 69 | if (type == mc::SwapperType::synchronous) | 96 | if (type == mc::SwapperType::synchronous) |
517 | 70 | { | 97 | { |
519 | 71 | for(auto i=0; i< number_of_buffers; i++) | 98 | for(auto i=0u; i< synchronous_number_of_buffers; i++) |
520 | 72 | { | 99 | { |
521 | 73 | list.push_back(gr_allocator->alloc_buffer(requested_buffer_properties)); | 100 | list.push_back(gr_allocator->alloc_buffer(requested_buffer_properties)); |
522 | 74 | } | 101 | } |
524 | 75 | new_swapper = std::make_shared<mc::BufferSwapperMulti>(list, number_of_buffers); | 102 | new_swapper = std::make_shared<mc::BufferSwapperMulti>(list, synchronous_number_of_buffers); |
525 | 76 | } | 103 | } |
526 | 77 | else | 104 | else |
527 | 78 | { | 105 | { |
530 | 79 | int const async_buffer_count = 3; //async only can accept 3 buffers, so ignore constructor request | 106 | for(auto i=0u; i < spin_number_of_buffers; i++) |
529 | 80 | for(auto i=0; i < async_buffer_count; i++) | ||
531 | 81 | { | 107 | { |
532 | 82 | list.push_back(gr_allocator->alloc_buffer(requested_buffer_properties)); | 108 | list.push_back(gr_allocator->alloc_buffer(requested_buffer_properties)); |
533 | 83 | } | 109 | } |
535 | 84 | new_swapper = std::make_shared<mc::BufferSwapperSpin>(list, async_buffer_count); | 110 | new_swapper = std::make_shared<mc::BufferSwapperSpin>(list, spin_number_of_buffers); |
536 | 85 | } | 111 | } |
537 | 86 | 112 | ||
538 | 87 | actual_buffer_properties = BufferProperties{ | 113 | actual_buffer_properties = BufferProperties{ |
539 | 88 | 114 | ||
540 | === modified file 'src/server/compositor/switching_bundle.cpp' | |||
541 | --- src/server/compositor/switching_bundle.cpp 2013-06-15 11:09:16 +0000 | |||
542 | +++ src/server/compositor/switching_bundle.cpp 2013-06-19 18:36:29 +0000 | |||
543 | @@ -92,9 +92,9 @@ | |||
544 | 92 | swapper->end_responsibility(list, size); | 92 | swapper->end_responsibility(list, size); |
545 | 93 | 93 | ||
546 | 94 | if (allow_dropping) | 94 | if (allow_dropping) |
548 | 95 | swapper = swapper_factory->create_swapper_reuse_buffers(list, size, mc::SwapperType::framedropping); | 95 | swapper = swapper_factory->create_swapper_reuse_buffers(bundle_properties, list, size, mc::SwapperType::framedropping); |
549 | 96 | else | 96 | else |
551 | 97 | swapper = swapper_factory->create_swapper_reuse_buffers(list, size, mc::SwapperType::synchronous); | 97 | swapper = swapper_factory->create_swapper_reuse_buffers(bundle_properties, list, size, mc::SwapperType::synchronous); |
552 | 98 | 98 | ||
553 | 99 | cv.notify_all(); | 99 | cv.notify_all(); |
554 | 100 | } | 100 | } |
555 | 101 | 101 | ||
556 | === modified file 'src/server/graphics/android/android_alloc_adaptor.cpp' | |||
557 | --- src/server/graphics/android/android_alloc_adaptor.cpp 2013-05-22 15:33:21 +0000 | |||
558 | +++ src/server/graphics/android/android_alloc_adaptor.cpp 2013-06-19 18:36:29 +0000 | |||
559 | @@ -17,6 +17,7 @@ | |||
560 | 17 | * Kevin DuBois <kevin.dubois@canonical.com> | 17 | * Kevin DuBois <kevin.dubois@canonical.com> |
561 | 18 | */ | 18 | */ |
562 | 19 | 19 | ||
563 | 20 | #include "mir/graphics/android/mir_native_buffer.h" | ||
564 | 20 | #include "android_alloc_adaptor.h" | 21 | #include "android_alloc_adaptor.h" |
565 | 21 | #include "android_format_conversion-inl.h" | 22 | #include "android_format_conversion-inl.h" |
566 | 22 | 23 | ||
567 | @@ -35,18 +36,13 @@ | |||
568 | 35 | : alloc_device(alloc_dev) | 36 | : alloc_device(alloc_dev) |
569 | 36 | {} | 37 | {} |
570 | 37 | 38 | ||
572 | 38 | void operator()(ANativeWindowBuffer* t) | 39 | void operator()(mga::MirNativeBuffer* t) |
573 | 39 | { | 40 | { |
574 | 40 | alloc_device->free(alloc_device.get(), t->handle); | 41 | alloc_device->free(alloc_device.get(), t->handle); |
575 | 41 | delete t; | ||
576 | 42 | } | 42 | } |
577 | 43 | private: | 43 | private: |
578 | 44 | std::shared_ptr<alloc_device_t> const alloc_device; | 44 | std::shared_ptr<alloc_device_t> const alloc_device; |
579 | 45 | }; | 45 | }; |
580 | 46 | |||
581 | 47 | static void incRef(android_native_base_t*) | ||
582 | 48 | { | ||
583 | 49 | } | ||
584 | 50 | } | 46 | } |
585 | 51 | 47 | ||
586 | 52 | mga::AndroidAllocAdaptor::AndroidAllocAdaptor(const std::shared_ptr<struct alloc_device_t>& alloc_device) | 48 | mga::AndroidAllocAdaptor::AndroidAllocAdaptor(const std::shared_ptr<struct alloc_device_t>& alloc_device) |
587 | @@ -71,8 +67,11 @@ | |||
588 | 71 | BOOST_THROW_EXCEPTION(std::runtime_error("buffer allocation failed\n")); | 67 | BOOST_THROW_EXCEPTION(std::runtime_error("buffer allocation failed\n")); |
589 | 72 | } | 68 | } |
590 | 73 | 69 | ||
593 | 74 | /* pack ANativeWindow buffer for the handle */ | 70 | AndroidBufferHandleDeleter del1(alloc_dev); |
594 | 75 | auto buffer = new ANativeWindowBuffer; | 71 | auto tmp = new mga::MirNativeBuffer(del1); |
595 | 72 | mga::MirNativeBufferDeleter del; | ||
596 | 73 | std::shared_ptr<mga::MirNativeBuffer> buffer(tmp, del); | ||
597 | 74 | |||
598 | 76 | buffer->width = width; | 75 | buffer->width = width; |
599 | 77 | buffer->height = height; | 76 | buffer->height = height; |
600 | 78 | buffer->stride = stride; | 77 | buffer->stride = stride; |
601 | @@ -80,17 +79,7 @@ | |||
602 | 80 | buffer->format = format; | 79 | buffer->format = format; |
603 | 81 | buffer->usage = usage_flag; | 80 | buffer->usage = usage_flag; |
604 | 82 | 81 | ||
616 | 83 | /* we don't use these for refcounting buffers. however, drivers still expect to be | 82 | return buffer; |
606 | 84 | able to call them */ | ||
607 | 85 | buffer->common.incRef = &incRef; | ||
608 | 86 | buffer->common.decRef = &incRef; | ||
609 | 87 | buffer->common.magic = ANDROID_NATIVE_BUFFER_MAGIC; | ||
610 | 88 | buffer->common.version = sizeof(ANativeWindowBuffer); | ||
611 | 89 | |||
612 | 90 | AndroidBufferHandleDeleter del(alloc_dev); | ||
613 | 91 | auto handle = std::shared_ptr<ANativeWindowBuffer>(buffer, del); | ||
614 | 92 | |||
615 | 93 | return handle; | ||
617 | 94 | } | 83 | } |
618 | 95 | 84 | ||
619 | 96 | int mga::AndroidAllocAdaptor::convert_to_android_usage(BufferUsage usage) | 85 | int mga::AndroidAllocAdaptor::convert_to_android_usage(BufferUsage usage) |
620 | 97 | 86 | ||
621 | === modified file 'src/server/graphics/gl_renderer.cpp' | |||
622 | --- src/server/graphics/gl_renderer.cpp 2013-05-21 15:11:41 +0000 | |||
623 | +++ src/server/graphics/gl_renderer.cpp 2013-06-19 18:36:29 +0000 | |||
624 | @@ -248,14 +248,6 @@ | |||
625 | 248 | glDisableVertexAttribArray(resources.position_attr_loc); | 248 | glDisableVertexAttribArray(resources.position_attr_loc); |
626 | 249 | } | 249 | } |
627 | 250 | 250 | ||
628 | 251 | void mg::GLRenderer::ensure_no_live_buffers_bound() | ||
629 | 252 | { | ||
630 | 253 | /* before the system can delete buffers that back OES_EGL_image textures, it | ||
631 | 254 | must make sure that none of these textures are bound in the GLContext*/ | ||
632 | 255 | static int emptytexture; | ||
633 | 256 | glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1,1,0,GL_RGBA,GL_UNSIGNED_BYTE, &emptytexture); | ||
634 | 257 | } | ||
635 | 258 | |||
636 | 259 | void mg::GLRenderer::clear() | 251 | void mg::GLRenderer::clear() |
637 | 260 | { | 252 | { |
638 | 261 | glClear(GL_COLOR_BUFFER_BIT); | 253 | glClear(GL_COLOR_BUFFER_BIT); |
639 | 262 | 254 | ||
640 | === modified file 'src/server/shell/surface.cpp' | |||
641 | --- src/server/shell/surface.cpp 2013-06-17 19:47:07 +0000 | |||
642 | +++ src/server/shell/surface.cpp 2013-06-19 18:36:29 +0000 | |||
643 | @@ -185,6 +185,14 @@ | |||
644 | 185 | } | 185 | } |
645 | 186 | } | 186 | } |
646 | 187 | 187 | ||
647 | 188 | void msh::Surface::allow_framedropping(bool allow) | ||
648 | 189 | { | ||
649 | 190 | if (auto const& s = surface.lock()) | ||
650 | 191 | { | ||
651 | 192 | s->allow_framedropping(allow); | ||
652 | 193 | } | ||
653 | 194 | } | ||
654 | 195 | |||
655 | 188 | std::shared_ptr<mc::Buffer> msh::Surface::client_buffer() const | 196 | std::shared_ptr<mc::Buffer> msh::Surface::client_buffer() const |
656 | 189 | { | 197 | { |
657 | 190 | if (auto const& s = surface.lock()) | 198 | if (auto const& s = surface.lock()) |
658 | @@ -236,7 +244,7 @@ | |||
659 | 236 | int msh::Surface::configure(MirSurfaceAttrib attrib, int value) | 244 | int msh::Surface::configure(MirSurfaceAttrib attrib, int value) |
660 | 237 | { | 245 | { |
661 | 238 | int result = 0; | 246 | int result = 0; |
663 | 239 | 247 | bool allow_dropping = false; | |
664 | 240 | /* | 248 | /* |
665 | 241 | * TODO: In future, query the shell implementation for the subset of | 249 | * TODO: In future, query the shell implementation for the subset of |
666 | 242 | * attributes/types it implements. | 250 | * attributes/types it implements. |
667 | @@ -255,6 +263,11 @@ | |||
668 | 255 | BOOST_THROW_EXCEPTION(std::logic_error("Invalid surface state.")); | 263 | BOOST_THROW_EXCEPTION(std::logic_error("Invalid surface state.")); |
669 | 256 | result = state(); | 264 | result = state(); |
670 | 257 | break; | 265 | break; |
671 | 266 | case mir_surface_attrib_performance_hint: | ||
672 | 267 | allow_dropping = (value == mir_surface_hint_drop_frames); | ||
673 | 268 | allow_framedropping(allow_dropping); | ||
674 | 269 | result = value; | ||
675 | 270 | break; | ||
676 | 258 | default: | 271 | default: |
677 | 259 | BOOST_THROW_EXCEPTION(std::logic_error("Invalid surface " | 272 | BOOST_THROW_EXCEPTION(std::logic_error("Invalid surface " |
678 | 260 | "attribute.")); | 273 | "attribute.")); |
679 | 261 | 274 | ||
680 | === modified file 'src/server/surfaces/surface.cpp' | |||
681 | --- src/server/surfaces/surface.cpp 2013-06-13 10:40:42 +0000 | |||
682 | +++ src/server/surfaces/surface.cpp 2013-06-19 18:36:29 +0000 | |||
683 | @@ -177,6 +177,11 @@ | |||
684 | 177 | return client_buffer_resource; | 177 | return client_buffer_resource; |
685 | 178 | } | 178 | } |
686 | 179 | 179 | ||
687 | 180 | void ms::Surface::allow_framedropping(bool allow) | ||
688 | 181 | { | ||
689 | 182 | buffer_stream->allow_framedropping(allow); | ||
690 | 183 | } | ||
691 | 184 | |||
692 | 180 | void ms::Surface::flag_for_render() | 185 | void ms::Surface::flag_for_render() |
693 | 181 | { | 186 | { |
694 | 182 | buffer_is_valid = true; | 187 | buffer_is_valid = true; |
695 | 183 | 188 | ||
696 | === modified file 'src/shared/graphics/android/CMakeLists.txt' | |||
697 | --- src/shared/graphics/android/CMakeLists.txt 2013-03-29 22:30:35 +0000 | |||
698 | +++ src/shared/graphics/android/CMakeLists.txt 2013-06-19 18:36:29 +0000 | |||
699 | @@ -2,6 +2,7 @@ | |||
700 | 2 | mirsharedandroid STATIC | 2 | mirsharedandroid STATIC |
701 | 3 | 3 | ||
702 | 4 | mir_native_window.cpp | 4 | mir_native_window.cpp |
703 | 5 | mir_native_buffer.cpp | ||
704 | 5 | syncfence.cpp | 6 | syncfence.cpp |
705 | 6 | ) | 7 | ) |
706 | 7 | 8 | ||
707 | 8 | 9 | ||
708 | === added file 'src/shared/graphics/android/mir_native_buffer.cpp' | |||
709 | --- src/shared/graphics/android/mir_native_buffer.cpp 1970-01-01 00:00:00 +0000 | |||
710 | +++ src/shared/graphics/android/mir_native_buffer.cpp 2013-06-19 18:36:29 +0000 | |||
711 | @@ -0,0 +1,73 @@ | |||
712 | 1 | /* | ||
713 | 2 | * Copyright © 2013 Canonical Ltd. | ||
714 | 3 | * | ||
715 | 4 | * This program is free software: you can redistribute it and/or modify it | ||
716 | 5 | * under the terms of the GNU Lesser General Public License version 3, | ||
717 | 6 | * as published by the Free Software Foundation. | ||
718 | 7 | * | ||
719 | 8 | * This program is distributed in the hope that it will be useful, | ||
720 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
721 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
722 | 11 | * GNU Lesser General Public License for more details. | ||
723 | 12 | * | ||
724 | 13 | * You should have received a copy of the GNU Lesser General Public License | ||
725 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
726 | 15 | * | ||
727 | 16 | * Authored by: Kevin DuBois <kevin.dubois@canonical.com> | ||
728 | 17 | */ | ||
729 | 18 | |||
730 | 19 | #include "mir/graphics/android/mir_native_buffer.h" | ||
731 | 20 | |||
732 | 21 | namespace mga=mir::graphics::android; | ||
733 | 22 | |||
734 | 23 | namespace | ||
735 | 24 | { | ||
736 | 25 | static void incref_hook(struct android_native_base_t* base) | ||
737 | 26 | { | ||
738 | 27 | auto buffer = reinterpret_cast<mga::MirNativeBuffer*>(base); | ||
739 | 28 | buffer->driver_reference(); | ||
740 | 29 | } | ||
741 | 30 | static void decref_hook(struct android_native_base_t* base) | ||
742 | 31 | { | ||
743 | 32 | auto buffer = reinterpret_cast<mga::MirNativeBuffer*>(base); | ||
744 | 33 | buffer->driver_dereference(); | ||
745 | 34 | } | ||
746 | 35 | } | ||
747 | 36 | |||
748 | 37 | mga::MirNativeBuffer::MirNativeBuffer(std::function<void(MirNativeBuffer*)> free) | ||
749 | 38 | : free_fn(free), | ||
750 | 39 | mir_reference(true), | ||
751 | 40 | driver_references(0) | ||
752 | 41 | { | ||
753 | 42 | common.incRef = incref_hook; | ||
754 | 43 | common.decRef = decref_hook; | ||
755 | 44 | } | ||
756 | 45 | |||
757 | 46 | |||
758 | 47 | void mga::MirNativeBuffer::driver_reference() | ||
759 | 48 | { | ||
760 | 49 | driver_references++; | ||
761 | 50 | } | ||
762 | 51 | |||
763 | 52 | void mga::MirNativeBuffer::driver_dereference() | ||
764 | 53 | { | ||
765 | 54 | driver_references--; | ||
766 | 55 | if ((!mir_reference) && (driver_references ==0)) | ||
767 | 56 | { | ||
768 | 57 | delete this; | ||
769 | 58 | } | ||
770 | 59 | } | ||
771 | 60 | |||
772 | 61 | void mga::MirNativeBuffer::mir_dereference() | ||
773 | 62 | { | ||
774 | 63 | mir_reference = false; | ||
775 | 64 | if ((!mir_reference) && (driver_references ==0)) | ||
776 | 65 | { | ||
777 | 66 | delete this; | ||
778 | 67 | } | ||
779 | 68 | } | ||
780 | 69 | |||
781 | 70 | mga::MirNativeBuffer::~MirNativeBuffer() | ||
782 | 71 | { | ||
783 | 72 | free_fn(this); | ||
784 | 73 | } | ||
785 | 0 | 74 | ||
786 | === modified file 'tests/acceptance-tests/test_server_shutdown.cpp' | |||
787 | --- tests/acceptance-tests/test_server_shutdown.cpp 2013-06-06 08:36:17 +0000 | |||
788 | +++ tests/acceptance-tests/test_server_shutdown.cpp 2013-06-19 18:36:29 +0000 | |||
789 | @@ -51,9 +51,6 @@ | |||
790 | 51 | */ | 51 | */ |
791 | 52 | std::this_thread::yield(); | 52 | std::this_thread::yield(); |
792 | 53 | } | 53 | } |
793 | 54 | void ensure_no_live_buffers_bound() | ||
794 | 55 | { | ||
795 | 56 | } | ||
796 | 57 | 54 | ||
797 | 58 | void clear() {} | 55 | void clear() {} |
798 | 59 | }; | 56 | }; |
799 | 60 | 57 | ||
800 | === modified file 'tests/integration-tests/CMakeLists.txt' | |||
801 | --- tests/integration-tests/CMakeLists.txt 2013-05-30 03:50:54 +0000 | |||
802 | +++ tests/integration-tests/CMakeLists.txt 2013-06-19 18:36:29 +0000 | |||
803 | @@ -7,6 +7,7 @@ | |||
804 | 7 | test_display_info.cpp | 7 | test_display_info.cpp |
805 | 8 | test_display_server_main_loop_events.cpp | 8 | test_display_server_main_loop_events.cpp |
806 | 9 | test_surface_first_frame_sync.cpp | 9 | test_surface_first_frame_sync.cpp |
807 | 10 | test_swapinterval.cpp | ||
808 | 10 | ) | 11 | ) |
809 | 11 | 12 | ||
810 | 12 | add_subdirectory(client/) | 13 | add_subdirectory(client/) |
811 | 13 | 14 | ||
812 | === modified file 'tests/integration-tests/test_surface_first_frame_sync.cpp' | |||
813 | --- tests/integration-tests/test_surface_first_frame_sync.cpp 2013-06-12 10:27:50 +0000 | |||
814 | +++ tests/integration-tests/test_surface_first_frame_sync.cpp 2013-06-19 18:36:29 +0000 | |||
815 | @@ -96,8 +96,6 @@ | |||
816 | 96 | while (write(render_operations_fd, "a", 1) != 1) continue; | 96 | while (write(render_operations_fd, "a", 1) != 1) continue; |
817 | 97 | } | 97 | } |
818 | 98 | 98 | ||
819 | 99 | void ensure_no_live_buffers_bound() {} | ||
820 | 100 | |||
821 | 101 | private: | 99 | private: |
822 | 102 | int render_operations_fd; | 100 | int render_operations_fd; |
823 | 103 | }; | 101 | }; |
824 | 104 | 102 | ||
825 | === added file 'tests/integration-tests/test_swapinterval.cpp' | |||
826 | --- tests/integration-tests/test_swapinterval.cpp 1970-01-01 00:00:00 +0000 | |||
827 | +++ tests/integration-tests/test_swapinterval.cpp 2013-06-19 18:36:29 +0000 | |||
828 | @@ -0,0 +1,226 @@ | |||
829 | 1 | /* | ||
830 | 2 | * Copyright © 2013 Canonical Ltd. | ||
831 | 3 | * | ||
832 | 4 | * This program is free software: you can redistribute it and/or modify | ||
833 | 5 | * it under the terms of the GNU General Public License version 3 as | ||
834 | 6 | * published by the Free Software Foundation. | ||
835 | 7 | * | ||
836 | 8 | * This program is distributed in the hope that it will be useful, | ||
837 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
838 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
839 | 11 | * GNU General Public License for more details. | ||
840 | 12 | * | ||
841 | 13 | * You should have received a copy of the GNU General Public License | ||
842 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
843 | 15 | * | ||
844 | 16 | * Authored by: Kevin DuBois <kevin.dubois@canonical.com> | ||
845 | 17 | */ | ||
846 | 18 | |||
847 | 19 | #include "mir/geometry/rectangle.h" | ||
848 | 20 | #include "mir/graphics/display.h" | ||
849 | 21 | #include "mir/graphics/display_buffer.h" | ||
850 | 22 | #include "mir/graphics/renderer.h" | ||
851 | 23 | #include "mir/graphics/renderable.h" | ||
852 | 24 | #include "mir/compositor/compositor.h" | ||
853 | 25 | #include "mir/compositor/compositing_strategy.h" | ||
854 | 26 | #include "mir/compositor/renderables.h" | ||
855 | 27 | #include "mir/surfaces/buffer_stream.h" | ||
856 | 28 | #include "mir/surfaces/buffer_stream_factory.h" | ||
857 | 29 | |||
858 | 30 | #include "mir_test_framework/display_server_test_fixture.h" | ||
859 | 31 | #include "mir_test_doubles/stub_buffer.h" | ||
860 | 32 | |||
861 | 33 | #include "mir_toolkit/mir_client_library.h" | ||
862 | 34 | |||
863 | 35 | #include <gtest/gtest.h> | ||
864 | 36 | |||
865 | 37 | #include <thread> | ||
866 | 38 | #include <unistd.h> | ||
867 | 39 | #include <fcntl.h> | ||
868 | 40 | |||
869 | 41 | namespace geom = mir::geometry; | ||
870 | 42 | namespace mg = mir::graphics; | ||
871 | 43 | namespace mc = mir::compositor; | ||
872 | 44 | namespace mtf = mir_test_framework; | ||
873 | 45 | namespace ms = mir::surfaces; | ||
874 | 46 | namespace mtd = mir::test::doubles; | ||
875 | 47 | |||
876 | 48 | namespace | ||
877 | 49 | { | ||
878 | 50 | char const* const mir_test_socket = mtf::test_socket_file().c_str(); | ||
879 | 51 | |||
880 | 52 | class CountingBufferStream : public ms::BufferStream | ||
881 | 53 | { | ||
882 | 54 | public: | ||
883 | 55 | CountingBufferStream(int render_operations_fd) | ||
884 | 56 | : render_operations_fd(render_operations_fd) | ||
885 | 57 | { | ||
886 | 58 | } | ||
887 | 59 | |||
888 | 60 | std::shared_ptr<mc::Buffer> secure_client_buffer() { return std::make_shared<mtd::StubBuffer>(); } | ||
889 | 61 | std::shared_ptr<ms::GraphicRegion> lock_back_buffer() { return std::make_shared<mtd::StubBuffer>(); } | ||
890 | 62 | geom::PixelFormat get_stream_pixel_format() { return geom::PixelFormat::abgr_8888; } | ||
891 | 63 | geom::Size stream_size() { return geom::Size{}; } | ||
892 | 64 | void force_requests_to_complete() {} | ||
893 | 65 | void allow_framedropping(bool) | ||
894 | 66 | { | ||
895 | 67 | while (write(render_operations_fd, "a", 1) != 1) continue; | ||
896 | 68 | } | ||
897 | 69 | |||
898 | 70 | private: | ||
899 | 71 | int render_operations_fd; | ||
900 | 72 | }; | ||
901 | 73 | |||
902 | 74 | class StubStreamFactory : public ms::BufferStreamFactory | ||
903 | 75 | { | ||
904 | 76 | public: | ||
905 | 77 | StubStreamFactory(int render_operations_fd) | ||
906 | 78 | : render_operations_fd(render_operations_fd) | ||
907 | 79 | { | ||
908 | 80 | } | ||
909 | 81 | |||
910 | 82 | std::shared_ptr<ms::BufferStream> create_buffer_stream(mc::BufferProperties const&) | ||
911 | 83 | { | ||
912 | 84 | return std::make_shared<CountingBufferStream>(render_operations_fd); | ||
913 | 85 | } | ||
914 | 86 | private: | ||
915 | 87 | int render_operations_fd; | ||
916 | 88 | }; | ||
917 | 89 | |||
918 | 90 | } | ||
919 | 91 | |||
920 | 92 | using SwapIntervalSignalTest = BespokeDisplayServerTestFixture; | ||
921 | 93 | TEST_F(SwapIntervalSignalTest, swapinterval_test) | ||
922 | 94 | { | ||
923 | 95 | static std::string const swapinterval_set{"swapinterval_set_952f3f10.tmp"}; | ||
924 | 96 | static std::string const do_client_finish{"do_client_finish_952f3f10.tmp"}; | ||
925 | 97 | |||
926 | 98 | std::remove(swapinterval_set.c_str()); | ||
927 | 99 | std::remove(do_client_finish.c_str()); | ||
928 | 100 | |||
929 | 101 | struct ServerConfig : TestingServerConfiguration | ||
930 | 102 | { | ||
931 | 103 | ServerConfig() | ||
932 | 104 | { | ||
933 | 105 | if (pipe(rendering_ops_pipe) != 0) | ||
934 | 106 | { | ||
935 | 107 | BOOST_THROW_EXCEPTION( | ||
936 | 108 | std::runtime_error("Failed to create pipe")); | ||
937 | 109 | } | ||
938 | 110 | |||
939 | 111 | if (fcntl(rendering_ops_pipe[0], F_SETFL, O_NONBLOCK) != 0) | ||
940 | 112 | { | ||
941 | 113 | BOOST_THROW_EXCEPTION( | ||
942 | 114 | std::runtime_error("Failed to make the read end of the pipe non-blocking")); | ||
943 | 115 | } | ||
944 | 116 | } | ||
945 | 117 | |||
946 | 118 | ~ServerConfig() | ||
947 | 119 | { | ||
948 | 120 | if (rendering_ops_pipe[0] >= 0) | ||
949 | 121 | close(rendering_ops_pipe[0]); | ||
950 | 122 | if (rendering_ops_pipe[1] >= 0) | ||
951 | 123 | close(rendering_ops_pipe[1]); | ||
952 | 124 | } | ||
953 | 125 | |||
954 | 126 | std::shared_ptr<ms::BufferStreamFactory> the_buffer_stream_factory() override | ||
955 | 127 | { | ||
956 | 128 | if (!stub_stream_factory) | ||
957 | 129 | stub_stream_factory = std::make_shared<StubStreamFactory>(rendering_ops_pipe[1]); | ||
958 | 130 | return stub_stream_factory; | ||
959 | 131 | } | ||
960 | 132 | |||
961 | 133 | int num_of_swapinterval_commands() | ||
962 | 134 | { | ||
963 | 135 | char c; | ||
964 | 136 | int ops{0}; | ||
965 | 137 | |||
966 | 138 | while (read(rendering_ops_pipe[0], &c, 1) == 1) | ||
967 | 139 | ops++; | ||
968 | 140 | |||
969 | 141 | return ops; | ||
970 | 142 | } | ||
971 | 143 | |||
972 | 144 | int rendering_ops_pipe[2]; | ||
973 | 145 | std::shared_ptr<StubStreamFactory> stub_stream_factory; | ||
974 | 146 | } server_config; | ||
975 | 147 | |||
976 | 148 | launch_server_process(server_config); | ||
977 | 149 | |||
978 | 150 | struct ClientConfig : TestingClientConfiguration | ||
979 | 151 | { | ||
980 | 152 | ClientConfig(std::string const& swapinterval_set, | ||
981 | 153 | std::string const& do_client_finish) | ||
982 | 154 | : swapinterval_set{swapinterval_set}, | ||
983 | 155 | do_client_finish{do_client_finish} | ||
984 | 156 | { | ||
985 | 157 | } | ||
986 | 158 | |||
987 | 159 | static void surface_callback(MirSurface*, void*) | ||
988 | 160 | { | ||
989 | 161 | } | ||
990 | 162 | |||
991 | 163 | void exec() | ||
992 | 164 | { | ||
993 | 165 | MirSurfaceParameters request_params = | ||
994 | 166 | { | ||
995 | 167 | __PRETTY_FUNCTION__, | ||
996 | 168 | 640, 480, | ||
997 | 169 | mir_pixel_format_abgr_8888, | ||
998 | 170 | mir_buffer_usage_hardware | ||
999 | 171 | }; | ||
1000 | 172 | |||
1001 | 173 | MirConnection* connection = mir_connect_sync(mir_test_socket, "testapp"); | ||
1002 | 174 | MirSurface* surface = mir_connection_create_surface_sync(connection, &request_params); | ||
1003 | 175 | |||
1004 | 176 | //1 is the default swapinterval | ||
1005 | 177 | EXPECT_EQ(1, mir_surface_get_swapinterval(surface)); | ||
1006 | 178 | |||
1007 | 179 | mir_wait_for(mir_surface_set_swapinterval(surface, 0)); | ||
1008 | 180 | EXPECT_EQ(0, mir_surface_get_swapinterval(surface)); | ||
1009 | 181 | |||
1010 | 182 | mir_wait_for(mir_surface_set_swapinterval(surface, 1)); | ||
1011 | 183 | EXPECT_EQ(1, mir_surface_get_swapinterval(surface)); | ||
1012 | 184 | |||
1013 | 185 | //swapinterval 2 not supported | ||
1014 | 186 | EXPECT_EQ(NULL, mir_surface_set_swapinterval(surface, 2)); | ||
1015 | 187 | EXPECT_EQ(1, mir_surface_get_swapinterval(surface)); | ||
1016 | 188 | |||
1017 | 189 | set_flag(swapinterval_set); | ||
1018 | 190 | wait_for(do_client_finish); | ||
1019 | 191 | |||
1020 | 192 | mir_surface_release_sync(surface); | ||
1021 | 193 | mir_connection_release(connection); | ||
1022 | 194 | } | ||
1023 | 195 | |||
1024 | 196 | /* TODO: Extract this flag mechanism and make it reusable */ | ||
1025 | 197 | void set_flag(std::string const& flag_file) | ||
1026 | 198 | { | ||
1027 | 199 | close(open(flag_file.c_str(), O_CREAT, S_IWUSR | S_IRUSR)); | ||
1028 | 200 | } | ||
1029 | 201 | |||
1030 | 202 | void wait_for(std::string const& flag_file) | ||
1031 | 203 | { | ||
1032 | 204 | int fd = -1; | ||
1033 | 205 | while ((fd = open(flag_file.c_str(), O_RDONLY, S_IWUSR | S_IRUSR)) == -1) | ||
1034 | 206 | { | ||
1035 | 207 | std::this_thread::sleep_for(std::chrono::milliseconds(1)); | ||
1036 | 208 | } | ||
1037 | 209 | close(fd); | ||
1038 | 210 | } | ||
1039 | 211 | |||
1040 | 212 | std::string const swapinterval_set; | ||
1041 | 213 | std::string const do_client_finish; | ||
1042 | 214 | } client_config{swapinterval_set, do_client_finish}; | ||
1043 | 215 | |||
1044 | 216 | launch_client_process(client_config); | ||
1045 | 217 | |||
1046 | 218 | run_in_test_process([&] | ||
1047 | 219 | { | ||
1048 | 220 | client_config.wait_for(swapinterval_set); | ||
1049 | 221 | |||
1050 | 222 | EXPECT_EQ(2, server_config.num_of_swapinterval_commands()); | ||
1051 | 223 | |||
1052 | 224 | client_config.set_flag(do_client_finish); | ||
1053 | 225 | }); | ||
1054 | 226 | } | ||
1055 | 0 | 227 | ||
1056 | === modified file 'tests/mir_test_framework/testing_server_options.cpp' | |||
1057 | --- tests/mir_test_framework/testing_server_options.cpp 2013-06-12 10:27:50 +0000 | |||
1058 | +++ tests/mir_test_framework/testing_server_options.cpp 2013-06-19 18:36:29 +0000 | |||
1059 | @@ -141,10 +141,6 @@ | |||
1060 | 141 | r.graphic_region(); | 141 | r.graphic_region(); |
1061 | 142 | } | 142 | } |
1062 | 143 | 143 | ||
1063 | 144 | void ensure_no_live_buffers_bound() | ||
1064 | 145 | { | ||
1065 | 146 | } | ||
1066 | 147 | |||
1067 | 148 | void clear() {} | 144 | void clear() {} |
1068 | 149 | }; | 145 | }; |
1069 | 150 | 146 | ||
1070 | 151 | 147 | ||
1071 | === modified file 'tests/unit-tests/client/android/test_client_android_buffer.cpp' | |||
1072 | --- tests/unit-tests/client/android/test_client_android_buffer.cpp 2013-06-12 09:36:20 +0000 | |||
1073 | +++ tests/unit-tests/client/android/test_client_android_buffer.cpp 2013-06-19 18:36:29 +0000 | |||
1074 | @@ -335,6 +335,6 @@ | |||
1075 | 335 | ASSERT_NE(nullptr, native_handle->common.incRef); | 335 | ASSERT_NE(nullptr, native_handle->common.incRef); |
1076 | 336 | ASSERT_NE(nullptr, native_handle->common.decRef); | 336 | ASSERT_NE(nullptr, native_handle->common.decRef); |
1077 | 337 | 337 | ||
1080 | 338 | native_handle->common.incRef(NULL); | 338 | native_handle->common.incRef(&native_handle->common); |
1081 | 339 | native_handle->common.decRef(NULL); | 339 | native_handle->common.decRef(&native_handle->common); |
1082 | 340 | } | 340 | } |
1083 | 341 | 341 | ||
1084 | === modified file 'tests/unit-tests/compositor/test_buffer_stream.cpp' | |||
1085 | --- tests/unit-tests/compositor/test_buffer_stream.cpp 2013-06-17 15:55:04 +0000 | |||
1086 | +++ tests/unit-tests/compositor/test_buffer_stream.cpp 2013-06-19 18:36:29 +0000 | |||
1087 | @@ -122,3 +122,12 @@ | |||
1088 | 122 | 122 | ||
1089 | 123 | buffer_stream.secure_client_buffer(); | 123 | buffer_stream.secure_client_buffer(); |
1090 | 124 | } | 124 | } |
1091 | 125 | |||
1092 | 126 | TEST_F(BufferStreamTest, allow_framedropping_command) | ||
1093 | 127 | { | ||
1094 | 128 | EXPECT_CALL(*mock_bundle, allow_framedropping(true)) | ||
1095 | 129 | .Times(1); | ||
1096 | 130 | |||
1097 | 131 | mc::BufferStreamSurfaces buffer_stream(mock_bundle); | ||
1098 | 132 | buffer_stream.allow_framedropping(true); | ||
1099 | 133 | } | ||
1100 | 125 | 134 | ||
1101 | === modified file 'tests/unit-tests/compositor/test_rendering_operator.cpp' | |||
1102 | --- tests/unit-tests/compositor/test_rendering_operator.cpp 2013-05-22 09:56:40 +0000 | |||
1103 | +++ tests/unit-tests/compositor/test_rendering_operator.cpp 2013-06-19 18:36:29 +0000 | |||
1104 | @@ -45,9 +45,6 @@ | |||
1105 | 45 | 45 | ||
1106 | 46 | void clear() {} | 46 | void clear() {} |
1107 | 47 | 47 | ||
1108 | 48 | void ensure_no_live_buffers_bound() | ||
1109 | 49 | { | ||
1110 | 50 | } | ||
1111 | 51 | void render(std::function<void(std::shared_ptr<void> const&)> save_resource, mg::Renderable&) | 48 | void render(std::function<void(std::shared_ptr<void> const&)> save_resource, mg::Renderable&) |
1112 | 52 | { | 49 | { |
1113 | 53 | std::shared_ptr<void> tmp; | 50 | std::shared_ptr<void> tmp; |
1114 | @@ -81,7 +78,6 @@ | |||
1115 | 81 | { | 78 | { |
1116 | 82 | public: | 79 | public: |
1117 | 83 | MOCK_METHOD2(render, void(std::function<void(std::shared_ptr<void> const&)>, mg::Renderable&)); | 80 | MOCK_METHOD2(render, void(std::function<void(std::shared_ptr<void> const&)>, mg::Renderable&)); |
1118 | 84 | MOCK_METHOD0(ensure_no_live_buffers_bound, void()); | ||
1119 | 85 | MOCK_METHOD0(clear, void ()); | 81 | MOCK_METHOD0(clear, void ()); |
1120 | 86 | 82 | ||
1121 | 87 | ~MockRenderer() noexcept {} | 83 | ~MockRenderer() noexcept {} |
1122 | @@ -122,11 +118,3 @@ | |||
1123 | 122 | EXPECT_EQ(use_count_before1, stub_renderer.resource1.use_count()); | 118 | EXPECT_EQ(use_count_before1, stub_renderer.resource1.use_count()); |
1124 | 123 | EXPECT_EQ(use_count_before2, stub_renderer.resource2.use_count()); | 119 | EXPECT_EQ(use_count_before2, stub_renderer.resource2.use_count()); |
1125 | 124 | } | 120 | } |
1126 | 125 | |||
1127 | 126 | TEST(RenderingOperator, render_operator_ensures_no_live_texture_bound) | ||
1128 | 127 | { | ||
1129 | 128 | MockRenderer mock_renderer; | ||
1130 | 129 | EXPECT_CALL(mock_renderer, ensure_no_live_buffers_bound()) | ||
1131 | 130 | .Times(1); | ||
1132 | 131 | mc::RenderingOperator rendering_operator(mock_renderer, [](std::shared_ptr<void> const&) {}); | ||
1133 | 132 | } | ||
1134 | 133 | 121 | ||
1135 | === modified file 'tests/unit-tests/compositor/test_swapper_factory.cpp' | |||
1136 | --- tests/unit-tests/compositor/test_swapper_factory.cpp 2013-06-11 19:55:10 +0000 | |||
1137 | +++ tests/unit-tests/compositor/test_swapper_factory.cpp 2013-06-19 18:36:29 +0000 | |||
1138 | @@ -147,6 +147,7 @@ | |||
1139 | 147 | { | 147 | { |
1140 | 148 | using namespace testing; | 148 | using namespace testing; |
1141 | 149 | 149 | ||
1142 | 150 | mc::BufferProperties properties; | ||
1143 | 150 | std::vector<std::shared_ptr<mc::Buffer>> list {}; | 151 | std::vector<std::shared_ptr<mc::Buffer>> list {}; |
1144 | 151 | size_t size = 3; | 152 | size_t size = 3; |
1145 | 152 | 153 | ||
1146 | @@ -154,19 +155,66 @@ | |||
1147 | 154 | .Times(0); | 155 | .Times(0); |
1148 | 155 | 156 | ||
1149 | 156 | mc::SwapperFactory strategy(mock_buffer_allocator); | 157 | mc::SwapperFactory strategy(mock_buffer_allocator); |
1151 | 157 | auto swapper = strategy.create_swapper_reuse_buffers(list, size, mc::SwapperType::framedropping); | 158 | auto swapper = strategy.create_swapper_reuse_buffers(properties, list, size, mc::SwapperType::framedropping); |
1152 | 158 | } | 159 | } |
1153 | 159 | 160 | ||
1154 | 160 | TEST_F(SwapperFactoryTest, create_sync_reuse) | 161 | TEST_F(SwapperFactoryTest, create_sync_reuse) |
1155 | 161 | { | 162 | { |
1156 | 162 | using namespace testing; | 163 | using namespace testing; |
1157 | 163 | 164 | ||
1158 | 165 | mc::BufferProperties properties; | ||
1159 | 164 | std::vector<std::shared_ptr<mc::Buffer>> list; | 166 | std::vector<std::shared_ptr<mc::Buffer>> list; |
1160 | 165 | size_t size = 3; | 167 | size_t size = 3; |
1161 | 166 | 168 | ||
1162 | 167 | EXPECT_CALL(*mock_buffer_allocator, alloc_buffer(properties)) | 169 | EXPECT_CALL(*mock_buffer_allocator, alloc_buffer(properties)) |
1163 | 168 | .Times(0); | 170 | .Times(0); |
1164 | 169 | 171 | ||
1165 | 172 | mc::SwapperFactory strategy(mock_buffer_allocator, 3); | ||
1166 | 173 | auto swapper = strategy.create_swapper_reuse_buffers(properties, list, size, mc::SwapperType::synchronous); | ||
1167 | 174 | } | ||
1168 | 175 | |||
1169 | 176 | TEST_F(SwapperFactoryTest, reuse_drop_unneeded_buffer) | ||
1170 | 177 | { | ||
1171 | 178 | using namespace testing; | ||
1172 | 179 | |||
1173 | 180 | mc::SwapperFactory strategy(mock_buffer_allocator, 2); | ||
1174 | 181 | |||
1175 | 182 | auto buffer = std::make_shared<mtd::StubBuffer>(); | ||
1176 | 183 | { | ||
1177 | 184 | size_t size = 3; | ||
1178 | 185 | std::vector<std::shared_ptr<mc::Buffer>> list{buffer}; | ||
1179 | 186 | |||
1180 | 187 | auto swapper = strategy.create_swapper_reuse_buffers( | ||
1181 | 188 | properties, list, size, mc::SwapperType::synchronous); | ||
1182 | 189 | } | ||
1183 | 190 | EXPECT_EQ(1, buffer.use_count()); | ||
1184 | 191 | } | ||
1185 | 192 | |||
1186 | 193 | TEST_F(SwapperFactoryTest, reuse_drop_unneeded_buffer_error) | ||
1187 | 194 | { | ||
1188 | 195 | using namespace testing; | ||
1189 | 196 | |||
1190 | 197 | mc::SwapperFactory strategy(mock_buffer_allocator, 2); | ||
1191 | 198 | |||
1192 | 199 | size_t size = 3; | ||
1193 | 200 | std::vector<std::shared_ptr<mc::Buffer>> list{}; | ||
1194 | 201 | |||
1195 | 202 | EXPECT_THROW({ | ||
1196 | 203 | strategy.create_swapper_reuse_buffers( | ||
1197 | 204 | properties, list, size, mc::SwapperType::synchronous); | ||
1198 | 205 | }, std::logic_error); | ||
1199 | 206 | } | ||
1200 | 207 | |||
1201 | 208 | TEST_F(SwapperFactoryTest, reuse_alloc_additional_buffer_for_framedropping) | ||
1202 | 209 | { | ||
1203 | 210 | using namespace testing; | ||
1204 | 211 | |||
1205 | 212 | EXPECT_CALL(*mock_buffer_allocator, alloc_buffer(_)) | ||
1206 | 213 | .Times(1); | ||
1207 | 170 | mc::SwapperFactory strategy(mock_buffer_allocator); | 214 | mc::SwapperFactory strategy(mock_buffer_allocator); |
1209 | 171 | auto swapper = strategy.create_swapper_reuse_buffers(list, size, mc::SwapperType::synchronous); | 215 | |
1210 | 216 | size_t size = 2; | ||
1211 | 217 | std::vector<std::shared_ptr<mc::Buffer>> list{}; | ||
1212 | 218 | auto swapper = strategy.create_swapper_reuse_buffers( | ||
1213 | 219 | properties, list, size, mc::SwapperType::framedropping); | ||
1214 | 172 | } | 220 | } |
1215 | 173 | 221 | ||
1216 | === modified file 'tests/unit-tests/compositor/test_switching_bundle.cpp' | |||
1217 | --- tests/unit-tests/compositor/test_switching_bundle.cpp 2013-06-13 08:59:25 +0000 | |||
1218 | +++ tests/unit-tests/compositor/test_switching_bundle.cpp 2013-06-19 18:36:29 +0000 | |||
1219 | @@ -90,7 +90,7 @@ | |||
1220 | 90 | .WillOnce(Return(stub_buffer)); | 90 | .WillOnce(Return(stub_buffer)); |
1221 | 91 | EXPECT_CALL(*mock_secondary_swapper, client_release(stub_buffer)) | 91 | EXPECT_CALL(*mock_secondary_swapper, client_release(stub_buffer)) |
1222 | 92 | .Times(1); | 92 | .Times(1); |
1224 | 93 | EXPECT_CALL(*mock_swapper_factory, create_swapper_reuse_buffers(_,_,_)) | 93 | EXPECT_CALL(*mock_swapper_factory, create_swapper_reuse_buffers(_,_,_,_)) |
1225 | 94 | .Times(1) | 94 | .Times(1) |
1226 | 95 | .WillOnce(Return(mock_secondary_swapper)); | 95 | .WillOnce(Return(mock_secondary_swapper)); |
1227 | 96 | 96 | ||
1228 | @@ -126,7 +126,7 @@ | |||
1229 | 126 | .WillOnce(Return(stub_buffer)); | 126 | .WillOnce(Return(stub_buffer)); |
1230 | 127 | EXPECT_CALL(*mock_secondary_swapper, compositor_release(stub_buffer)) | 127 | EXPECT_CALL(*mock_secondary_swapper, compositor_release(stub_buffer)) |
1231 | 128 | .Times(1); | 128 | .Times(1); |
1233 | 129 | EXPECT_CALL(*mock_swapper_factory, create_swapper_reuse_buffers(_,_,_)) | 129 | EXPECT_CALL(*mock_swapper_factory, create_swapper_reuse_buffers(_,_,_,_)) |
1234 | 130 | .Times(1) | 130 | .Times(1) |
1235 | 131 | .WillOnce(Return(mock_secondary_swapper)); | 131 | .WillOnce(Return(mock_secondary_swapper)); |
1236 | 132 | 132 | ||
1237 | @@ -147,7 +147,7 @@ | |||
1238 | 147 | .Times(1); | 147 | .Times(1); |
1239 | 148 | EXPECT_CALL(*mock_default_swapper, end_responsibility(_,_)) | 148 | EXPECT_CALL(*mock_default_swapper, end_responsibility(_,_)) |
1240 | 149 | .Times(1); | 149 | .Times(1); |
1242 | 150 | EXPECT_CALL(*mock_swapper_factory, create_swapper_reuse_buffers(_,_,mc::SwapperType::framedropping)) | 150 | EXPECT_CALL(*mock_swapper_factory, create_swapper_reuse_buffers(_,_,_,mc::SwapperType::framedropping)) |
1243 | 151 | .Times(1) | 151 | .Times(1) |
1244 | 152 | .WillOnce(Return(mock_secondary_swapper)); | 152 | .WillOnce(Return(mock_secondary_swapper)); |
1245 | 153 | 153 | ||
1246 | 154 | 154 | ||
1247 | === modified file 'tests/unit-tests/graphics/android/CMakeLists.txt' | |||
1248 | --- tests/unit-tests/graphics/android/CMakeLists.txt 2013-05-21 20:58:15 +0000 | |||
1249 | +++ tests/unit-tests/graphics/android/CMakeLists.txt 2013-06-19 18:36:29 +0000 | |||
1250 | @@ -22,6 +22,7 @@ | |||
1251 | 22 | ${CMAKE_CURRENT_SOURCE_DIR}/test_pixel_format.cpp | 22 | ${CMAKE_CURRENT_SOURCE_DIR}/test_pixel_format.cpp |
1252 | 23 | ${CMAKE_CURRENT_SOURCE_DIR}/test_android_platform.cpp | 23 | ${CMAKE_CURRENT_SOURCE_DIR}/test_android_platform.cpp |
1253 | 24 | ${CMAKE_CURRENT_SOURCE_DIR}/test_interpreter_buffer_cache.cpp | 24 | ${CMAKE_CURRENT_SOURCE_DIR}/test_interpreter_buffer_cache.cpp |
1254 | 25 | ${CMAKE_CURRENT_SOURCE_DIR}/test_external_refcount.cpp | ||
1255 | 25 | ) | 26 | ) |
1256 | 26 | 27 | ||
1257 | 27 | set(UNIT_TEST_SOURCES ${UNIT_TEST_SOURCES} PARENT_SCOPE) | 28 | set(UNIT_TEST_SOURCES ${UNIT_TEST_SOURCES} PARENT_SCOPE) |
1258 | 28 | 29 | ||
1259 | === modified file 'tests/unit-tests/graphics/android/test_android_alloc_adaptor.cpp' | |||
1260 | --- tests/unit-tests/graphics/android/test_android_alloc_adaptor.cpp 2013-05-21 21:43:25 +0000 | |||
1261 | +++ tests/unit-tests/graphics/android/test_android_alloc_adaptor.cpp 2013-06-19 18:36:29 +0000 | |||
1262 | @@ -217,20 +217,13 @@ | |||
1263 | 217 | EXPECT_EQ(fb_usage_flags, handle->usage); | 217 | EXPECT_EQ(fb_usage_flags, handle->usage); |
1264 | 218 | } | 218 | } |
1265 | 219 | 219 | ||
1267 | 220 | TEST_F(AdaptorICSTest, handle_has_reffable_incref) | 220 | TEST_F(AdaptorICSTest, handle_has_strong_reference_for_c_drivers) |
1268 | 221 | { | 221 | { |
1269 | 222 | struct android_native_base_t *native_base = nullptr; | ||
1270 | 223 | auto handle = alloc_adaptor->alloc_buffer(size, pf, usage); | 222 | auto handle = alloc_adaptor->alloc_buffer(size, pf, usage); |
1271 | 224 | ASSERT_NE(nullptr, handle->common.incRef); | 223 | ASSERT_NE(nullptr, handle->common.incRef); |
1272 | 225 | handle->common.incRef(native_base); | ||
1273 | 226 | } | ||
1274 | 227 | |||
1275 | 228 | TEST_F(AdaptorICSTest, handle_has_reffable_decref) | ||
1276 | 229 | { | ||
1277 | 230 | struct android_native_base_t *native_base = nullptr; | ||
1278 | 231 | auto handle = alloc_adaptor->alloc_buffer(size, pf, usage); | ||
1279 | 232 | ASSERT_NE(nullptr, handle->common.decRef); | 224 | ASSERT_NE(nullptr, handle->common.decRef); |
1281 | 233 | handle->common.decRef(native_base); | 225 | handle->common.incRef(&handle->common); |
1282 | 226 | handle->common.decRef(&handle->common); | ||
1283 | 234 | } | 227 | } |
1284 | 235 | 228 | ||
1285 | 236 | TEST_F(AdaptorICSTest, handle_has_right_magic) | 229 | TEST_F(AdaptorICSTest, handle_has_right_magic) |
1286 | 237 | 230 | ||
1287 | === added file 'tests/unit-tests/graphics/android/test_external_refcount.cpp' | |||
1288 | --- tests/unit-tests/graphics/android/test_external_refcount.cpp 1970-01-01 00:00:00 +0000 | |||
1289 | +++ tests/unit-tests/graphics/android/test_external_refcount.cpp 2013-06-19 18:36:29 +0000 | |||
1290 | @@ -0,0 +1,70 @@ | |||
1291 | 1 | /* | ||
1292 | 2 | * Copyright © 2013 Canonical Ltd. | ||
1293 | 3 | * | ||
1294 | 4 | * This program is free software: you can redistribute it and/or modify | ||
1295 | 5 | * it under the terms of the GNU General Public License version 3 as | ||
1296 | 6 | * published by the Free Software Foundation. | ||
1297 | 7 | * | ||
1298 | 8 | * This program is distributed in the hope that it will be useful, | ||
1299 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1300 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1301 | 11 | * GNU General Public License for more details. | ||
1302 | 12 | * | ||
1303 | 13 | * You should have received a copy of the GNU General Public License | ||
1304 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
1305 | 15 | * | ||
1306 | 16 | * Authored by: Kevin DuBois <kevin.dubois@canonical.com> | ||
1307 | 17 | */ | ||
1308 | 18 | |||
1309 | 19 | #include "mir/graphics/android/mir_native_buffer.h" | ||
1310 | 20 | #include <memory> | ||
1311 | 21 | #include <gtest/gtest.h> | ||
1312 | 22 | |||
1313 | 23 | namespace mga=mir::graphics::android; | ||
1314 | 24 | |||
1315 | 25 | TEST(AndroidRefcount, driver_hooks) | ||
1316 | 26 | { | ||
1317 | 27 | int call_count = 0; | ||
1318 | 28 | mga::MirNativeBuffer* driver_reference = nullptr; | ||
1319 | 29 | { | ||
1320 | 30 | auto tmp = new mga::MirNativeBuffer( | ||
1321 | 31 | [&](mga::MirNativeBuffer*) | ||
1322 | 32 | { | ||
1323 | 33 | call_count++; | ||
1324 | 34 | }); | ||
1325 | 35 | mga::MirNativeBufferDeleter del; | ||
1326 | 36 | std::shared_ptr<mga::MirNativeBuffer> buffer(tmp, del); | ||
1327 | 37 | driver_reference = buffer.get(); | ||
1328 | 38 | driver_reference->common.incRef(&driver_reference->common); | ||
1329 | 39 | //Mir loses its reference | ||
1330 | 40 | } | ||
1331 | 41 | |||
1332 | 42 | EXPECT_EQ(0, call_count); | ||
1333 | 43 | driver_reference->common.decRef(&driver_reference->common); | ||
1334 | 44 | EXPECT_EQ(1, call_count); | ||
1335 | 45 | } | ||
1336 | 46 | |||
1337 | 47 | TEST(AndroidRefcount, driver_hooks_mir_ref) | ||
1338 | 48 | { | ||
1339 | 49 | int call_count = 0; | ||
1340 | 50 | { | ||
1341 | 51 | std::shared_ptr<mga::MirNativeBuffer> mir_reference; | ||
1342 | 52 | mga::MirNativeBuffer* driver_reference = nullptr; | ||
1343 | 53 | { | ||
1344 | 54 | auto tmp = new mga::MirNativeBuffer( | ||
1345 | 55 | [&](mga::MirNativeBuffer*) | ||
1346 | 56 | { | ||
1347 | 57 | call_count++; | ||
1348 | 58 | }); | ||
1349 | 59 | mga::MirNativeBufferDeleter del; | ||
1350 | 60 | mir_reference = std::shared_ptr<mga::MirNativeBuffer>(tmp, del); | ||
1351 | 61 | driver_reference = mir_reference.get(); | ||
1352 | 62 | driver_reference->common.incRef(&driver_reference->common); | ||
1353 | 63 | } | ||
1354 | 64 | |||
1355 | 65 | //driver loses its reference | ||
1356 | 66 | driver_reference->common.decRef(&driver_reference->common); | ||
1357 | 67 | EXPECT_EQ(0, call_count); | ||
1358 | 68 | } | ||
1359 | 69 | EXPECT_EQ(1, call_count); | ||
1360 | 70 | } | ||
1361 | 0 | 71 | ||
1362 | === modified file 'tests/unit-tests/graphics/test_gl_renderer.cpp' | |||
1363 | --- tests/unit-tests/graphics/test_gl_renderer.cpp 2013-06-12 15:36:31 +0000 | |||
1364 | +++ tests/unit-tests/graphics/test_gl_renderer.cpp 2013-06-19 18:36:29 +0000 | |||
1365 | @@ -349,13 +349,3 @@ | |||
1366 | 349 | auto result = std::find(saved_resources.begin(), saved_resources.end(), gr_ptr); | 349 | auto result = std::find(saved_resources.begin(), saved_resources.end(), gr_ptr); |
1367 | 350 | EXPECT_NE(saved_resources.end(), result); | 350 | EXPECT_NE(saved_resources.end(), result); |
1368 | 351 | } | 351 | } |
1369 | 352 | |||
1370 | 353 | TEST_F(GLRenderer, TestRenderEnsureNoBind) | ||
1371 | 354 | { | ||
1372 | 355 | using namespace std::placeholders; | ||
1373 | 356 | |||
1374 | 357 | mtd::MockRenderable rd; | ||
1375 | 358 | EXPECT_CALL(mock_gl, glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1,1,0,GL_RGBA,GL_UNSIGNED_BYTE,_)); | ||
1376 | 359 | |||
1377 | 360 | renderer->ensure_no_live_buffers_bound(); | ||
1378 | 361 | } | ||
1379 | 362 | 352 | ||
1380 | === modified file 'tests/unit-tests/surfaces/test_surface.cpp' | |||
1381 | --- tests/unit-tests/surfaces/test_surface.cpp 2013-06-13 10:40:42 +0000 | |||
1382 | +++ tests/unit-tests/surfaces/test_surface.cpp 2013-06-19 18:36:29 +0000 | |||
1383 | @@ -420,6 +420,18 @@ | |||
1384 | 420 | surf.force_requests_to_complete(); | 420 | surf.force_requests_to_complete(); |
1385 | 421 | } | 421 | } |
1386 | 422 | 422 | ||
1387 | 423 | TEST_F(SurfaceCreation, test_surface_allow_framedropping) | ||
1388 | 424 | { | ||
1389 | 425 | using namespace testing; | ||
1390 | 426 | |||
1391 | 427 | EXPECT_CALL(*mock_buffer_stream, allow_framedropping(true)) | ||
1392 | 428 | .Times(1); | ||
1393 | 429 | |||
1394 | 430 | ms::Surface surf{surface_name, geom::Point(), mock_buffer_stream, | ||
1395 | 431 | std::shared_ptr<mi::InputChannel>(), mock_change_cb}; | ||
1396 | 432 | surf.allow_framedropping(true); | ||
1397 | 433 | } | ||
1398 | 434 | |||
1399 | 423 | TEST_F(SurfaceCreation, input_fds) | 435 | TEST_F(SurfaceCreation, input_fds) |
1400 | 424 | { | 436 | { |
1401 | 425 | using namespace testing; | 437 | using namespace testing; |
FAILED: Continuous integration, rev:758 jenkins. qa.ubuntu. com/job/ mir-ci/ 751/ jenkins. qa.ubuntu. com/job/ mir-android- raring- i386-build/ 937/console jenkins. qa.ubuntu. com/job/ mir-clang- raring- amd64-build/ 819/console jenkins. qa.ubuntu. com/job/ mir-raring- amd64-ci/ 236/console jenkins. qa.ubuntu. com/job/ mir-vm- ci-build/ ./distribution= quantal, flavor= amd64/435
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
SUCCESS: http://
Click here to trigger a rebuild: s-jenkins: 8080/job/ mir-ci/ 751/rebuild
http://