Merge lp:~kdub/mir/fix-1364637 into lp:mir
- fix-1364637
- Merge into development-branch
Status: | Merged |
---|---|
Approved by: | Daniel van Vugt |
Approved revision: | no longer in the source branch. |
Merged at revision: | 1902 |
Proposed branch: | lp:~kdub/mir/fix-1364637 |
Merge into: | lp:mir |
Diff against target: |
633 lines (+109/-80) 17 files modified
src/platform/graphics/android/android_platform.cpp (+2/-2) src/platform/graphics/android/display_resource_factory.h (+3/-2) src/platform/graphics/android/hwc_common_device.cpp (+10/-6) src/platform/graphics/android/hwc_common_device.h (+3/-3) src/platform/graphics/android/hwc_wrapper.h (+2/-1) src/platform/graphics/android/output_builder.cpp (+6/-3) src/platform/graphics/android/output_builder.h (+5/-1) src/platform/graphics/android/real_hwc_wrapper.cpp (+4/-2) src/platform/graphics/android/real_hwc_wrapper.h (+4/-1) src/platform/graphics/android/resource_factory.cpp (+2/-9) src/platform/graphics/android/resource_factory.h (+2/-7) tests/include/mir_test_doubles/mock_hwc_device_wrapper.h (+1/-1) tests/integration-tests/graphics/android/test_display_integration.cpp (+3/-3) tests/unit-tests/graphics/android/test_hwc_common_device.cpp (+34/-16) tests/unit-tests/graphics/android/test_hwc_wrapper.cpp (+13/-5) tests/unit-tests/graphics/android/test_output_builder.cpp (+11/-8) tests/unit-tests/graphics/android/test_resource_factory.cpp (+4/-10) |
To merge this branch: | bzr merge lp:~kdub/mir/fix-1364637 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
PS Jenkins bot (community) | continuous-integration | Approve | |
Alexandros Frantzis (community) | Approve | ||
Alberto Aguirre (community) | Approve | ||
Review via email: mp+233512@code.launchpad.net |
Commit message
android: preserve the registered callback hooks until the hwc device has been closed.
lp: #1364637
Description of the change
android: preserve the registered callback hooks until the hwc device has been closed.
This seems to be an "incidental" part of the hwc api, as one can register the callback hooks, but cannot unregister or reregister hooks.
The problem manifested itself only on the krillin device.
I considered a few ways to shuffle this resource, including unique_ptrs and beefing up the RealHwcWrapper, this approach seemed the best for future plans (such as multimonitor) and keeping the code churn lower.
lp: #1364637
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:1894
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://
Kevin DuBois (kdub) wrote : | # |
> 80 + callbacks->self = nullptr;
>
> Doesn't 'self' need be atomic?
yes, it should be, fixed.
> 45 + hwc_wrapper = std::make_
> logger);
>
> Perhaps have a mga::ResourceFa
> probably won't need ResourceFactory
Yes, this is the direction I want to go, to hide the hwc type behind the wrapper. There are a few interfaces that still need to be plumbed out on HwcWrapper before getting rid of the create_
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:1895
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://
Alberto Aguirre (albaguirre) wrote : | # |
Looks sensible.
Alexandros Frantzis (afrantzis) wrote : | # |
> > Perhaps have a mga::ResourceFa
> > probably won't need ResourceFactory
>
> I considered that a bit beyond the scope of this bug fix, so will leave it for future improvement.
OK, looking forward to that then.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Autolanding.
More details in the following jenkins job:
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
Kevin DuBois (kdub) wrote : | # |
not sure where the failure was, (seems an unrelated acceptance test stopped running). Will retrigger with regular CI, then top approve again
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:1895
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
FAILURE: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Daniel van Vugt (vanvugt) wrote : | # |
The failure looks like it's caused by CI. Possibly due to /usr/bin/
PS Jenkins bot (ps-jenkins) : | # |
Preview Diff
1 | === modified file 'src/platform/graphics/android/android_platform.cpp' |
2 | --- src/platform/graphics/android/android_platform.cpp 2014-09-05 03:37:19 +0000 |
3 | +++ src/platform/graphics/android/android_platform.cpp 2014-09-05 18:49:42 +0000 |
4 | @@ -162,10 +162,10 @@ |
5 | auto overlay_option = should_use_overlay_optimization(*options); |
6 | logger->log_overlay_optimization(overlay_option); |
7 | auto buffer_initializer = std::make_shared<mg::NullBufferInitializer>(); |
8 | - auto display_resource_factory = std::make_shared<mga::ResourceFactory>(logger); |
9 | + auto display_resource_factory = std::make_shared<mga::ResourceFactory>(); |
10 | auto fb_allocator = std::make_shared<mga::AndroidGraphicBufferAllocator>(buffer_initializer); |
11 | auto display_builder = std::make_shared<mga::OutputBuilder>( |
12 | - fb_allocator, display_resource_factory, display_report, overlay_option); |
13 | + fb_allocator, display_resource_factory, display_report, overlay_option, logger); |
14 | return std::make_shared<mga::AndroidPlatform>(display_builder, display_report); |
15 | } |
16 | |
17 | |
18 | === modified file 'src/platform/graphics/android/display_resource_factory.h' |
19 | --- src/platform/graphics/android/display_resource_factory.h 2014-03-06 06:05:17 +0000 |
20 | +++ src/platform/graphics/android/display_resource_factory.h 2014-09-05 18:49:42 +0000 |
21 | @@ -34,6 +34,7 @@ |
22 | { |
23 | class DisplayDevice; |
24 | class FramebufferBundle; |
25 | +class HwcWrapper; |
26 | |
27 | class DisplayResourceFactory |
28 | { |
29 | @@ -49,9 +50,9 @@ |
30 | virtual std::shared_ptr<DisplayDevice> create_fb_device( |
31 | std::shared_ptr<framebuffer_device_t> const& fb_native_device) const = 0; |
32 | virtual std::shared_ptr<DisplayDevice> create_hwc_device( |
33 | - std::shared_ptr<hwc_composer_device_1> const& hwc_native_device) const = 0; |
34 | + std::shared_ptr<HwcWrapper> const& hwc_native_device) const = 0; |
35 | virtual std::shared_ptr<DisplayDevice> create_hwc_fb_device( |
36 | - std::shared_ptr<hwc_composer_device_1> const& hwc_native_device, |
37 | + std::shared_ptr<HwcWrapper> const& hwc_native_device, |
38 | std::shared_ptr<framebuffer_device_t> const& fb_native_device) const = 0; |
39 | |
40 | protected: |
41 | |
42 | === modified file 'src/platform/graphics/android/hwc_common_device.cpp' |
43 | --- src/platform/graphics/android/hwc_common_device.cpp 2014-09-05 03:37:19 +0000 |
44 | +++ src/platform/graphics/android/hwc_common_device.cpp 2014-09-05 18:49:42 +0000 |
45 | @@ -34,7 +34,9 @@ |
46 | |
47 | static void vsync_hook(const struct hwc_procs* procs, int /*disp*/, int64_t /*timestamp*/) |
48 | { |
49 | - auto self = reinterpret_cast<mga::HWCCallbacks const*>(procs)->self; |
50 | + auto self = reinterpret_cast<mga::HWCCallbacks const*>(procs)->self.load(); |
51 | + if (!self) |
52 | + return; |
53 | self->notify_vsync(); |
54 | } |
55 | |
56 | @@ -46,15 +48,16 @@ |
57 | mga::HWCCommonDevice::HWCCommonDevice(std::shared_ptr<HwcWrapper> const& hwc_device, |
58 | std::shared_ptr<HWCVsyncCoordinator> const& coordinator) |
59 | : coordinator(coordinator), |
60 | + callbacks(std::make_shared<mga::HWCCallbacks>()), |
61 | hwc_device(hwc_device), |
62 | current_mode(mir_power_mode_on) |
63 | { |
64 | - callbacks.hooks.invalidate = invalidate_hook; |
65 | - callbacks.hooks.vsync = vsync_hook; |
66 | - callbacks.hooks.hotplug = hotplug_hook; |
67 | - callbacks.self = this; |
68 | + callbacks->hooks.invalidate = invalidate_hook; |
69 | + callbacks->hooks.vsync = vsync_hook; |
70 | + callbacks->hooks.hotplug = hotplug_hook; |
71 | + callbacks->self = this; |
72 | |
73 | - hwc_device->register_hooks(&callbacks.hooks); |
74 | + hwc_device->register_hooks(callbacks); |
75 | |
76 | try |
77 | { |
78 | @@ -78,6 +81,7 @@ |
79 | { |
80 | } |
81 | } |
82 | + callbacks->self = nullptr; |
83 | } |
84 | |
85 | void mga::HWCCommonDevice::notify_vsync() |
86 | |
87 | === modified file 'src/platform/graphics/android/hwc_common_device.h' |
88 | --- src/platform/graphics/android/hwc_common_device.h 2014-09-05 03:37:19 +0000 |
89 | +++ src/platform/graphics/android/hwc_common_device.h 2014-09-05 18:49:42 +0000 |
90 | @@ -25,6 +25,7 @@ |
91 | #include <memory> |
92 | #include <mutex> |
93 | #include <condition_variable> |
94 | +#include <atomic> |
95 | |
96 | namespace mir |
97 | { |
98 | @@ -39,7 +40,7 @@ |
99 | struct HWCCallbacks |
100 | { |
101 | hwc_procs_t hooks; |
102 | - HWCCommonDevice* self; |
103 | + std::atomic<HWCCommonDevice*> self; |
104 | }; |
105 | |
106 | class HWCCommonDevice : public DisplayDevice |
107 | @@ -63,8 +64,7 @@ |
108 | void turn_screen_off(); |
109 | virtual void turned_screen_off(); |
110 | |
111 | - HWCCallbacks callbacks; |
112 | - |
113 | + std::shared_ptr<HWCCallbacks> const callbacks; |
114 | std::shared_ptr<HwcWrapper> const hwc_device; |
115 | |
116 | std::mutex blanked_mutex; |
117 | |
118 | === modified file 'src/platform/graphics/android/hwc_wrapper.h' |
119 | --- src/platform/graphics/android/hwc_wrapper.h 2014-09-05 03:37:19 +0000 |
120 | +++ src/platform/graphics/android/hwc_wrapper.h 2014-09-05 18:49:42 +0000 |
121 | @@ -20,6 +20,7 @@ |
122 | #define MIR_GRAPHICS_ANDROID_HWC_WRAPPER_H_ |
123 | |
124 | #include <hardware/hwcomposer.h> |
125 | +#include <memory> |
126 | |
127 | namespace mir |
128 | { |
129 | @@ -35,7 +36,7 @@ |
130 | |
131 | virtual void prepare(hwc_display_contents_1_t&) const = 0; |
132 | virtual void set(hwc_display_contents_1_t&) const = 0; |
133 | - virtual void register_hooks(hwc_procs_t* callbacks) const = 0; |
134 | + virtual void register_hooks(std::shared_ptr<HWCCallbacks> const& callbacks) = 0; |
135 | virtual void vsync_signal_on() const = 0; |
136 | virtual void vsync_signal_off() const = 0; |
137 | virtual void display_on() const = 0; |
138 | |
139 | === modified file 'src/platform/graphics/android/output_builder.cpp' |
140 | --- src/platform/graphics/android/output_builder.cpp 2014-09-05 03:37:19 +0000 |
141 | +++ src/platform/graphics/android/output_builder.cpp 2014-09-05 18:49:42 +0000 |
142 | @@ -22,6 +22,7 @@ |
143 | #include "display_buffer.h" |
144 | #include "display_device.h" |
145 | #include "framebuffers.h" |
146 | +#include "real_hwc_wrapper.h" |
147 | |
148 | #include "mir/graphics/display_buffer.h" |
149 | #include "mir/graphics/display_report.h" |
150 | @@ -35,7 +36,8 @@ |
151 | std::shared_ptr<mga::GraphicBufferAllocator> const& buffer_allocator, |
152 | std::shared_ptr<mga::DisplayResourceFactory> const& res_factory, |
153 | std::shared_ptr<mg::DisplayReport> const& display_report, |
154 | - mga::OverlayOptimization overlay_optimization) |
155 | + mga::OverlayOptimization overlay_optimization, |
156 | + std::shared_ptr<HwcLogger> const& logger) |
157 | : buffer_allocator(buffer_allocator), |
158 | res_factory(res_factory), |
159 | display_report(display_report), |
160 | @@ -45,6 +47,7 @@ |
161 | try |
162 | { |
163 | hwc_native = res_factory->create_hwc_native_device(); |
164 | + hwc_wrapper = std::make_shared<mga::RealHwcWrapper>(hwc_native, logger); |
165 | } catch (...) |
166 | { |
167 | force_backup_display = true; |
168 | @@ -83,11 +86,11 @@ |
169 | { |
170 | if (hwc_native->common.version == HWC_DEVICE_API_VERSION_1_0) |
171 | { |
172 | - device = res_factory->create_hwc_fb_device(hwc_native, fb_native); |
173 | + device = res_factory->create_hwc_fb_device(hwc_wrapper, fb_native); |
174 | } |
175 | else //versions 1.1, 1.2 |
176 | { |
177 | - device = res_factory->create_hwc_device(hwc_native); |
178 | + device = res_factory->create_hwc_device(hwc_wrapper); |
179 | } |
180 | |
181 | switch (hwc_native->common.version) |
182 | |
183 | === modified file 'src/platform/graphics/android/output_builder.h' |
184 | --- src/platform/graphics/android/output_builder.h 2014-09-05 03:37:19 +0000 |
185 | +++ src/platform/graphics/android/output_builder.h 2014-09-05 18:49:42 +0000 |
186 | @@ -35,6 +35,8 @@ |
187 | class DisplayResourceFactory; |
188 | class GraphicBufferAllocator; |
189 | class DisplayDevice; |
190 | +class HwcWrapper; |
191 | +class HwcLogger; |
192 | |
193 | class OutputBuilder : public DisplayBuilder |
194 | { |
195 | @@ -43,7 +45,8 @@ |
196 | std::shared_ptr<GraphicBufferAllocator> const& buffer_allocator, |
197 | std::shared_ptr<DisplayResourceFactory> const& res_factory, |
198 | std::shared_ptr<DisplayReport> const& display_report, |
199 | - OverlayOptimization overlay_option); |
200 | + OverlayOptimization overlay_option, |
201 | + std::shared_ptr<HwcLogger> const& logger); |
202 | |
203 | MirPixelFormat display_format(); |
204 | std::unique_ptr<ConfigurableDisplayBuffer> create_display_buffer( |
205 | @@ -58,6 +61,7 @@ |
206 | std::shared_ptr<FramebufferBundle> framebuffers; |
207 | bool force_backup_display; |
208 | |
209 | + std::shared_ptr<HwcWrapper> hwc_wrapper; |
210 | std::shared_ptr<hwc_composer_device_1> hwc_native; |
211 | std::shared_ptr<framebuffer_device_t> fb_native; |
212 | OverlayOptimization overlay_optimization; |
213 | |
214 | === modified file 'src/platform/graphics/android/real_hwc_wrapper.cpp' |
215 | --- src/platform/graphics/android/real_hwc_wrapper.cpp 2014-09-05 03:37:19 +0000 |
216 | +++ src/platform/graphics/android/real_hwc_wrapper.cpp 2014-09-05 18:49:42 +0000 |
217 | @@ -17,6 +17,7 @@ |
218 | */ |
219 | |
220 | #include "real_hwc_wrapper.h" |
221 | +#include "hwc_common_device.h" |
222 | #include "hwc_logger.h" |
223 | #include <boost/throw_exception.hpp> |
224 | #include <stdexcept> |
225 | @@ -61,9 +62,10 @@ |
226 | } |
227 | } |
228 | |
229 | -void mga::RealHwcWrapper::register_hooks(hwc_procs_t* callbacks) const |
230 | +void mga::RealHwcWrapper::register_hooks(std::shared_ptr<HWCCallbacks> const& callbacks) |
231 | { |
232 | - hwc_device->registerProcs(hwc_device.get(), callbacks); |
233 | + hwc_device->registerProcs(hwc_device.get(), reinterpret_cast<hwc_procs_t*>(callbacks.get())); |
234 | + registered_callbacks = callbacks; |
235 | } |
236 | |
237 | void mga::RealHwcWrapper::vsync_signal_on() const |
238 | |
239 | === modified file 'src/platform/graphics/android/real_hwc_wrapper.h' |
240 | --- src/platform/graphics/android/real_hwc_wrapper.h 2014-09-05 03:37:19 +0000 |
241 | +++ src/platform/graphics/android/real_hwc_wrapper.h 2014-09-05 18:49:42 +0000 |
242 | @@ -39,13 +39,16 @@ |
243 | |
244 | void prepare(hwc_display_contents_1_t&) const override; |
245 | void set(hwc_display_contents_1_t&) const override; |
246 | - void register_hooks(hwc_procs_t* callbacks) const override; |
247 | + void register_hooks(std::shared_ptr<HWCCallbacks> const& callbacks) override; |
248 | void vsync_signal_on() const override; |
249 | void vsync_signal_off() const override; |
250 | void display_on() const override; |
251 | void display_off() const override; |
252 | private: |
253 | static size_t const num_displays{3}; //primary, external, virtual |
254 | + //note: the callbacks have to extend past the lifetime of the hwc_composer_device_1 for some |
255 | + // devices (LP: 1364637) |
256 | + std::shared_ptr<HWCCallbacks> registered_callbacks; |
257 | std::shared_ptr<hwc_composer_device_1> const hwc_device; |
258 | std::shared_ptr<HwcLogger> const logger; |
259 | }; |
260 | |
261 | === modified file 'src/platform/graphics/android/resource_factory.cpp' |
262 | --- src/platform/graphics/android/resource_factory.cpp 2014-09-05 03:37:19 +0000 |
263 | +++ src/platform/graphics/android/resource_factory.cpp 2014-09-05 18:49:42 +0000 |
264 | @@ -39,11 +39,6 @@ |
265 | namespace mg = mir::graphics; |
266 | namespace mga=mir::graphics::android; |
267 | |
268 | -mga::ResourceFactory::ResourceFactory(std::shared_ptr<HwcLogger> const& logger) |
269 | - : logger{logger} |
270 | -{ |
271 | -} |
272 | - |
273 | std::shared_ptr<framebuffer_device_t> mga::ResourceFactory::create_fb_native_device() const |
274 | { |
275 | hw_module_t const* module; |
276 | @@ -95,19 +90,17 @@ |
277 | } |
278 | |
279 | std::shared_ptr<mga::DisplayDevice> mga::ResourceFactory::create_hwc_device( |
280 | - std::shared_ptr<hwc_composer_device_1> const& hwc_native_device) const |
281 | + std::shared_ptr<HwcWrapper> const& wrapper) const |
282 | { |
283 | auto syncer = std::make_shared<mga::HWCVsync>(); |
284 | auto file_ops = std::make_shared<mga::RealSyncFileOps>(); |
285 | - auto wrapper = std::make_shared<mga::RealHwcWrapper>(hwc_native_device, logger); |
286 | return std::make_shared<mga::HwcDevice>(wrapper, syncer, file_ops); |
287 | } |
288 | |
289 | std::shared_ptr<mga::DisplayDevice> mga::ResourceFactory::create_hwc_fb_device( |
290 | - std::shared_ptr<hwc_composer_device_1> const& hwc_native_device, |
291 | + std::shared_ptr<HwcWrapper> const& wrapper, |
292 | std::shared_ptr<framebuffer_device_t> const& fb_native_device) const |
293 | { |
294 | auto syncer = std::make_shared<mga::HWCVsync>(); |
295 | - auto wrapper = std::make_shared<mga::RealHwcWrapper>(hwc_native_device, logger); |
296 | return std::make_shared<mga::HwcFbDevice>(wrapper, fb_native_device, syncer); |
297 | } |
298 | |
299 | === modified file 'src/platform/graphics/android/resource_factory.h' |
300 | --- src/platform/graphics/android/resource_factory.h 2014-09-05 03:37:19 +0000 |
301 | +++ src/platform/graphics/android/resource_factory.h 2014-09-05 18:49:42 +0000 |
302 | @@ -27,13 +27,10 @@ |
303 | { |
304 | namespace android |
305 | { |
306 | -class HwcLogger; |
307 | |
308 | class ResourceFactory : public DisplayResourceFactory |
309 | { |
310 | public: |
311 | - ResourceFactory(std::shared_ptr<HwcLogger> const& logger); |
312 | - |
313 | //native allocations |
314 | std::shared_ptr<hwc_composer_device_1> create_hwc_native_device() const; |
315 | std::shared_ptr<framebuffer_device_t> create_fb_native_device() const; |
316 | @@ -42,15 +39,13 @@ |
317 | std::shared_ptr<DisplayDevice> create_fb_device( |
318 | std::shared_ptr<framebuffer_device_t> const& fb_native_device) const; |
319 | std::shared_ptr<DisplayDevice> create_hwc_device( |
320 | - std::shared_ptr<hwc_composer_device_1> const& hwc_native_device) const; |
321 | + std::shared_ptr<HwcWrapper> const& hwc_native_device) const; |
322 | std::shared_ptr<DisplayDevice> create_hwc_fb_device( |
323 | - std::shared_ptr<hwc_composer_device_1> const& hwc_native_device, |
324 | + std::shared_ptr<HwcWrapper> const& hwc_native_device, |
325 | std::shared_ptr<framebuffer_device_t> const& fb_native_device) const; |
326 | |
327 | std::shared_ptr<ANativeWindow> create_native_window( |
328 | std::shared_ptr<FramebufferBundle> const& fb_bundle) const; |
329 | -private: |
330 | - std::shared_ptr<HwcLogger> const logger; |
331 | }; |
332 | |
333 | } |
334 | |
335 | === modified file 'tests/include/mir_test_doubles/mock_hwc_device_wrapper.h' |
336 | --- tests/include/mir_test_doubles/mock_hwc_device_wrapper.h 2014-09-05 03:37:19 +0000 |
337 | +++ tests/include/mir_test_doubles/mock_hwc_device_wrapper.h 2014-09-05 18:49:42 +0000 |
338 | @@ -34,7 +34,7 @@ |
339 | { |
340 | MOCK_CONST_METHOD1(prepare, void(hwc_display_contents_1_t&)); |
341 | MOCK_CONST_METHOD1(set, void(hwc_display_contents_1_t&)); |
342 | - MOCK_CONST_METHOD1(register_hooks, void(hwc_procs_t*)); |
343 | + MOCK_METHOD1(register_hooks, void(std::shared_ptr<graphics::android::HWCCallbacks> const&)); |
344 | MOCK_CONST_METHOD0(vsync_signal_on, void()); |
345 | MOCK_CONST_METHOD0(vsync_signal_off, void()); |
346 | MOCK_CONST_METHOD0(display_on, void()); |
347 | |
348 | === modified file 'tests/integration-tests/graphics/android/test_display_integration.cpp' |
349 | --- tests/integration-tests/graphics/android/test_display_integration.cpp 2014-09-05 03:37:19 +0000 |
350 | +++ tests/integration-tests/graphics/android/test_display_integration.cpp 2014-09-05 18:49:42 +0000 |
351 | @@ -53,8 +53,7 @@ |
352 | /* note about fb_device: OMAP4 drivers seem to only be able to open fb once |
353 | per process (repeated framebuffer_{open,close}() doesn't seem to work). once we |
354 | figure out why, we can remove fb_device in the test fixture */ |
355 | - auto logger = std::make_shared<mga::NullHwcLogger>(); |
356 | - display_resource_factory = std::make_shared<mga::ResourceFactory>(logger); |
357 | + display_resource_factory = std::make_shared<mga::ResourceFactory>(); |
358 | } |
359 | |
360 | static void TearDownTestCase() |
361 | @@ -79,8 +78,9 @@ |
362 | auto stub_gl_config = std::make_shared<mtd::StubGLConfig>(); |
363 | auto buffer_initializer = std::make_shared<mg::NullBufferInitializer>(); |
364 | auto fb_allocator = std::make_shared<mga::AndroidGraphicBufferAllocator>(buffer_initializer); |
365 | + auto logger = std::make_shared<mga::NullHwcLogger>(); |
366 | auto display_buffer_factory = std::make_shared<mga::OutputBuilder>( |
367 | - fb_allocator, display_resource_factory, null_display_report, mga::OverlayOptimization::disabled); |
368 | + fb_allocator, display_resource_factory, null_display_report, mga::OverlayOptimization::disabled, logger); |
369 | |
370 | auto program_factory = std::make_shared<mg::ProgramFactory>(); |
371 | mga::AndroidDisplay display{display_buffer_factory, program_factory, stub_gl_config, null_display_report}; |
372 | |
373 | === modified file 'tests/unit-tests/graphics/android/test_hwc_common_device.cpp' |
374 | --- tests/unit-tests/graphics/android/test_hwc_common_device.cpp 2014-09-05 03:37:19 +0000 |
375 | +++ tests/unit-tests/graphics/android/test_hwc_common_device.cpp 2014-09-05 18:49:42 +0000 |
376 | @@ -90,18 +90,33 @@ |
377 | TYPED_TEST(HWCCommon, test_proc_registration) |
378 | { |
379 | using namespace testing; |
380 | - |
381 | - hwc_procs_t const* procs{nullptr}; |
382 | - EXPECT_CALL(*(this->mock_device), register_hooks(_)) |
383 | - .Times(1) |
384 | - .WillOnce(SaveArg<0>(&procs)); |
385 | - |
386 | - auto device = make_hwc_device<TypeParam>(this->mock_device, this->mock_fbdev, this->mock_vsync); |
387 | - |
388 | - ASSERT_THAT(procs, Ne(nullptr)); |
389 | - EXPECT_THAT(procs->invalidate, Ne(nullptr)); |
390 | - EXPECT_THAT(procs->vsync, Ne(nullptr)); |
391 | - EXPECT_THAT(procs->hotplug, Ne(nullptr)); |
392 | + std::shared_ptr<mga::HWCCallbacks> callbacks; |
393 | + EXPECT_CALL(*(this->mock_device), register_hooks(_)) |
394 | + .Times(1) |
395 | + .WillOnce(SaveArg<0>(&callbacks)); |
396 | + |
397 | + auto device = make_hwc_device<TypeParam>(this->mock_device, this->mock_fbdev, this->mock_vsync); |
398 | + |
399 | + ASSERT_THAT(callbacks, Ne(nullptr)); |
400 | + EXPECT_THAT(callbacks->hooks.invalidate, Ne(nullptr)); |
401 | + EXPECT_THAT(callbacks->hooks.vsync, Ne(nullptr)); |
402 | + EXPECT_THAT(callbacks->hooks.hotplug, Ne(nullptr)); |
403 | +} |
404 | + |
405 | +TYPED_TEST(HWCCommon, test_device_destruction_unregisters_self_from_hooks) |
406 | +{ |
407 | + using namespace testing; |
408 | + std::shared_ptr<mga::HWCCallbacks> callbacks; |
409 | + EXPECT_CALL(*(this->mock_device), register_hooks(_)) |
410 | + .Times(1) |
411 | + .WillOnce(SaveArg<0>(&callbacks)); |
412 | + |
413 | + auto device = make_hwc_device<TypeParam>(this->mock_device, this->mock_fbdev, this->mock_vsync); |
414 | + |
415 | + ASSERT_THAT(callbacks, Ne(nullptr)); |
416 | + EXPECT_THAT(callbacks->self, Eq(device.get())); |
417 | + device = nullptr; |
418 | + EXPECT_THAT(callbacks->self, Eq(nullptr)); |
419 | } |
420 | |
421 | TYPED_TEST(HWCCommon, registerst_hooks_and_turns_on_display) |
422 | @@ -174,17 +189,20 @@ |
423 | TYPED_TEST(HWCCommon, callback_calls_hwcvsync) |
424 | { |
425 | using namespace testing; |
426 | - |
427 | - hwc_procs_t const* procs{nullptr}; |
428 | + std::shared_ptr<mga::HWCCallbacks> callbacks; |
429 | EXPECT_CALL(*(this->mock_device), register_hooks(_)) |
430 | .Times(1) |
431 | - .WillOnce(SaveArg<0>(&procs)); |
432 | + .WillOnce(SaveArg<0>(&callbacks)); |
433 | |
434 | auto device = make_hwc_device<TypeParam>(this->mock_device, this->mock_fbdev, this->mock_vsync); |
435 | |
436 | EXPECT_CALL(*this->mock_vsync, notify_vsync()) |
437 | .Times(1); |
438 | - procs->vsync(procs, 0, 0); |
439 | + ASSERT_THAT(callbacks, Ne(nullptr)); |
440 | + callbacks->hooks.vsync(&callbacks->hooks, 0, 0); |
441 | + |
442 | + callbacks->self = nullptr; |
443 | + callbacks->hooks.vsync(&callbacks->hooks, 0, 0); |
444 | } |
445 | |
446 | TYPED_TEST(HWCCommon, set_orientation) |
447 | |
448 | === modified file 'tests/unit-tests/graphics/android/test_hwc_wrapper.cpp' |
449 | --- tests/unit-tests/graphics/android/test_hwc_wrapper.cpp 2014-09-05 03:37:19 +0000 |
450 | +++ tests/unit-tests/graphics/android/test_hwc_wrapper.cpp 2014-09-05 18:49:42 +0000 |
451 | @@ -18,6 +18,7 @@ |
452 | |
453 | #include "src/platform/graphics/android/real_hwc_wrapper.h" |
454 | #include "src/platform/graphics/android/hwc_logger.h" |
455 | +#include "src/platform/graphics/android/hwc_common_device.h" |
456 | #include "mir_test_doubles/mock_hwc_composer_device_1.h" |
457 | #include <gmock/gmock.h> |
458 | #include <gtest/gtest.h> |
459 | @@ -144,14 +145,21 @@ |
460 | }, std::runtime_error); |
461 | } |
462 | |
463 | -TEST_F(HwcWrapper, register_procs) |
464 | +TEST_F(HwcWrapper, register_procs_registers_and_preserves_hooks_until_destruction) |
465 | { |
466 | using namespace testing; |
467 | - hwc_procs_t procs; |
468 | - EXPECT_CALL(*mock_device, registerProcs_interface(mock_device.get(), &procs)) |
469 | + auto procs = std::make_shared<mga::HWCCallbacks>(); |
470 | + EXPECT_CALL(*mock_device, registerProcs_interface( |
471 | + mock_device.get(), reinterpret_cast<hwc_procs_t*>(procs.get()))) |
472 | .Times(1); |
473 | - mga::RealHwcWrapper wrapper(mock_device, mock_logger); |
474 | - wrapper.register_hooks(&procs); |
475 | + |
476 | + auto use_count = procs.use_count(); |
477 | + { |
478 | + mga::RealHwcWrapper wrapper(mock_device, mock_logger); |
479 | + wrapper.register_hooks(procs); |
480 | + EXPECT_THAT(procs.use_count(), Eq(use_count+1)); |
481 | + } |
482 | + EXPECT_THAT(procs.use_count(), Eq(use_count)); |
483 | } |
484 | |
485 | TEST_F(HwcWrapper, turns_display_on) |
486 | |
487 | === modified file 'tests/unit-tests/graphics/android/test_output_builder.cpp' |
488 | --- tests/unit-tests/graphics/android/test_output_builder.cpp 2014-09-05 03:37:19 +0000 |
489 | +++ tests/unit-tests/graphics/android/test_output_builder.cpp 2014-09-05 18:49:42 +0000 |
490 | @@ -21,6 +21,7 @@ |
491 | #include "src/platform/graphics/android/android_format_conversion-inl.h" |
492 | #include "src/platform/graphics/android/resource_factory.h" |
493 | #include "src/platform/graphics/android/graphic_buffer_allocator.h" |
494 | +#include "src/platform/graphics/android/hwc_loggers.h" |
495 | #include "mir_test_doubles/mock_buffer.h" |
496 | #include "mir_test_doubles/mock_buffer_packer.h" |
497 | #include "mir_test_doubles/mock_display_report.h" |
498 | @@ -79,10 +80,10 @@ |
499 | MOCK_CONST_METHOD1(create_fb_device, |
500 | std::shared_ptr<mga::DisplayDevice>(std::shared_ptr<framebuffer_device_t> const&)); |
501 | MOCK_CONST_METHOD1(create_hwc_device, |
502 | - std::shared_ptr<mga::DisplayDevice>(std::shared_ptr<hwc_composer_device_1> const&)); |
503 | + std::shared_ptr<mga::DisplayDevice>(std::shared_ptr<mga::HwcWrapper> const&)); |
504 | MOCK_CONST_METHOD2(create_hwc_fb_device, |
505 | std::shared_ptr<mga::DisplayDevice>( |
506 | - std::shared_ptr<hwc_composer_device_1> const&, std::shared_ptr<framebuffer_device_t> const&)); |
507 | + std::shared_ptr<mga::HwcWrapper> const&, std::shared_ptr<framebuffer_device_t> const&)); |
508 | }; |
509 | |
510 | class OutputBuilder : public ::testing::Test |
511 | @@ -109,6 +110,7 @@ |
512 | mga::PbufferGLContext gl_context{ |
513 | mga::to_mir_format(mock_egl.fake_visual_id), stub_gl_config, mock_display_report}; |
514 | mtd::StubGLProgramFactory const stub_program_factory; |
515 | + std::shared_ptr<mga::HwcLogger> logger{std::make_shared<mga::NullHwcLogger>()}; |
516 | }; |
517 | } |
518 | TEST_F(OutputBuilder, hwc_version_10_success) |
519 | @@ -129,7 +131,7 @@ |
520 | .Times(1); |
521 | |
522 | mga::OutputBuilder factory( |
523 | - mt::fake_shared(mock_buffer_allocator),mock_resource_factory, mt::fake_shared(mock_display_report), mga::OverlayOptimization::disabled); |
524 | + mt::fake_shared(mock_buffer_allocator),mock_resource_factory, mt::fake_shared(mock_display_report), mga::OverlayOptimization::disabled, logger); |
525 | factory.create_display_buffer(stub_program_factory, gl_context); |
526 | } |
527 | |
528 | @@ -152,7 +154,7 @@ |
529 | .Times(1); |
530 | |
531 | mga::OutputBuilder factory( |
532 | - mt::fake_shared(mock_buffer_allocator),mock_resource_factory, mt::fake_shared(mock_display_report), mga::OverlayOptimization::disabled); |
533 | + mt::fake_shared(mock_buffer_allocator),mock_resource_factory, mt::fake_shared(mock_display_report), mga::OverlayOptimization::disabled, logger); |
534 | factory.create_display_buffer(stub_program_factory, gl_context); |
535 | } |
536 | |
537 | @@ -172,7 +174,7 @@ |
538 | .Times(1); |
539 | |
540 | mga::OutputBuilder factory( |
541 | - mt::fake_shared(mock_buffer_allocator),mock_resource_factory, mt::fake_shared(mock_display_report), mga::OverlayOptimization::disabled); |
542 | + mt::fake_shared(mock_buffer_allocator),mock_resource_factory, mt::fake_shared(mock_display_report), mga::OverlayOptimization::disabled, logger); |
543 | factory.create_display_buffer(stub_program_factory, gl_context); |
544 | } |
545 | |
546 | @@ -195,7 +197,7 @@ |
547 | .Times(1); |
548 | |
549 | mga::OutputBuilder factory( |
550 | - mt::fake_shared(mock_buffer_allocator),mock_resource_factory, mt::fake_shared(mock_display_report), mga::OverlayOptimization::disabled); |
551 | + mt::fake_shared(mock_buffer_allocator),mock_resource_factory, mt::fake_shared(mock_display_report), mga::OverlayOptimization::disabled, logger); |
552 | factory.create_display_buffer(stub_program_factory, gl_context); |
553 | } |
554 | |
555 | @@ -217,7 +219,8 @@ |
556 | mt::fake_shared(mock_buffer_allocator), |
557 | mock_resource_factory, |
558 | mt::fake_shared(mock_display_report), |
559 | - mga::OverlayOptimization::disabled); |
560 | + mga::OverlayOptimization::disabled, |
561 | + logger); |
562 | }, std::runtime_error); |
563 | } |
564 | |
565 | @@ -235,6 +238,6 @@ |
566 | .Times(1); |
567 | |
568 | mga::OutputBuilder factory( |
569 | - mt::fake_shared(mock_buffer_allocator),mock_resource_factory, mt::fake_shared(mock_display_report), mga::OverlayOptimization::disabled); |
570 | + mt::fake_shared(mock_buffer_allocator),mock_resource_factory, mt::fake_shared(mock_display_report), mga::OverlayOptimization::disabled, logger); |
571 | factory.create_display_buffer(stub_program_factory, gl_context); |
572 | } |
573 | |
574 | === modified file 'tests/unit-tests/graphics/android/test_resource_factory.cpp' |
575 | --- tests/unit-tests/graphics/android/test_resource_factory.cpp 2014-09-05 03:37:19 +0000 |
576 | +++ tests/unit-tests/graphics/android/test_resource_factory.cpp 2014-09-05 18:49:42 +0000 |
577 | @@ -17,7 +17,6 @@ |
578 | */ |
579 | |
580 | #include "src/platform/graphics/android/resource_factory.h" |
581 | -#include "src/platform/graphics/android/hwc_loggers.h" |
582 | #include "mir_test_doubles/mock_android_hw.h" |
583 | |
584 | #include <stdexcept> |
585 | @@ -30,12 +29,7 @@ |
586 | |
587 | struct ResourceFactoryTest : public ::testing::Test |
588 | { |
589 | - ResourceFactoryTest() : |
590 | - logger{std::make_shared<mga::NullHwcLogger>()} |
591 | - { |
592 | - } |
593 | mtd::HardwareAccessMock hw_access_mock; |
594 | - std::shared_ptr<mga::HwcLogger> const logger; |
595 | }; |
596 | |
597 | TEST_F(ResourceFactoryTest, fb_native_creation_opens_and_closes_gralloc) |
598 | @@ -44,7 +38,7 @@ |
599 | EXPECT_CALL(hw_access_mock, hw_get_module(StrEq(GRALLOC_HARDWARE_MODULE_ID), _)) |
600 | .Times(1); |
601 | |
602 | - mga::ResourceFactory factory{logger}; |
603 | + mga::ResourceFactory factory; |
604 | factory.create_fb_native_device(); |
605 | EXPECT_TRUE(hw_access_mock.open_count_matches_close()); |
606 | } |
607 | @@ -52,7 +46,7 @@ |
608 | TEST_F(ResourceFactoryTest, test_device_creation_throws_on_failure) |
609 | { |
610 | using namespace testing; |
611 | - mga::ResourceFactory factory{logger}; |
612 | + mga::ResourceFactory factory; |
613 | |
614 | /* failure because of rc */ |
615 | EXPECT_CALL(hw_access_mock, hw_get_module(StrEq(GRALLOC_HARDWARE_MODULE_ID), _)) |
616 | @@ -79,7 +73,7 @@ |
617 | EXPECT_CALL(hw_access_mock, hw_get_module(StrEq(HWC_HARDWARE_MODULE_ID), _)) |
618 | .Times(1); |
619 | |
620 | - mga::ResourceFactory factory{logger}; |
621 | + mga::ResourceFactory factory; |
622 | factory.create_hwc_native_device(); |
623 | |
624 | EXPECT_TRUE(hw_access_mock.open_count_matches_close()); |
625 | @@ -96,7 +90,7 @@ |
626 | .WillOnce(Return(-1)) |
627 | .WillOnce(DoAll(SetArgPointee<1>(&failing_hwc_module_stub), Return(0))); |
628 | |
629 | - mga::ResourceFactory factory{logger}; |
630 | + mga::ResourceFactory factory; |
631 | |
632 | EXPECT_THROW({ |
633 | factory.create_hwc_native_device(); |
80 + callbacks->self = nullptr;
Doesn't 'self' need be atomic?
45 + hwc_wrapper = std::make_ shared< mga::RealHwcWra pper>(hwc_ native, logger);
Perhaps have a mga::ResourceFa ctory:: create_ hwc_wrapper( ) instead (and then we probably won't need ResourceFactory ::create_ hwc_native_ device( )).
Needs Fixing/Info.