Merge lp:~alan-griffiths/mir/reboot-0.26.3-release into lp:mir
- reboot-0.26.3-release
- Merge into development-branch
Proposed by
Alan Griffiths
Status: | Superseded |
---|---|
Proposed branch: | lp:~alan-griffiths/mir/reboot-0.26.3-release |
Merge into: | lp:mir |
Diff against target: |
1811 lines (+1205/-14) (has conflicts) 23 files modified
CMakeLists.txt (+5/-0) debian/changelog (+54/-0) debian/control (+69/-0) include/client/mir_toolkit/client_types.h (+10/-0) include/client/mir_toolkit/extensions/gbm_buffer.h (+82/-0) include/client/mir_toolkit/mir_buffer_stream.h (+8/-0) include/client/mir_toolkit/mir_cursor_configuration.h (+18/-1) include/client/mir_toolkit/mir_window.h (+29/-0) include/client/mir_toolkit/rs/mir_render_surface.h (+103/-0) include/core/mir_toolkit/deprecations.h (+39/-0) src/platforms/android/utils/CMakeLists.txt.OTHER (+46/-0) src/platforms/mesa/client/client_platform.cpp (+145/-0) src/platforms/mesa/server/kms/real_kms_display_configuration.cpp (+214/-0) src/server/compositor/multi_monitor_arbiter.cpp (+7/-0) src/server/input/default_device.cpp (+46/-0) src/server/input/default_device.h (+16/-0) src/server/input/default_input_device_hub.cpp (+18/-1) src/server/input/default_input_device_hub.h (+4/-0) tests/acceptance-tests/test_custom_window_management.cpp (+50/-0) tests/acceptance-tests/test_presentation_chain.cpp (+184/-12) tests/unit-tests/input/test_default_device.cpp (+26/-0) tests/unit-tests/input/test_default_input_device_hub.cpp (+24/-0) tests/unit-tests/platforms/nested/mir_display_configuration_builder.cpp (+8/-0) Text conflict in CMakeLists.txt Text conflict in debian/control Text conflict in include/client/mir_toolkit/client_types.h Text conflict in include/client/mir_toolkit/extensions/gbm_buffer.h Text conflict in include/client/mir_toolkit/mir_buffer_stream.h Text conflict in include/client/mir_toolkit/mir_cursor_configuration.h Text conflict in include/client/mir_toolkit/mir_window.h Text conflict in include/client/mir_toolkit/rs/mir_render_surface.h Text conflict in include/core/mir_toolkit/deprecations.h Conflict adding files to src/platforms/android. Created directory. Conflict because src/platforms/android is not versioned, but has versioned children. Versioned directory. Conflict adding files to src/platforms/android/utils. Created directory. Conflict because src/platforms/android/utils is not versioned, but has versioned children. Versioned directory. Contents conflict in src/platforms/android/utils/CMakeLists.txt Text conflict in src/platforms/mesa/client/client_platform.cpp Text conflict in src/platforms/mesa/server/kms/real_kms_display_configuration.cpp Text conflict in src/server/compositor/multi_monitor_arbiter.cpp Text conflict in src/server/input/default_device.cpp Text conflict in src/server/input/default_device.h Text conflict in src/server/input/default_input_device_hub.cpp Text conflict in src/server/input/default_input_device_hub.h Text conflict in tests/acceptance-tests/test_custom_window_management.cpp Text conflict in tests/acceptance-tests/test_presentation_chain.cpp Text conflict in tests/unit-tests/input/test_default_device.cpp Text conflict in tests/unit-tests/input/test_default_input_device_hub.cpp Text conflict in tests/unit-tests/platforms/nested/mir_display_configuration_builder.cpp |
To merge this branch: | bzr merge lp:~alan-griffiths/mir/reboot-0.26.3-release |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Mir development team | Pending | ||
Review via email: mp+324661@code.launchpad.net |
This proposal has been superseded by a proposal from 2017-05-26.
Commit message
Restore platforms that are unsupported in xenial, add support for building downstreams on, and re-sync deprecation macros with current development.
Description of the change
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'CMakeLists.txt' |
2 | --- CMakeLists.txt 2017-05-08 03:04:26 +0000 |
3 | +++ CMakeLists.txt 2017-05-26 09:20:21 +0000 |
4 | @@ -28,8 +28,13 @@ |
5 | set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) |
6 | |
7 | set(MIR_VERSION_MAJOR 0) |
8 | +<<<<<<< TREE |
9 | set(MIR_VERSION_MINOR 27) |
10 | set(MIR_VERSION_PATCH 0) |
11 | +======= |
12 | +set(MIR_VERSION_MINOR 26) |
13 | +set(MIR_VERSION_PATCH 3) |
14 | +>>>>>>> MERGE-SOURCE |
15 | |
16 | add_definitions(-DMIR_VERSION_MAJOR=${MIR_VERSION_MAJOR}) |
17 | add_definitions(-DMIR_VERSION_MINOR=${MIR_VERSION_MINOR}) |
18 | |
19 | === modified file 'debian/changelog' |
20 | --- debian/changelog 2017-05-08 03:04:26 +0000 |
21 | +++ debian/changelog 2017-05-26 09:20:21 +0000 |
22 | @@ -1,3 +1,57 @@ |
23 | +mir (0.26.3-0ubuntu1) UNRELEASED; urgency=medium |
24 | + |
25 | + * New upstream release 0.26.3 (https://launchpad.net/mir/+milestone/0.26.3) |
26 | + - Enhancements: |
27 | + . Make deprecations optional (and default to off for builds on 16.04 LTS) |
28 | + . Added support for building on Ubuntu 17.10 artful. |
29 | + - Bugs fixed: |
30 | + . Mir needs to be updated to 0.26 in 16.04LTS (LP: #1685186) |
31 | + . unity-system-compositor crashed with SIGSEGV in |
32 | + libinput_device_config_accel_is_available() from |
33 | + libinput_device_config_accel_set_speed() from |
34 | + mir::input::evdev::LibInputDevice::apply_settings() (LP: #1672955) |
35 | + . Please transition to Boost 1.62 (LP: #1675138) |
36 | + . Mir sending key repeat events continually to nested shell after VT |
37 | + switch (causes Unity8 lockup for a while) (LP: #1675357) |
38 | + . mir_demo_standalone_render_overlays fails to link (LP: #1677239) |
39 | + |
40 | + -- Daniel van Vugt <daniel.van.vugt@canonical.com> Thu, 30 Mar 2017 11:43:28 +0800 |
41 | + |
42 | +mir (0.26.2+17.04.20170322.1-0ubuntu2) zesty; urgency=medium |
43 | + |
44 | + [ Mattia Rizzolo ] |
45 | + * Patch the code to use unversioned runtime boost libraries (LP: #1675138). |
46 | + |
47 | + -- Gianfranco Costamagna <locutusofborg@debian.org> Fri, 24 Mar 2017 22:58:36 +0100 |
48 | + |
49 | +mir (0.26.2+17.04.20170322.1-0ubuntu1) zesty; urgency=medium |
50 | + |
51 | + [ Daniel van Vugt ] |
52 | + * New upstream release 0.26.2 (https://launchpad.net/mir/+milestone/0.26.2) |
53 | + - Bugs fixed: |
54 | + . EDID does not change when hotplugging a monitor (LP: #1660017) |
55 | + . [regression] mirout crashes when connecting to unity8 or any nested |
56 | + server: [libprotobuf FATAL /usr/include/google/protobuf/repeated_field. |
57 | + h:1408] CHECK failed: (index) < (current_size_) (LP: #1661163) |
58 | + . Mir server crashed with SIGSEGV in |
59 | + mir::compositor::TemporaryBuffer::size() called from |
60 | + mir::gl::tessellate_renderable_into_rectangle() (LP: #1664760) |
61 | + . Nested servers (Unity8) periodically stutter (half frame rate) with |
62 | + Mir 0.26.1 (LP: #1666372) |
63 | + . Don't dereference the end iterator in ms::ApplicationSession:: |
64 | + surface_after() (LP: #1667645) |
65 | + . [regression] OSK input shaping no longer works correctly (LP: #1669444) |
66 | + . Setting MirWindowSpec parameters always causes window's input_region |
67 | + to be reset (LP: #1670876) |
68 | + . Subpixel order not included in Mir display information (LP: #1393578) |
69 | + . Presentation chains should support various swap interval modes |
70 | + (LP: #1673533) |
71 | + . Need an extension for GBM buffers to replace |
72 | + mir_buffer_get_buffer_package() (LP: #1673534) |
73 | + . Seg fault on detect_fd_leaks (LP: #1661498) |
74 | + |
75 | + -- Cemil Azizoglu <cemil.azizoglu@canonical.com> Wed, 22 Mar 2017 04:54:19 +0000 |
76 | + |
77 | mir (0.26.1+17.04.20170209.1-0ubuntu1) zesty; urgency=medium |
78 | |
79 | * New upstream release 0.26.1 (https://launchpad.net/mir/+milestone/0.26.1) |
80 | |
81 | === modified file 'debian/control' |
82 | --- debian/control 2017-05-08 03:04:26 +0000 |
83 | +++ debian/control 2017-05-26 09:20:21 +0000 |
84 | @@ -292,6 +292,21 @@ |
85 | . |
86 | Contains a tool for stress testing the Mir display server |
87 | |
88 | +<<<<<<< TREE |
89 | +======= |
90 | +Package: mir-android-diagnostics |
91 | +Architecture: i386 amd64 armhf |
92 | +Pre-Depends: ${misc:Pre-Depends} |
93 | +Depends: ${misc:Depends}, |
94 | + ${shlibs:Depends}, |
95 | +Recommends: mir-demos, |
96 | +Description: Display Server for Ubuntu - android platform diagnostics utility |
97 | + Mir is a display server running on linux systems, with a focus on efficiency, |
98 | + robust operation and a well-defined driver model. |
99 | + . |
100 | + Contains a tool for checking the graphics components of android devices. |
101 | + |
102 | +>>>>>>> MERGE-SOURCE |
103 | Package: libmircore1 |
104 | Section: libs |
105 | Architecture: linux-any |
106 | @@ -347,7 +362,25 @@ |
107 | Contains the shared libraries required for the Mir server to interact with |
108 | the hardware platform using the Mesa drivers. |
109 | |
110 | +<<<<<<< TREE |
111 | Package: mir-platform-input-evdev7 |
112 | +======= |
113 | +Package: mir-platform-graphics-android12 |
114 | +Section: libs |
115 | +Architecture: i386 amd64 armhf |
116 | +Multi-Arch: same |
117 | +Pre-Depends: ${misc:Pre-Depends} |
118 | +Depends: ${misc:Depends}, |
119 | + ${shlibs:Depends}, |
120 | +Description: Display server for Ubuntu - platform library for Android |
121 | + Mir is a display server running on linux systems, with a focus on efficiency, |
122 | + robust operation and a well-defined driver model. |
123 | + . |
124 | + Contains the shared libraries required for the Mir server to interact with |
125 | + the hardware platform using the Android drivers. |
126 | + |
127 | +Package: mir-platform-input-evdev6 |
128 | +>>>>>>> MERGE-SOURCE |
129 | Section: libs |
130 | Architecture: linux-any |
131 | Multi-Arch: same |
132 | @@ -389,6 +422,23 @@ |
133 | Contains header files required to use the platform specific capabilities of |
134 | the Mir Mesa backend. |
135 | |
136 | +<<<<<<< TREE |
137 | +======= |
138 | +Package: mir-client-platform-android5 |
139 | +Section: libs |
140 | +Architecture: i386 amd64 armhf |
141 | +Multi-Arch: same |
142 | +Pre-Depends: ${misc:Pre-Depends} |
143 | +Depends: ${misc:Depends}, |
144 | + ${shlibs:Depends} |
145 | +Description: Display server for Ubuntu - client platform library for Android |
146 | + Mir is a display server running on linux systems, with a focus on efficiency, |
147 | + robust operation and a well-defined driver model. |
148 | + . |
149 | + Contains the shared libraries required for the Mir clients to interact with |
150 | + the underlying hardware platform using the Android drivers. |
151 | + |
152 | +>>>>>>> MERGE-SOURCE |
153 | Package: mir-graphics-drivers-desktop |
154 | Section: libs |
155 | Architecture: linux-any |
156 | @@ -406,6 +456,25 @@ |
157 | This package depends on a full set of graphics drivers for traditional desktop |
158 | systems. |
159 | |
160 | +<<<<<<< TREE |
161 | +======= |
162 | +Package: mir-graphics-drivers-android |
163 | +Section: libs |
164 | +Architecture: i386 amd64 armhf |
165 | +Multi-Arch: same |
166 | +Pre-Depends: ${misc:Pre-Depends} |
167 | +Depends: ${misc:Depends}, |
168 | + mir-platform-graphics-android12, |
169 | + mir-client-platform-android5, |
170 | + mir-platform-input-evdev6, |
171 | +Description: Display server for Ubuntu - android driver metapackage |
172 | + Mir is a display server running on linux systems, with a focus on efficiency, |
173 | + robust operation and a well-defined driver model. |
174 | + . |
175 | + This package depends on a full set of graphics drivers for running Mir on top |
176 | + of an existing Android driver stack. |
177 | + |
178 | +>>>>>>> MERGE-SOURCE |
179 | Package: libmircookie2 |
180 | Section: libs |
181 | Architecture: any |
182 | |
183 | === modified file 'include/client/mir/event_printer.h' |
184 | === modified file 'include/client/mir/events/event_builders.h' |
185 | === modified file 'include/client/mir_toolkit/client_types.h' |
186 | --- include/client/mir_toolkit/client_types.h 2017-05-23 00:22:04 +0000 |
187 | +++ include/client/mir_toolkit/client_types.h 2017-05-26 09:20:21 +0000 |
188 | @@ -54,6 +54,7 @@ |
189 | typedef struct MirError MirError; |
190 | typedef struct MirPresentationChain MirPresentationChain; |
191 | typedef struct MirBuffer MirBuffer; |
192 | +<<<<<<< TREE |
193 | typedef struct MirRenderSurface MirRenderSurface; |
194 | |
195 | /** |
196 | @@ -62,6 +63,9 @@ |
197 | */ |
198 | typedef struct MirCursorConfiguration MirCursorConfiguration |
199 | MIR_FOR_REMOVAL_IN_VERSION_1("Use mir_window_spec_set_cursor_name/mir_window_spec_set_cursor_render_surface instead"); |
200 | +======= |
201 | +typedef struct MirRenderSurface MirRenderSurface; |
202 | +>>>>>>> MERGE-SOURCE |
203 | |
204 | /** |
205 | * Descriptor for an output connection. |
206 | @@ -576,10 +580,16 @@ |
207 | |
208 | typedef void (*mir_surface_id_callback)( |
209 | MirSurface* surface, MirPersistentId* id, void* context) |
210 | +<<<<<<< TREE |
211 | MIR_FOR_REMOVAL_IN_VERSION_1("Use MirWindowIdCallback instead"); |
212 | |
213 | typedef MirSurfaceParameters MirWindowParameters |
214 | MIR_FOR_REMOVAL_IN_VERSION_1("Use mir_window_get_xxx apis or listen for attribute events instead"); |
215 | +======= |
216 | +MIR_FOR_REMOVAL_IN_VERSION_1("Use MirWindowIdCallback instead"); |
217 | + |
218 | +typedef MirSurfaceParameters MirWindowParameters; |
219 | +>>>>>>> MERGE-SOURCE |
220 | |
221 | #pragma GCC diagnostic pop |
222 | |
223 | |
224 | === modified file 'include/client/mir_toolkit/events/event.h' |
225 | === modified file 'include/client/mir_toolkit/extensions/gbm_buffer.h' |
226 | --- include/client/mir_toolkit/extensions/gbm_buffer.h 2017-05-08 03:04:26 +0000 |
227 | +++ include/client/mir_toolkit/extensions/gbm_buffer.h 2017-05-26 09:20:21 +0000 |
228 | @@ -76,6 +76,7 @@ |
229 | connection, "mir_extension_gbm_buffer", 1); |
230 | } |
231 | |
232 | +<<<<<<< TREE |
233 | /** Allocate a MirBuffer via gbm and wait for the allocation. |
234 | * available in V2. |
235 | * The buffer can be destroyed via mir_buffer_release(). |
236 | @@ -155,6 +156,87 @@ |
237 | connection, "mir_extension_gbm_buffer", 2); |
238 | } |
239 | |
240 | +======= |
241 | +/** Allocate a MirBuffer via gbm and wait for the allocation. |
242 | + * available in V2. |
243 | + * The buffer can be destroyed via mir_buffer_release(). |
244 | + * |
245 | + * \param [in] connection The connection |
246 | + * \param [in] width Requested buffer width |
247 | + * \param [in] height Requested buffer height |
248 | + * \param [in] gbm_pixel_format The pixel format, one of the GBM_FORMATs |
249 | + * \param [in] gbm_bo_flags The gbm_bo_flags for the buffer. |
250 | + * \return The buffer |
251 | + **/ |
252 | +typedef MirBuffer* (*MirConnectionAllocateBufferGbmSync)( |
253 | + MirConnection* connection, |
254 | + uint32_t width, uint32_t height, |
255 | + uint32_t gbm_pixel_format, |
256 | + uint32_t gbm_bo_flags); |
257 | + |
258 | +/** Check if a MirBuffer is suitable for import via GBM_BO_IMPORT_FD |
259 | + * |
260 | + * \param [in] buffer The buffer |
261 | + * \return True if suitable, false if unsuitable |
262 | + */ |
263 | +typedef bool (*MirBufferIsGbmImportable)(MirBuffer* buffer); |
264 | + |
265 | +/** Access the fd a MirBuffer suitable for gbm import |
266 | + * \pre The buffer is suitable for GBM_BO_IMPORT_FD |
267 | + * \warning The fd is owned by the buffer. Do not close() it. |
268 | + * \param [in] buffer The buffer |
269 | + * \return The fd |
270 | + */ |
271 | +typedef int (*MirBufferGbmFd)(MirBuffer* buffer); |
272 | + |
273 | +/** Get the stride of a MirBuffer |
274 | + * \pre The buffer is suitable for GBM_BO_IMPORT_FD |
275 | + * \param [in] buffer The buffer |
276 | + * \return The stride of the buffer |
277 | + */ |
278 | +typedef uint32_t (*MirBufferGbmStride)(MirBuffer* buffer); |
279 | + |
280 | +/** Get the GBM_FORMAT of a MirBuffer |
281 | + * \pre The buffer is suitable for GBM_BO_IMPORT_FD |
282 | + * \param [in] buffer The buffer |
283 | + * \return The GBM_FORMAT of the buffer |
284 | + */ |
285 | +typedef uint32_t (*MirBufferGbmFormat)(MirBuffer* buffer); |
286 | + |
287 | +/** Get the gbm_bo_flags of a MirBuffer |
288 | + * \pre The buffer is suitable for GBM_BO_IMPORT_FD |
289 | + * \param [in] buffer The buffer |
290 | + * \return The gbm_bo_flags of the buffer |
291 | + */ |
292 | +typedef uint32_t (*MirBufferGbmFlags)(MirBuffer* buffer); |
293 | + |
294 | +/** Get the age of a MirBuffer |
295 | + * \pre The buffer is suitable for GBM_BO_IMPORT_FD |
296 | + * \param [in] buffer The buffer |
297 | + * \return The age of the buffer |
298 | + */ |
299 | +typedef unsigned int (*MirBufferGbmAge)(MirBuffer* buffer); |
300 | + |
301 | +typedef struct MirExtensionGbmBufferV2 |
302 | +{ |
303 | + MirConnectionAllocateBufferGbm allocate_buffer_gbm; |
304 | + MirConnectionAllocateBufferGbmSync allocate_buffer_gbm_sync; |
305 | + MirBufferIsGbmImportable is_gbm_importable; |
306 | + MirBufferGbmFd fd; |
307 | + MirBufferGbmStride stride; |
308 | + MirBufferGbmFormat format; |
309 | + MirBufferGbmFlags flags; |
310 | + MirBufferGbmAge age; |
311 | +} MirExtensionGbmBufferV2; |
312 | + |
313 | +static inline MirExtensionGbmBufferV2 const* mir_extension_gbm_buffer_v2( |
314 | + MirConnection* connection) |
315 | +{ |
316 | + return (MirExtensionGbmBufferV2 const*) mir_connection_request_extension( |
317 | + connection, "mir_extension_gbm_buffer", 2); |
318 | +} |
319 | + |
320 | +>>>>>>> MERGE-SOURCE |
321 | #ifdef __cplusplus |
322 | } |
323 | #endif |
324 | |
325 | === modified file 'include/client/mir_toolkit/mir_buffer_stream.h' |
326 | --- include/client/mir_toolkit/mir_buffer_stream.h 2017-05-23 00:22:04 +0000 |
327 | +++ include/client/mir_toolkit/mir_buffer_stream.h 2017-05-26 09:20:21 +0000 |
328 | @@ -155,9 +155,17 @@ |
329 | * \return One of mir_platform_type_android or |
330 | * mir_platform_type_gbm |
331 | */ |
332 | +<<<<<<< TREE |
333 | MirPlatformType mir_buffer_stream_get_platform_type(MirBufferStream *stream) |
334 | MIR_FOR_REMOVAL_IN_VERSION_1("To identify the graphics platform use mir_connection_get_graphics_module(). \n" |
335 | "To safely interpret the buffer contents use mir_buffer_stream_get_graphics_region()"); |
336 | +======= |
337 | +/// @cond |
338 | +MIR_FOR_REMOVAL_IN_VERSION_1("To identify the graphics platform use mir_connection_get_graphics_module(). \n" |
339 | + "To safely interpret the buffer contents use mir_buffer_stream_get_graphics_region()") |
340 | +/// @endcond |
341 | +MirPlatformType mir_buffer_stream_get_platform_type(MirBufferStream *stream); |
342 | +>>>>>>> MERGE-SOURCE |
343 | |
344 | /** |
345 | * Retrieve the current buffer in "raw" representation. |
346 | |
347 | === modified file 'include/client/mir_toolkit/mir_connection.h' |
348 | === modified file 'include/client/mir_toolkit/mir_cursor_configuration.h' |
349 | --- include/client/mir_toolkit/mir_cursor_configuration.h 2017-05-23 00:22:04 +0000 |
350 | +++ include/client/mir_toolkit/mir_cursor_configuration.h 2017-05-26 09:20:21 +0000 |
351 | @@ -20,7 +20,17 @@ |
352 | |
353 | #include <mir_toolkit/common.h> |
354 | #include <mir_toolkit/client_types.h> |
355 | -#include <mir_toolkit/deprecations.h> |
356 | +<<<<<<< TREE |
357 | +#include <mir_toolkit/deprecations.h> |
358 | +======= |
359 | +#include <mir_toolkit/deprecations.h> |
360 | + |
361 | +/** |
362 | + * Opaque structure containing cursor parameterization. Create with mir_cursor* family. |
363 | + * Used with mir_window_configure_cursor. |
364 | + */ |
365 | +typedef struct MirCursorConfiguration MirCursorConfiguration; |
366 | +>>>>>>> MERGE-SOURCE |
367 | |
368 | #ifdef __cplusplus |
369 | /** |
370 | @@ -51,8 +61,15 @@ |
371 | * \return A cursor parameters object which must be passed |
372 | * to_mir_cursor_configuration_destroy |
373 | */ |
374 | +<<<<<<< TREE |
375 | MirCursorConfiguration *mir_cursor_configuration_from_name(char const* name) |
376 | MIR_FOR_REMOVAL_IN_VERSION_1("Use mir_window_spec_set_cursor_name() instead"); |
377 | +======= |
378 | +/// @cond |
379 | +MIR_FOR_REMOVAL_IN_VERSION_1("use mir_window_spec_set_cursor_name()") |
380 | +/// @endcond |
381 | +MirCursorConfiguration *mir_cursor_configuration_from_name(char const* name); |
382 | +>>>>>>> MERGE-SOURCE |
383 | |
384 | /** |
385 | * Returns a new cursor configuration tied to a given buffer stream. |
386 | |
387 | === modified file 'include/client/mir_toolkit/mir_display_configuration.h' |
388 | === modified file 'include/client/mir_toolkit/mir_window.h' |
389 | --- include/client/mir_toolkit/mir_window.h 2017-05-23 00:22:04 +0000 |
390 | +++ include/client/mir_toolkit/mir_window.h 2017-05-26 09:20:21 +0000 |
391 | @@ -585,8 +585,37 @@ |
392 | */ |
393 | void mir_window_spec_set_streams(MirWindowSpec* spec, |
394 | MirBufferStreamInfo* streams, |
395 | +<<<<<<< TREE |
396 | unsigned int num_streams) |
397 | MIR_FOR_REMOVAL_IN_VERSION_1("Use mir_window_spec_add_render_surface instead"); |
398 | +======= |
399 | + unsigned int num_streams); |
400 | + |
401 | +/** |
402 | + * Set the MirWindowSpec to display content contained in a render surface |
403 | + * |
404 | + * \warning: The initial call to mir_window_spec_add_render_surface will set |
405 | + * the bottom-most content, and subsequent calls will stack the |
406 | + * content on top. |
407 | + * |
408 | + * \param spec The window_spec to be updated |
409 | + * \param render_surface The render surface containing the content to be displayed |
410 | + * \param logical_width The width that the content will be displayed at |
411 | + * (Ignored for buffer streams) |
412 | + * \param logical_height The height that the content will be displayed at |
413 | + * (Ignored for buffer streams) |
414 | + * \param displacement_x The x displacement from the top-left corner of the MirWindow |
415 | + * \param displacement_y The y displacement from the top-left corner of the MirWindow |
416 | + */ |
417 | +#pragma GCC diagnostic push |
418 | +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" |
419 | +void mir_window_spec_add_render_surface(MirWindowSpec* spec, |
420 | + MirRenderSurface* render_surface, |
421 | + int logical_width, int logical_height, |
422 | + int displacement_x, int displacement_y) |
423 | +MIR_FOR_REMOVAL_IN_VERSION_1("This function is slated for rename due to MirRenderSurface-->MirSurface transition"); |
424 | +#pragma GCC diagnostic pop |
425 | +>>>>>>> MERGE-SOURCE |
426 | |
427 | /** |
428 | * Release the resources held by a MirWindowSpec. |
429 | |
430 | === modified file 'include/client/mir_toolkit/rs/mir_render_surface.h' |
431 | --- include/client/mir_toolkit/rs/mir_render_surface.h 2017-05-23 00:22:04 +0000 |
432 | +++ include/client/mir_toolkit/rs/mir_render_surface.h 2017-05-26 09:20:21 +0000 |
433 | @@ -21,6 +21,7 @@ |
434 | #define MIR_TOOLKIT_MIR_RENDER_SURFACE_H_ |
435 | |
436 | #include <mir_toolkit/client_types.h> |
437 | +<<<<<<< TREE |
438 | #include <mir_toolkit/deprecations.h> |
439 | |
440 | #ifndef MIR_DEPRECATE_RENDERSURFACES |
441 | @@ -33,6 +34,20 @@ |
442 | #else |
443 | #define MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1 |
444 | #endif |
445 | +======= |
446 | +#include <mir_toolkit/deprecations.h> |
447 | + |
448 | +#ifndef MIR_DEPRECATE_RENDERSURFACES |
449 | + #define MIR_DEPRECATE_RENDERSURFACES 0 |
450 | +#endif |
451 | + |
452 | +#if MIR_ENABLE_DEPRECATIONS > 0 && MIR_DEPRECATE_RENDERSURFACES > 0 |
453 | + #define MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME\ |
454 | + __attribute__((deprecated("This function is slated for rename due to MirRenderSurface-->MirSurface transition"))) |
455 | +#else |
456 | + #define MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME |
457 | +#endif |
458 | +>>>>>>> MERGE-SOURCE |
459 | |
460 | #ifdef __cplusplus |
461 | /** |
462 | @@ -42,9 +57,15 @@ |
463 | extern "C" { |
464 | #endif |
465 | |
466 | +<<<<<<< TREE |
467 | typedef void (*MirRenderSurfaceCallback)(MirRenderSurface*, void* context) |
468 | MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1; |
469 | |
470 | +======= |
471 | +typedef void (*MirRenderSurfaceCallback)(MirRenderSurface*, void* context) |
472 | +MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME; |
473 | + |
474 | +>>>>>>> MERGE-SOURCE |
475 | #pragma GCC diagnostic push |
476 | #pragma GCC diagnostic ignored "-Wdeprecated-declarations" |
477 | /** |
478 | @@ -64,7 +85,11 @@ |
479 | int width, int height, |
480 | MirRenderSurfaceCallback callback, |
481 | void* context) |
482 | +<<<<<<< TREE |
483 | MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1; |
484 | +======= |
485 | +MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME; |
486 | +>>>>>>> MERGE-SOURCE |
487 | |
488 | /** |
489 | * Create a render surface and wait for the result |
490 | @@ -79,7 +104,11 @@ |
491 | MirRenderSurface* mir_connection_create_render_surface_sync( |
492 | MirConnection* connection, |
493 | int width, int height) |
494 | +<<<<<<< TREE |
495 | MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1; |
496 | +======= |
497 | +MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME; |
498 | +>>>>>>> MERGE-SOURCE |
499 | |
500 | /** |
501 | * Get the size of the MirRenderSurface |
502 | @@ -91,7 +120,11 @@ |
503 | void mir_render_surface_get_size( |
504 | MirRenderSurface* render_surface, |
505 | int* width, int* height) |
506 | +<<<<<<< TREE |
507 | MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1; |
508 | +======= |
509 | +MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME; |
510 | +>>>>>>> MERGE-SOURCE |
511 | |
512 | /** |
513 | * Set the size of the MirRenderSurface |
514 | @@ -103,7 +136,11 @@ |
515 | void mir_render_surface_set_size( |
516 | MirRenderSurface* render_surface, |
517 | int width, int height) |
518 | +<<<<<<< TREE |
519 | MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1; |
520 | +======= |
521 | +MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME; |
522 | +>>>>>>> MERGE-SOURCE |
523 | |
524 | /** |
525 | * Test for a valid render surface |
526 | @@ -115,8 +152,12 @@ |
527 | */ |
528 | bool mir_render_surface_is_valid( |
529 | MirRenderSurface* render_surface) |
530 | +<<<<<<< TREE |
531 | MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1; |
532 | |
533 | +======= |
534 | +MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME; |
535 | +>>>>>>> MERGE-SOURCE |
536 | /** |
537 | * Retrieve a text description of the error. The returned string is owned by |
538 | * the library and remains valid until the render surface or the associated |
539 | @@ -128,7 +169,11 @@ |
540 | */ |
541 | char const *mir_render_surface_get_error_message( |
542 | MirRenderSurface* render_surface) |
543 | +<<<<<<< TREE |
544 | MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1; |
545 | +======= |
546 | +MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME; |
547 | +>>>>>>> MERGE-SOURCE |
548 | |
549 | /** |
550 | * Release the specified render surface |
551 | @@ -137,7 +182,11 @@ |
552 | */ |
553 | void mir_render_surface_release( |
554 | MirRenderSurface* render_surface) |
555 | +<<<<<<< TREE |
556 | MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1; |
557 | +======= |
558 | +MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME; |
559 | +>>>>>>> MERGE-SOURCE |
560 | |
561 | /** |
562 | * Obtain the buffer stream backing a given render surface. |
563 | @@ -157,7 +206,11 @@ |
564 | MirRenderSurface* render_surface, |
565 | int width, int height, |
566 | MirPixelFormat format) |
567 | +<<<<<<< TREE |
568 | MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1; |
569 | +======= |
570 | +MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME; |
571 | +>>>>>>> MERGE-SOURCE |
572 | |
573 | /** |
574 | * Obtain the presentation chain backing a given render surface. |
575 | @@ -170,6 +223,7 @@ |
576 | */ |
577 | MirPresentationChain* mir_render_surface_get_presentation_chain( |
578 | MirRenderSurface* render_surface) |
579 | +<<<<<<< TREE |
580 | MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1; |
581 | |
582 | /** Query whether the server supports a given presentation mode. |
583 | @@ -191,6 +245,29 @@ |
584 | */ |
585 | void mir_presentation_chain_set_mode( |
586 | MirPresentationChain* chain, MirPresentMode mode); |
587 | +======= |
588 | +MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME; |
589 | + |
590 | +/** Query whether the server supports a given presentation mode. |
591 | + * |
592 | + * \param [in] connection The connection |
593 | + * \param [in] mode The MirPresentMode |
594 | + * \return True if supported, false if not |
595 | + */ |
596 | +bool mir_connection_present_mode_supported( |
597 | + MirConnection* connection, MirPresentMode mode); |
598 | + |
599 | +/** Respecify the submission mode that the MirPresentationChain is operating with. |
600 | + * The buffers currently queued will immediately be requeued according |
601 | + * to the new mode. |
602 | + * |
603 | + * \pre mir_connection_present_mode_supported must indicate that the mode is supported |
604 | + * \param [in] chain The chain |
605 | + * \param [in] mode The mode to change to |
606 | + */ |
607 | +void mir_presentation_chain_set_mode( |
608 | + MirPresentationChain* chain, MirPresentMode mode); |
609 | +>>>>>>> MERGE-SOURCE |
610 | |
611 | /** |
612 | * Set the MirWindowSpec to contain a specific cursor. |
613 | @@ -204,6 +281,7 @@ |
614 | MirWindowSpec* spec, |
615 | MirRenderSurface* render_surface, |
616 | int hotspot_x, int hotspot_y) |
617 | +<<<<<<< TREE |
618 | MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1; |
619 | |
620 | /** |
621 | @@ -243,6 +321,31 @@ |
622 | int logical_width, int logical_height, |
623 | int displacement_x, int displacement_y) |
624 | MIR_RENDERSURFACES_FOR_RENAME_IN_VERSION_1; |
625 | +======= |
626 | +MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME; |
627 | + |
628 | +/** |
629 | + * Set the MirWindowSpec to display content contained in a render surface |
630 | + * |
631 | + * \warning: The initial call to mir_window_spec_add_render_surface will set |
632 | + * the bottom-most content, and subsequent calls will stack the |
633 | + * content on top. |
634 | + * |
635 | + * \param spec The window_spec to be updated |
636 | + * \param render_surface The render surface containing the content to be displayed |
637 | + * \param logical_width The width that the content will be displayed at |
638 | + * (Ignored for buffer streams) |
639 | + * \param logical_height The height that the content will be displayed at |
640 | + * (Ignored for buffer streams) |
641 | + * \param displacement_x The x displacement from the top-left corner of the MirWindow |
642 | + * \param displacement_y The y displacement from the top-left corner of the MirWindow |
643 | + */ |
644 | +void mir_window_spec_add_render_surface(MirWindowSpec* spec, |
645 | + MirRenderSurface* render_surface, |
646 | + int logical_width, int logical_height, |
647 | + int displacement_x, int displacement_y) |
648 | +MIR_DEPRECATE_RENDERSURFACES_FOR_RENAME; |
649 | +>>>>>>> MERGE-SOURCE |
650 | |
651 | #pragma GCC diagnostic pop |
652 | |
653 | |
654 | === modified file 'include/core/mir_toolkit/deprecations.h' |
655 | --- include/core/mir_toolkit/deprecations.h 2017-05-16 16:10:46 +0000 |
656 | +++ include/core/mir_toolkit/deprecations.h 2017-05-26 09:20:21 +0000 |
657 | @@ -1,3 +1,4 @@ |
658 | +<<<<<<< TREE |
659 | /* |
660 | * Copyright © 2017 Canonical Ltd. |
661 | * |
662 | @@ -34,3 +35,41 @@ |
663 | #endif |
664 | |
665 | #endif //MIR_DEPRECATIONS_H_ |
666 | +======= |
667 | +/* |
668 | + * Copyright © 2017 Canonical Ltd. |
669 | + * |
670 | + * This program is free software: you can redistribute it and/or modify it |
671 | + * under the terms of the GNU Lesser General Public License version 3, |
672 | + * as published by the Free Software Foundation. |
673 | + * |
674 | + * This program is distributed in the hope that it will be useful, |
675 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
676 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
677 | + * GNU Lesser General Public License for more details. |
678 | + * |
679 | + * You should have received a copy of the GNU Lesser General Public License |
680 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. |
681 | + */ |
682 | + |
683 | +#ifndef MIR_DEPRECATIONS_H_ |
684 | +#define MIR_DEPRECATIONS_H_ |
685 | + |
686 | +#ifndef MIR_ENABLE_DEPRECATIONS |
687 | + // use g++ version < 6.2 as a proxy for building on Ubunutu 16.04LTS ("Xenial") or 16.10 (Yakkety) |
688 | + #if defined(__clang__) || !defined(__GNUC__) || (__GNUC__ > 6) || ((__GNUC__ == 6) && (__GNUC_MINOR__ >= 2)) |
689 | + #define MIR_ENABLE_DEPRECATIONS 1 |
690 | + #else |
691 | + #define MIR_ENABLE_DEPRECATIONS 0 |
692 | + #endif |
693 | +#endif |
694 | + |
695 | +#if MIR_ENABLE_DEPRECATIONS > 0 |
696 | + #define MIR_FOR_REMOVAL_IN_VERSION_1(message)\ |
697 | + __attribute__((deprecated(message))) |
698 | +#else |
699 | + #define MIR_FOR_REMOVAL_IN_VERSION_1(message) |
700 | +#endif |
701 | + |
702 | +#endif //MIR_DEPRECATIONS_H_ |
703 | +>>>>>>> MERGE-SOURCE |
704 | |
705 | === modified file 'src/client/display_configuration_api.cpp' |
706 | === modified file 'src/client/mir_render_surface_api.cpp' |
707 | === modified file 'src/client/symbols.map' |
708 | === modified file 'src/platform/options/default_configuration.cpp' |
709 | === added directory 'src/platforms/android' |
710 | === added directory 'src/platforms/android/utils' |
711 | === added file 'src/platforms/android/utils/CMakeLists.txt.OTHER' |
712 | --- src/platforms/android/utils/CMakeLists.txt.OTHER 1970-01-01 00:00:00 +0000 |
713 | +++ src/platforms/android/utils/CMakeLists.txt.OTHER 2017-05-26 09:20:21 +0000 |
714 | @@ -0,0 +1,46 @@ |
715 | +list( |
716 | + APPEND ANDROID_DIAGNOSTICS_SRCS |
717 | + ${CMAKE_CURRENT_SOURCE_DIR}/test_android_hardware_sanity.cpp |
718 | + ${CMAKE_CURRENT_SOURCE_DIR}/patterns.cpp |
719 | +) |
720 | + |
721 | +add_definitions(-DMIR_SERVER_GRAPHICS_PLATFORM_VERSION="${MIR_SERVER_GRAPHICS_PLATFORM_VERSION}") |
722 | + |
723 | +include_directories( |
724 | + ${PROJECT_SOURCE_DIR}/include/server |
725 | + ${PROJECT_SOURCE_DIR}/include/client |
726 | + ${PROJECT_SOURCE_DIR}/include/platform |
727 | + ${PROJECT_SOURCE_DIR}/src/include/common |
728 | + ${PROJECT_SOURCE_DIR}/include/test |
729 | + ${PROJECT_SOURCE_DIR}/tests/include |
730 | + ${PROJECT_SOURCE_DIR}/src/include/server |
731 | + ${PROJECT_SOURCE_DIR}/examples |
732 | + ${PROJECT_SOURCE_DIR}/src/platforms/android/include |
733 | +) |
734 | + |
735 | +add_executable( |
736 | + mir_android_diagnostics |
737 | + ${ANDROID_DIAGNOSTICS_SRCS}) |
738 | + |
739 | +target_link_libraries( |
740 | + mir_android_diagnostics |
741 | + mirserver |
742 | + mirdraw |
743 | + mir-test-static |
744 | + mir-test-framework-static |
745 | + ${LIBHARDWARE_LIBRARIES} |
746 | +) |
747 | + |
748 | +mir_add_wrapped_executable(mir_demo_standalone_render_overlays |
749 | + render_overlays.cpp |
750 | +) |
751 | + |
752 | +target_link_libraries(mir_demo_standalone_render_overlays |
753 | + mirclient |
754 | + mircommon |
755 | + mirplatform |
756 | +) |
757 | + |
758 | +install(PROGRAMS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/mir_android_diagnostics |
759 | + DESTINATION ${CMAKE_INSTALL_BINDIR} |
760 | +) |
761 | |
762 | === modified file 'src/platforms/mesa/client/client_platform.cpp' |
763 | --- src/platforms/mesa/client/client_platform.cpp 2017-05-17 04:48:46 +0000 |
764 | +++ src/platforms/mesa/client/client_platform.cpp 2017-05-26 09:20:21 +0000 |
765 | @@ -21,9 +21,15 @@ |
766 | #include "client_buffer_factory.h" |
767 | #include "mesa_native_display_container.h" |
768 | #include "native_surface.h" |
769 | +<<<<<<< TREE |
770 | #include "mir/client/client_buffer_factory.h" |
771 | #include "mir/client/client_context.h" |
772 | #include "mir/client/client_buffer.h" |
773 | +======= |
774 | +#include "mir/client_buffer_factory.h" |
775 | +#include "mir/client_context.h" |
776 | +#include "mir/client_buffer.h" |
777 | +>>>>>>> MERGE-SOURCE |
778 | #include "mir/mir_render_surface.h" |
779 | #include "mir/mir_buffer.h" |
780 | #include "mir/weak_egl.h" |
781 | @@ -138,6 +144,7 @@ |
782 | available_callback, available_context); |
783 | } |
784 | |
785 | +<<<<<<< TREE |
786 | void allocate_buffer_gbm_legacy( |
787 | MirConnection* connection, |
788 | int width, int height, |
789 | @@ -283,6 +290,144 @@ |
790 | { |
791 | return 0; |
792 | } |
793 | +======= |
794 | +void allocate_buffer_gbm_legacy( |
795 | + MirConnection* connection, |
796 | + int width, int height, |
797 | + unsigned int gbm_pixel_format, |
798 | + unsigned int gbm_bo_flags, |
799 | + MirBufferCallback available_callback, void* available_context) |
800 | +{ |
801 | + allocate_buffer_gbm( |
802 | + connection, static_cast<uint32_t>(width), static_cast<uint32_t>(height), |
803 | + static_cast<uint32_t>(gbm_pixel_format), static_cast<uint32_t>(gbm_bo_flags), |
804 | + available_callback, available_context); |
805 | +} |
806 | + |
807 | +MirBuffer* allocate_buffer_gbm_sync( |
808 | + MirConnection* connection, |
809 | + uint32_t width, uint32_t height, |
810 | + uint32_t gbm_pixel_format, |
811 | + uint32_t gbm_bo_flags) |
812 | +try |
813 | +{ |
814 | + struct BufferSync |
815 | + { |
816 | + void set_buffer(MirBuffer* b) |
817 | + { |
818 | + std::unique_lock<decltype(mutex)> lk(mutex); |
819 | + buffer = b; |
820 | + cv.notify_all(); |
821 | + } |
822 | + |
823 | + MirBuffer* wait_for_buffer() |
824 | + { |
825 | + std::unique_lock<decltype(mutex)> lk(mutex); |
826 | + cv.wait(lk, [this]{ return buffer; }); |
827 | + return buffer; |
828 | + } |
829 | + private: |
830 | + std::mutex mutex; |
831 | + std::condition_variable cv; |
832 | + MirBuffer* buffer = nullptr; |
833 | + } sync; |
834 | + |
835 | + allocate_buffer_gbm( |
836 | + connection, width, height, gbm_pixel_format, gbm_bo_flags, |
837 | + [](auto* b, auto* context){ reinterpret_cast<BufferSync*>(context)->set_buffer(b); }, &sync); |
838 | + return sync.wait_for_buffer(); |
839 | +} |
840 | +catch (...) |
841 | +{ |
842 | + return nullptr; |
843 | +} |
844 | + |
845 | +bool is_gbm_importable(MirBuffer* b) |
846 | +try |
847 | +{ |
848 | + if (!b) |
849 | + return false; |
850 | + auto buffer = reinterpret_cast<mcl::MirBuffer*>(b); |
851 | + auto native = dynamic_cast<mgm::NativeBuffer*>(buffer->client_buffer()->native_buffer_handle().get()); |
852 | + if (!native) |
853 | + return false; |
854 | + return native->is_gbm_buffer; |
855 | +} |
856 | +catch (...) |
857 | +{ |
858 | + return false; |
859 | +} |
860 | + |
861 | +int import_fd(MirBuffer* b) |
862 | +try |
863 | +{ |
864 | + if (!is_gbm_importable(b)) |
865 | + return -1; |
866 | + auto buffer = reinterpret_cast<mcl::MirBuffer*>(b); |
867 | + auto native = dynamic_cast<mgm::NativeBuffer*>(buffer->client_buffer()->native_buffer_handle().get()); |
868 | + return native->fd[0]; |
869 | +} |
870 | +catch (...) |
871 | +{ |
872 | + return -1; |
873 | +} |
874 | + |
875 | +uint32_t buffer_stride(MirBuffer* b) |
876 | +try |
877 | +{ |
878 | + if (!is_gbm_importable(b)) |
879 | + return 0; |
880 | + auto buffer = reinterpret_cast<mcl::MirBuffer*>(b); |
881 | + auto native = dynamic_cast<mgm::NativeBuffer*>(buffer->client_buffer()->native_buffer_handle().get()); |
882 | + return native->stride; |
883 | +} |
884 | +catch (...) |
885 | +{ |
886 | + return 0; |
887 | +} |
888 | + |
889 | +uint32_t buffer_format(MirBuffer* b) |
890 | +try |
891 | +{ |
892 | + if (!is_gbm_importable(b)) |
893 | + return 0; |
894 | + auto buffer = reinterpret_cast<mcl::MirBuffer*>(b); |
895 | + auto native = dynamic_cast<mgm::NativeBuffer*>(buffer->client_buffer()->native_buffer_handle().get()); |
896 | + return native->native_format; |
897 | +} |
898 | +catch (...) |
899 | +{ |
900 | + return 0; |
901 | +} |
902 | + |
903 | +uint32_t buffer_flags(MirBuffer* b) |
904 | +try |
905 | +{ |
906 | + if (!is_gbm_importable(b)) |
907 | + return 0; |
908 | + auto buffer = reinterpret_cast<mcl::MirBuffer*>(b); |
909 | + auto native = dynamic_cast<mgm::NativeBuffer*>(buffer->client_buffer()->native_buffer_handle().get()); |
910 | + return native->native_flags; |
911 | +} |
912 | +catch (...) |
913 | +{ |
914 | + return 0; |
915 | +} |
916 | + |
917 | +unsigned int buffer_age(MirBuffer* b) |
918 | +try |
919 | +{ |
920 | + if (!is_gbm_importable(b)) |
921 | + return 0; |
922 | + auto buffer = reinterpret_cast<mcl::MirBuffer*>(b); |
923 | + auto native = dynamic_cast<mgm::NativeBuffer*>(buffer->client_buffer()->native_buffer_handle().get()); |
924 | + return native->age; |
925 | +} |
926 | +catch (...) |
927 | +{ |
928 | + return 0; |
929 | +} |
930 | +>>>>>>> MERGE-SOURCE |
931 | #pragma GCC diagnostic push |
932 | #pragma GCC diagnostic ignored "-Wdeprecated-declarations" |
933 | MirBufferStream* get_hw_stream( |
934 | |
935 | === modified file 'src/platforms/mesa/client/client_platform.h' |
936 | === modified file 'src/platforms/mesa/server/kms/real_kms_display_configuration.cpp' |
937 | --- src/platforms/mesa/server/kms/real_kms_display_configuration.cpp 2017-05-08 03:04:26 +0000 |
938 | +++ src/platforms/mesa/server/kms/real_kms_display_configuration.cpp 2017-05-26 09:20:21 +0000 |
939 | @@ -142,6 +142,7 @@ |
940 | |
941 | void mgm::RealKMSDisplayConfiguration::update() |
942 | { |
943 | +<<<<<<< TREE |
944 | decltype(outputs) new_outputs; |
945 | |
946 | displays->update_from_hardware_state(); |
947 | @@ -180,6 +181,219 @@ |
948 | * to provide a max_simultaneous_outputs value that is useful to clients. |
949 | */ |
950 | card.max_simultaneous_outputs = outputs.size(); |
951 | +======= |
952 | + kms::DRMModeResources resources{drm_fd}; |
953 | + |
954 | + size_t max_outputs = std::min(resources.num_crtcs(), resources.num_connectors()); |
955 | + card = {DisplayConfigurationCardId{0}, max_outputs}; |
956 | + |
957 | + resources.for_each_connector([&](kms::DRMModeConnectorUPtr connector) |
958 | + { |
959 | + add_or_update_output(resources, *connector); |
960 | + }); |
961 | +} |
962 | + |
963 | +namespace |
964 | +{ |
965 | +std::vector<uint8_t> edid_for_connector(int drm_fd, uint32_t connector_id) |
966 | +{ |
967 | + std::vector<uint8_t> edid; |
968 | + |
969 | + mgk::ObjectProperties connector_props{ |
970 | + drm_fd, connector_id, DRM_MODE_OBJECT_CONNECTOR}; |
971 | + |
972 | + if (connector_props.has_property("EDID")) |
973 | + { |
974 | + /* |
975 | + * We don't technically need the property information here, but query it |
976 | + * anyway so we can detect if our assumptions about DRM behaviour |
977 | + * become invalid. |
978 | + */ |
979 | + auto property = mgk::DRMModePropertyUPtr{ |
980 | + drmModeGetProperty(drm_fd, connector_props.id_for("EDID")), |
981 | + &drmModeFreeProperty}; |
982 | + |
983 | + if (!property) |
984 | + { |
985 | + mir::log_warning( |
986 | + "Failed to get EDID property for connector %u: %i (%s)", |
987 | + connector_id, |
988 | + errno, |
989 | + ::strerror(errno)); |
990 | + return edid; |
991 | + } |
992 | + |
993 | + if (!drm_property_type_is(property.get(), DRM_MODE_PROP_BLOB)) |
994 | + { |
995 | + mir::log_warning( |
996 | + "EDID property on connector %u has unexpected type %u", |
997 | + connector_id, |
998 | + property->flags); |
999 | + return edid; |
1000 | + } |
1001 | + |
1002 | + // A property ID of 0 means invalid. |
1003 | + if (connector_props["EDID"] == 0) |
1004 | + { |
1005 | + /* |
1006 | + * Log a debug message only. This will trigger for broken monitors which |
1007 | + * don't provide an EDID, which is not as unusual as you might think... |
1008 | + */ |
1009 | + mir::log_debug("No EDID data available on connector %u", connector_id); |
1010 | + return edid; |
1011 | + } |
1012 | + |
1013 | + auto blob = drmModeGetPropertyBlob(drm_fd, connector_props["EDID"]); |
1014 | + |
1015 | + if (!blob) |
1016 | + { |
1017 | + mir::log_warning( |
1018 | + "Failed to get EDID property blob for connector %u: %i (%s)", |
1019 | + connector_id, |
1020 | + errno, |
1021 | + ::strerror(errno)); |
1022 | + |
1023 | + return edid; |
1024 | + } |
1025 | + |
1026 | + edid.reserve(blob->length); |
1027 | + edid.insert(edid.begin(), |
1028 | + reinterpret_cast<uint8_t*>(blob->data), |
1029 | + reinterpret_cast<uint8_t*>(blob->data) + blob->length); |
1030 | + |
1031 | + drmModeFreePropertyBlob(blob); |
1032 | + |
1033 | + edid.shrink_to_fit(); |
1034 | + } |
1035 | + |
1036 | + return edid; |
1037 | +} |
1038 | +} |
1039 | + |
1040 | +void mgm::RealKMSDisplayConfiguration::add_or_update_output( |
1041 | + kms::DRMModeResources const& resources, |
1042 | + drmModeConnector const& connector) |
1043 | +{ |
1044 | + DisplayConfigurationOutputId id{static_cast<int>(connector.connector_id)}; |
1045 | + DisplayConfigurationCardId card_id{0}; |
1046 | + DisplayConfigurationOutputType const type{ |
1047 | + kms_connector_type_to_output_type(connector.connector_type)}; |
1048 | + geom::Size physical_size{connector.mmWidth, connector.mmHeight}; |
1049 | + bool connected{connector.connection == DRM_MODE_CONNECTED}; |
1050 | + uint32_t const invalid_mode_index = std::numeric_limits<uint32_t>::max(); |
1051 | + uint32_t current_mode_index{invalid_mode_index}; |
1052 | + uint32_t preferred_mode_index{invalid_mode_index}; |
1053 | + std::vector<DisplayConfigurationMode> modes; |
1054 | + std::vector<MirPixelFormat> formats {mir_pixel_format_argb_8888, |
1055 | + mir_pixel_format_xrgb_8888}; |
1056 | + |
1057 | + std::vector<uint8_t> edid; |
1058 | + if (connected) |
1059 | + { |
1060 | + /* Only ask for the EDID on connected outputs. There's obviously no monitor EDID |
1061 | + * when there is no monitor connected! |
1062 | + */ |
1063 | + edid = edid_for_connector(drm_fd, connector.connector_id); |
1064 | + } |
1065 | + |
1066 | + drmModeModeInfo current_mode_info = drmModeModeInfo(); |
1067 | + GammaCurves gamma; |
1068 | + |
1069 | + /* Get information about the current mode */ |
1070 | + if (connector.encoder_id) |
1071 | + { |
1072 | + auto encoder = resources.encoder(connector.encoder_id); |
1073 | + if (encoder->crtc_id) |
1074 | + { |
1075 | + current_mode_info = resources.crtc(encoder->crtc_id)->mode; |
1076 | + |
1077 | + auto crtc = resources.crtc(encoder->crtc_id); |
1078 | + if (crtc->gamma_size > 0) |
1079 | + gamma = mg::LinearGammaLUTs(crtc->gamma_size); |
1080 | + } |
1081 | + } |
1082 | + |
1083 | + /* Add all the available modes and find the current and preferred one */ |
1084 | + for (int m = 0; m < connector.count_modes; m++) |
1085 | + { |
1086 | + drmModeModeInfo& mode_info = connector.modes[m]; |
1087 | + |
1088 | + geom::Size size{mode_info.hdisplay, mode_info.vdisplay}; |
1089 | + |
1090 | + double vrefresh_hz = calculate_vrefresh_hz(mode_info); |
1091 | + |
1092 | + modes.push_back({size, vrefresh_hz}); |
1093 | + |
1094 | + if (kms_modes_are_equal(mode_info, current_mode_info)) |
1095 | + current_mode_index = m; |
1096 | + |
1097 | + if ((mode_info.type & DRM_MODE_TYPE_PREFERRED) == DRM_MODE_TYPE_PREFERRED) |
1098 | + preferred_mode_index = m; |
1099 | + } |
1100 | + |
1101 | + /* Add or update the output */ |
1102 | + auto iter = find_output_with_id(id); |
1103 | + |
1104 | + if (iter == outputs.end()) |
1105 | + { |
1106 | + outputs.push_back({id, card_id, type, formats, modes, preferred_mode_index, |
1107 | + physical_size, connected, false, geom::Point(), |
1108 | + current_mode_index, mir_pixel_format_xrgb_8888, |
1109 | + mir_power_mode_on, mir_orientation_normal, |
1110 | + 1.0f, mir_form_factor_monitor, |
1111 | + kms_subpixel_to_mir_subpixel(connector.subpixel), |
1112 | + gamma, mir_output_gamma_supported, std::move(edid)}); |
1113 | + } |
1114 | + else |
1115 | + { |
1116 | + auto& output = *iter; |
1117 | + |
1118 | + if (current_mode_index != invalid_mode_index) |
1119 | + { |
1120 | + output.current_mode_index = current_mode_index; |
1121 | + } |
1122 | + else if (!modes.empty() && // If empty retain old current_mode_index! |
1123 | + ( output.current_mode_index >= modes.size() || |
1124 | + output.modes[output.current_mode_index] != |
1125 | + modes[output.current_mode_index])) |
1126 | + { |
1127 | + // current_mode_index is invalid and the definition of the old |
1128 | + // current mode has also changed (different display plugged in) |
1129 | + // so fall back to the preferred mode... |
1130 | + output.current_mode_index = preferred_mode_index; |
1131 | + } |
1132 | + // else output.current_mode_index is correct and unchanged. |
1133 | + |
1134 | + output.modes = modes; |
1135 | + output.preferred_mode_index = preferred_mode_index; |
1136 | + output.physical_size_mm = physical_size; |
1137 | + output.connected = connected; |
1138 | + output.current_format = mir_pixel_format_xrgb_8888; |
1139 | + output.subpixel_arrangement = kms_subpixel_to_mir_subpixel(connector.subpixel); |
1140 | + output.gamma = gamma; |
1141 | + output.edid = edid; |
1142 | + } |
1143 | +} |
1144 | + |
1145 | +std::vector<mg::DisplayConfigurationOutput>::iterator |
1146 | +mgm::RealKMSDisplayConfiguration::find_output_with_id(mg::DisplayConfigurationOutputId id) |
1147 | +{ |
1148 | + return std::find_if(outputs.begin(), outputs.end(), |
1149 | + [id](DisplayConfigurationOutput const& output) |
1150 | + { |
1151 | + return output.id == id; |
1152 | + }); |
1153 | +} |
1154 | + |
1155 | +std::vector<mg::DisplayConfigurationOutput>::const_iterator |
1156 | +mgm::RealKMSDisplayConfiguration::find_output_with_id(mg::DisplayConfigurationOutputId id) const |
1157 | +{ |
1158 | + return std::find_if(outputs.begin(), outputs.end(), |
1159 | + [id](DisplayConfigurationOutput const& output) |
1160 | + { |
1161 | + return output.id == id; |
1162 | + }); |
1163 | +>>>>>>> MERGE-SOURCE |
1164 | } |
1165 | |
1166 | // Compatibility means conf1 can be attained from conf2 (and vice versa) |
1167 | |
1168 | === modified file 'src/server/compositor/multi_monitor_arbiter.cpp' |
1169 | --- src/server/compositor/multi_monitor_arbiter.cpp 2017-05-25 05:49:36 +0000 |
1170 | +++ src/server/compositor/multi_monitor_arbiter.cpp 2017-05-26 09:20:21 +0000 |
1171 | @@ -65,9 +65,16 @@ |
1172 | |
1173 | auto& last_entry = onscreen_buffers.front(); |
1174 | last_entry.use_count++; |
1175 | +<<<<<<< TREE |
1176 | auto last_entry_buffer = last_entry.buffer; |
1177 | clean_onscreen_buffers(lk); |
1178 | return last_entry_buffer; |
1179 | +======= |
1180 | + auto last_entry_buffer = last_entry.buffer; |
1181 | + if (mode == mc::MultiMonitorMode::multi_monitor_sync) |
1182 | + clean_onscreen_buffers(lk); |
1183 | + return last_entry_buffer; |
1184 | +>>>>>>> MERGE-SOURCE |
1185 | } |
1186 | |
1187 | void mc::MultiMonitorArbiter::compositor_release(std::shared_ptr<mg::Buffer> const& buffer) |
1188 | |
1189 | === modified file 'src/server/frontend/session_mediator.cpp' |
1190 | === modified file 'src/server/graphics/nested/nested_display_configuration.cpp' |
1191 | === modified file 'src/server/input/default_configuration.cpp' |
1192 | === modified file 'src/server/input/default_device.cpp' |
1193 | --- src/server/input/default_device.cpp 2017-05-08 03:04:26 +0000 |
1194 | +++ src/server/input/default_device.cpp 2017-05-26 09:20:21 +0000 |
1195 | @@ -32,6 +32,7 @@ |
1196 | |
1197 | namespace mi = mir::input; |
1198 | |
1199 | +<<<<<<< TREE |
1200 | mi::DefaultDevice::DefaultDevice(MirInputDeviceId id, |
1201 | std::shared_ptr<dispatch::ActionQueue> const& actions, |
1202 | InputDevice& device, |
1203 | @@ -46,6 +47,19 @@ |
1204 | actions{actions}, |
1205 | key_mapper{key_mapper}, |
1206 | device_changed_callback{callback} |
1207 | +======= |
1208 | +mi::DefaultDevice::DefaultDevice(MirInputDeviceId id, |
1209 | + std::shared_ptr<dispatch::ActionQueue> const& actions, |
1210 | + InputDevice& device, |
1211 | + std::shared_ptr<KeyMapper> const& key_mapper) |
1212 | + : device_id{id}, |
1213 | + device{device}, |
1214 | + info(device.get_device_info()), |
1215 | + pointer{device.get_pointer_settings()}, |
1216 | + touchpad{device.get_touchpad_settings()}, |
1217 | + actions{actions}, |
1218 | + key_mapper{key_mapper} |
1219 | +>>>>>>> MERGE-SOURCE |
1220 | { |
1221 | if (contains(info.capabilities, mi::DeviceCapability::keyboard)) |
1222 | { |
1223 | @@ -188,6 +202,7 @@ |
1224 | settings.tap_to_click = conf.tap_to_click(); |
1225 | settings.middle_mouse_button_emulation = conf.middle_mouse_button_emulation(); |
1226 | |
1227 | +<<<<<<< TREE |
1228 | { |
1229 | std::lock_guard<std::mutex> lock(config_mutex); |
1230 | touchpad = settings; |
1231 | @@ -198,6 +213,19 @@ |
1232 | dev->apply_settings(settings); |
1233 | }); |
1234 | } |
1235 | +======= |
1236 | + { |
1237 | + std::lock_guard<std::mutex> lock(config_mutex); |
1238 | + touchpad = settings; |
1239 | + |
1240 | + if (!actions) // device is disabled |
1241 | + return; |
1242 | + actions->enqueue([settings = std::move(settings), dev=&device] |
1243 | + { |
1244 | + dev->apply_settings(settings); |
1245 | + }); |
1246 | + } |
1247 | +>>>>>>> MERGE-SOURCE |
1248 | } |
1249 | |
1250 | mir::optional_value<MirKeyboardConfig> mi::DefaultDevice::keyboard_configuration() const |
1251 | @@ -211,6 +239,7 @@ |
1252 | if (!contains(info.capabilities, mi::DeviceCapability::keyboard)) |
1253 | BOOST_THROW_EXCEPTION(std::invalid_argument("Cannot apply a keyboard configuration")); |
1254 | |
1255 | +<<<<<<< TREE |
1256 | set_keyboard_configuration(conf); |
1257 | device_changed_callback(this); |
1258 | } |
1259 | @@ -220,8 +249,14 @@ |
1260 | std::lock_guard<std::mutex> lock(config_mutex); |
1261 | if (!actions) // device is disabled |
1262 | return; |
1263 | +======= |
1264 | + std::lock_guard<std::mutex> lock(config_mutex); |
1265 | + if (!actions) // device is disabled |
1266 | + return; |
1267 | +>>>>>>> MERGE-SOURCE |
1268 | if (keyboard.value().device_keymap() != conf.device_keymap()) |
1269 | keyboard = conf; |
1270 | +<<<<<<< TREE |
1271 | else |
1272 | return; |
1273 | key_mapper->set_keymap_for_device(device_id, conf.device_keymap()); |
1274 | @@ -263,6 +298,17 @@ |
1275 | dev->apply_settings(settings); |
1276 | }); |
1277 | } |
1278 | +======= |
1279 | + else |
1280 | + return; |
1281 | + key_mapper->set_keymap_for_device(device_id, conf.device_keymap()); |
1282 | +} |
1283 | + |
1284 | +void mi::DefaultDevice::disable_queue() |
1285 | +{ |
1286 | + std::lock_guard<std::mutex> lock(config_mutex); |
1287 | + actions.reset(); |
1288 | +>>>>>>> MERGE-SOURCE |
1289 | } |
1290 | |
1291 | MirInputDevice mi::DefaultDevice::config() const |
1292 | |
1293 | === modified file 'src/server/input/default_device.h' |
1294 | --- src/server/input/default_device.h 2017-05-08 03:04:26 +0000 |
1295 | +++ src/server/input/default_device.h 2017-05-26 09:20:21 +0000 |
1296 | @@ -30,8 +30,12 @@ |
1297 | #include "mir/optional_value.h" |
1298 | |
1299 | #include <memory> |
1300 | +<<<<<<< TREE |
1301 | #include <functional> |
1302 | #include <mutex> |
1303 | +======= |
1304 | +#include <mutex> |
1305 | +>>>>>>> MERGE-SOURCE |
1306 | |
1307 | namespace mir |
1308 | { |
1309 | @@ -74,11 +78,15 @@ |
1310 | void apply_touchpad_configuration(MirTouchpadConfig const&) override; |
1311 | optional_value<MirKeyboardConfig> keyboard_configuration() const override; |
1312 | void apply_keyboard_configuration(MirKeyboardConfig const&) override; |
1313 | +<<<<<<< TREE |
1314 | optional_value<MirTouchscreenConfig> touchscreen_configuration() const override; |
1315 | void apply_touchscreen_configuration(MirTouchscreenConfig const&) override; |
1316 | |
1317 | MirInputDevice config() const; |
1318 | void disable_queue(); |
1319 | +======= |
1320 | + void disable_queue(); |
1321 | +>>>>>>> MERGE-SOURCE |
1322 | private: |
1323 | void set_pointer_configuration(MirPointerConfig const&); |
1324 | void set_touchpad_configuration(MirTouchpadConfig const&); |
1325 | @@ -92,11 +100,19 @@ |
1326 | optional_value<PointerSettings> pointer; |
1327 | optional_value<TouchpadSettings> touchpad; |
1328 | optional_value<MirKeyboardConfig> keyboard; |
1329 | +<<<<<<< TREE |
1330 | optional_value<TouchscreenSettings> touchscreen; |
1331 | std::shared_ptr<dispatch::ActionQueue> actions; |
1332 | +======= |
1333 | + std::shared_ptr<dispatch::ActionQueue> actions; |
1334 | +>>>>>>> MERGE-SOURCE |
1335 | std::shared_ptr<KeyMapper> const key_mapper; |
1336 | +<<<<<<< TREE |
1337 | std::function<void(Device*)> device_changed_callback; |
1338 | std::mutex mutable config_mutex; |
1339 | +======= |
1340 | + std::mutex mutable config_mutex; |
1341 | +>>>>>>> MERGE-SOURCE |
1342 | }; |
1343 | |
1344 | } |
1345 | |
1346 | === modified file 'src/server/input/default_input_device_hub.cpp' |
1347 | --- src/server/input/default_input_device_hub.cpp 2017-05-08 03:04:26 +0000 |
1348 | +++ src/server/input/default_input_device_hub.cpp 2017-05-26 09:20:21 +0000 |
1349 | @@ -200,8 +200,14 @@ |
1350 | |
1351 | if (it == end(devices)) |
1352 | { |
1353 | +<<<<<<< TREE |
1354 | auto queue = std::make_shared<dispatch::ActionQueue>(); |
1355 | auto handle = restore_or_create_device(*device, queue); |
1356 | +======= |
1357 | + auto id = create_new_device_id(); |
1358 | + auto queue = std::make_shared<dispatch::ActionQueue>(); |
1359 | + auto handle = std::make_shared<DefaultDevice>(id, queue, *device, key_mapper); |
1360 | +>>>>>>> MERGE-SOURCE |
1361 | // send input device info to observer loop.. |
1362 | devices.push_back(std::make_unique<RegisteredDevice>( |
1363 | device, handle->id(), queue, cookie_authority, handle)); |
1364 | @@ -210,7 +216,18 @@ |
1365 | add_device_handle(handle); |
1366 | |
1367 | seat->add_device(*handle); |
1368 | - dev->start(seat, input_dispatchable); |
1369 | +<<<<<<< TREE |
1370 | + dev->start(seat, input_dispatchable); |
1371 | +======= |
1372 | + dev->start(seat, input_dispatchable); |
1373 | + |
1374 | + // pass input device handle to observer loop.. |
1375 | + observer_queue->enqueue(this, |
1376 | + [this, handle]() |
1377 | + { |
1378 | + add_device_handle(handle); |
1379 | + }); |
1380 | +>>>>>>> MERGE-SOURCE |
1381 | } |
1382 | else |
1383 | { |
1384 | |
1385 | === modified file 'src/server/input/default_input_device_hub.h' |
1386 | --- src/server/input/default_input_device_hub.h 2017-05-08 03:04:26 +0000 |
1387 | +++ src/server/input/default_input_device_hub.h 2017-05-26 09:20:21 +0000 |
1388 | @@ -104,11 +104,15 @@ |
1389 | void device_changed(Device* dev); |
1390 | void emit_changed_devices(); |
1391 | MirInputDeviceId create_new_device_id(); |
1392 | +<<<<<<< TREE |
1393 | void store_device_config(DefaultDevice const& dev); |
1394 | std::shared_ptr<DefaultDevice> restore_or_create_device(InputDevice& dev, |
1395 | std::shared_ptr<dispatch::ActionQueue> const& queue); |
1396 | mir::optional_value<MirInputDevice> get_stored_device_config(std::string const& id); |
1397 | |
1398 | +======= |
1399 | + |
1400 | +>>>>>>> MERGE-SOURCE |
1401 | std::shared_ptr<Seat> const seat; |
1402 | std::shared_ptr<dispatch::MultiplexingDispatchable> const input_dispatchable; |
1403 | std::mutex mutable handles_guard; |
1404 | |
1405 | === modified file 'src/server/scene/application_session.cpp' |
1406 | === modified file 'src/utils/out.c' |
1407 | === modified file 'tests/acceptance-tests/test_custom_window_management.cpp' |
1408 | --- tests/acceptance-tests/test_custom_window_management.cpp 2017-05-25 04:43:29 +0000 |
1409 | +++ tests/acceptance-tests/test_custom_window_management.cpp 2017-05-26 09:20:21 +0000 |
1410 | @@ -371,6 +371,7 @@ |
1411 | mir_connection_release(connection); |
1412 | } |
1413 | |
1414 | +<<<<<<< TREE |
1415 | TEST_F(CustomWindowManagement, apply_input_shape_to_surface) |
1416 | { |
1417 | start_server(); |
1418 | @@ -420,6 +421,55 @@ |
1419 | mir_connection_release(connection); |
1420 | } |
1421 | |
1422 | +======= |
1423 | +TEST_F(CustomWindowManagement, apply_input_shape_to_surface) |
1424 | +{ |
1425 | + start_server(); |
1426 | + |
1427 | + auto connection = mir_connect_sync(new_connection().c_str(), __PRETTY_FUNCTION__); |
1428 | + |
1429 | + int const width{800}, height{600}; |
1430 | + MirPixelFormat const format{mir_pixel_format_bgr_888}; |
1431 | + auto surface_spec = mir_create_normal_window_spec(connection, width, height); |
1432 | + mir_window_spec_set_pixel_format(surface_spec, format); |
1433 | + |
1434 | + auto window = mir_create_window_sync(surface_spec); |
1435 | + mir_window_spec_release(surface_spec); |
1436 | + |
1437 | + surface_spec = mir_create_window_spec(connection); |
1438 | + |
1439 | + mt::Signal received; |
1440 | + |
1441 | + MirRectangle rect{ 0, 0, 100, 101 }; |
1442 | + mir_window_spec_set_input_shape(surface_spec, &rect, 1); |
1443 | + |
1444 | + auto const check_apply_surface = [&received]( |
1445 | + std::shared_ptr<ms::Session> const&, |
1446 | + std::shared_ptr<ms::Surface> const&, |
1447 | + msh::SurfaceSpecification const& spec) |
1448 | + { |
1449 | + EXPECT_TRUE(spec.input_shape.is_set()); |
1450 | + received.raise(); |
1451 | + }; |
1452 | + EXPECT_CALL(window_manager, modify_surface(_,_,_)).WillOnce(Invoke(check_apply_surface)); |
1453 | + |
1454 | + mir_window_apply_spec(window, surface_spec); |
1455 | + mir_window_spec_release(surface_spec); |
1456 | + |
1457 | + EXPECT_TRUE(received.wait_for(400ms)); |
1458 | + |
1459 | + surface_spec = mir_create_window_spec(connection); |
1460 | + mir_window_spec_set_input_shape(surface_spec, nullptr, 0); |
1461 | + |
1462 | + mir_window_apply_spec(window, surface_spec); |
1463 | + mir_window_spec_release(surface_spec); |
1464 | + EXPECT_TRUE(received.wait_for(400ms)); |
1465 | + |
1466 | + mir_window_release_sync(window); |
1467 | + mir_connection_release(connection); |
1468 | +} |
1469 | + |
1470 | +>>>>>>> MERGE-SOURCE |
1471 | TEST_F(CustomWindowManagement, when_the_client_places_a_new_surface_the_request_reaches_the_window_manager) |
1472 | { |
1473 | int const width{800}; |
1474 | |
1475 | === modified file 'tests/acceptance-tests/test_new_display_configuration.cpp' |
1476 | === modified file 'tests/acceptance-tests/test_presentation_chain.cpp' |
1477 | --- tests/acceptance-tests/test_presentation_chain.cpp 2017-05-25 04:43:29 +0000 |
1478 | +++ tests/acceptance-tests/test_presentation_chain.cpp 2017-05-26 09:20:21 +0000 |
1479 | @@ -133,18 +133,33 @@ |
1480 | { |
1481 | auto spec = mir_create_normal_window_spec( |
1482 | connection, size.width.as_int(), size.height.as_int()); |
1483 | -#pragma GCC diagnostic push |
1484 | -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" |
1485 | - mir_window_spec_set_pixel_format(spec, pf); |
1486 | - mir_window_spec_add_render_surface( |
1487 | - spec, chain.content(), size.width.as_int(), size.height.as_int(), 0, 0); |
1488 | -#pragma GCC diagnostic pop |
1489 | - auto window = mir_create_window_sync(spec); |
1490 | - mir_window_spec_release(spec); |
1491 | - return window; |
1492 | - } |
1493 | -}; |
1494 | - |
1495 | +<<<<<<< TREE |
1496 | +#pragma GCC diagnostic push |
1497 | +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" |
1498 | + mir_window_spec_set_pixel_format(spec, pf); |
1499 | + mir_window_spec_add_render_surface( |
1500 | + spec, chain.content(), size.width.as_int(), size.height.as_int(), 0, 0); |
1501 | +#pragma GCC diagnostic pop |
1502 | + auto window = mir_create_window_sync(spec); |
1503 | + mir_window_spec_release(spec); |
1504 | + return window; |
1505 | + } |
1506 | +}; |
1507 | + |
1508 | +======= |
1509 | + mir_window_spec_set_pixel_format(spec, pf); |
1510 | +#pragma GCC diagnostic push |
1511 | +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" |
1512 | + mir_window_spec_add_render_surface( |
1513 | + spec, chain.content(), size.width.as_int(), size.height.as_int(), 0, 0); |
1514 | +#pragma GCC diagnostic pop |
1515 | + auto window = mir_create_window_sync(spec); |
1516 | + mir_window_spec_release(spec); |
1517 | + return window; |
1518 | + } |
1519 | +}; |
1520 | + |
1521 | +>>>>>>> MERGE-SOURCE |
1522 | struct PresentationChain : mtf::ConnectedClientHeadlessServer |
1523 | { |
1524 | bool stall_compositor = false; |
1525 | @@ -467,6 +482,7 @@ |
1526 | EXPECT_THAT(mir_buffer_get_error_message(buffer), Not(StrEq(""))); |
1527 | mir_buffer_release(buffer); |
1528 | } |
1529 | +<<<<<<< TREE |
1530 | |
1531 | namespace |
1532 | { |
1533 | @@ -623,3 +639,159 @@ |
1534 | for (auto i = 0u; i < buffers.size() - 1; i++) |
1535 | EXPECT_TRUE(buffers[i]->wait_ready(5s)); |
1536 | } |
1537 | +======= |
1538 | + |
1539 | +namespace |
1540 | +{ |
1541 | + struct TrackedBuffer |
1542 | + { |
1543 | + TrackedBuffer(MirConnection* connection, std::atomic<unsigned int>& counter) : |
1544 | + buffer(mir_connection_allocate_buffer_sync(connection, 100, 100, pf)), |
1545 | + counter(counter) |
1546 | + { |
1547 | + } |
1548 | + ~TrackedBuffer() |
1549 | + { |
1550 | + mir_buffer_release(buffer); |
1551 | + } |
1552 | + |
1553 | + void submit_to(MirPresentationChain* chain) |
1554 | + { |
1555 | + std::unique_lock<std::mutex> lk(mutex); |
1556 | + if (!avail) |
1557 | + throw std::runtime_error("test problem"); |
1558 | + avail = false; |
1559 | + mir_presentation_chain_submit_buffer(chain, buffer, tavailable, this); |
1560 | + } |
1561 | + |
1562 | + static void tavailable(MirBuffer*, void* ctxt) |
1563 | + { |
1564 | + TrackedBuffer* buf = reinterpret_cast<TrackedBuffer*>(ctxt); |
1565 | + buf->ready(); |
1566 | + } |
1567 | + |
1568 | + void ready() |
1569 | + { |
1570 | + last_count_ = counter.fetch_add(1); |
1571 | + std::unique_lock<std::mutex> lk(mutex); |
1572 | + avail = true; |
1573 | + cv.notify_all(); |
1574 | + } |
1575 | + |
1576 | + bool wait_ready(std::chrono::milliseconds ms) |
1577 | + { |
1578 | + std::unique_lock<std::mutex> lk(mutex); |
1579 | + return cv.wait_for(lk, ms, [this] { return avail; }); |
1580 | + } |
1581 | + |
1582 | + bool is_ready() { return avail; } |
1583 | + unsigned int last_count() const |
1584 | + { |
1585 | + return last_count_; |
1586 | + } |
1587 | + |
1588 | + MirPixelFormat pf = mir_pixel_format_abgr_8888; |
1589 | + MirBuffer* buffer; |
1590 | + std::atomic<unsigned int>& counter; |
1591 | + unsigned int last_count_ = 0u; |
1592 | + bool avail = true; |
1593 | + std::condition_variable cv; |
1594 | + std::mutex mutex; |
1595 | + }; |
1596 | +} |
1597 | + |
1598 | +TEST_F(PresentationChain, fifo_looks_correct_from_client_perspective) |
1599 | +{ |
1600 | + SurfaceWithChainFromStart window( |
1601 | + connection, mir_present_mode_fifo, size, pf); |
1602 | + |
1603 | + int const num_buffers = 5; |
1604 | + |
1605 | + std::atomic<unsigned int> counter{ 0u }; |
1606 | + std::array<std::unique_ptr<TrackedBuffer>, num_buffers> buffers; |
1607 | + for (auto& buffer : buffers) |
1608 | + buffer = std::make_unique<TrackedBuffer>(connection, counter); |
1609 | + for(auto& b : buffers) |
1610 | + b->submit_to(window.chain()); |
1611 | + |
1612 | + //the last one that will return; |
1613 | + EXPECT_TRUE(buffers[3]->wait_ready(5s)); |
1614 | + EXPECT_THAT(buffers[0]->last_count(), Lt(buffers[1]->last_count())); |
1615 | + EXPECT_THAT(buffers[1]->last_count(), Lt(buffers[2]->last_count())); |
1616 | + EXPECT_THAT(buffers[2]->last_count(), Lt(buffers[3]->last_count())); |
1617 | + EXPECT_FALSE(buffers[4]->is_ready()); |
1618 | +} |
1619 | + |
1620 | +TEST_F(PresentationChain, fifo_queues_when_compositor_isnt_consuming) |
1621 | +{ |
1622 | + SurfaceWithChainFromStart window( |
1623 | + connection, mir_present_mode_fifo, size, pf); |
1624 | + int const num_buffers = 5; |
1625 | + std::atomic<unsigned int> counter{ 0u }; |
1626 | + std::array<std::unique_ptr<TrackedBuffer>, num_buffers> buffers; |
1627 | + for (auto& buffer : buffers) |
1628 | + buffer = std::make_unique<TrackedBuffer>(connection, counter); |
1629 | + { |
1630 | + auto const stall = mir::raii::paired_calls( |
1631 | + [this] { stall_compositor = true; }, |
1632 | + [this] { stall_compositor = false; }); |
1633 | + for (auto& b : buffers) |
1634 | + b->submit_to(window.chain()); |
1635 | + for (auto &b : buffers) |
1636 | + EXPECT_FALSE(b->is_ready()); |
1637 | + } |
1638 | + for (auto i = 0u; i < buffers.size() - 1; i++) |
1639 | + EXPECT_TRUE(buffers[i]->wait_ready(5s)); |
1640 | +} |
1641 | + |
1642 | +TEST_F(PresentationChain, mailbox_looks_correct_from_client_perspective) |
1643 | +{ |
1644 | + auto const stall = mir::raii::paired_calls( |
1645 | + [this] { stall_compositor = true; }, |
1646 | + [this] { stall_compositor = false; }); |
1647 | + SurfaceWithChainFromStart window( |
1648 | + connection, mir_present_mode_mailbox, size, pf); |
1649 | + |
1650 | + int const num_buffers = 5; |
1651 | + |
1652 | + std::atomic<unsigned int> counter{ 0u }; |
1653 | + std::array<std::unique_ptr<TrackedBuffer>, num_buffers> buffers; |
1654 | + for (auto& buffer : buffers) |
1655 | + buffer = std::make_unique<TrackedBuffer>(connection, counter); |
1656 | + |
1657 | + for(auto i = 0u; i < buffers.size(); i++) |
1658 | + { |
1659 | + buffers[i]->submit_to(window.chain()); |
1660 | + if (i > 0) |
1661 | + EXPECT_TRUE(buffers[i-1]->wait_ready(5s)); |
1662 | + } |
1663 | + |
1664 | + for(auto i = 0u; i < num_buffers - 1; i++) |
1665 | + EXPECT_TRUE(buffers[i]->is_ready()); |
1666 | + EXPECT_FALSE(buffers[4]->is_ready()); |
1667 | +} |
1668 | + |
1669 | +TEST_F(PresentationChain, fifo_queues_clears_out_on_transition_to_mailbox) |
1670 | +{ |
1671 | + SurfaceWithChainFromStart window( |
1672 | + connection, mir_present_mode_fifo, size, pf); |
1673 | + int const num_buffers = 5; |
1674 | + std::atomic<unsigned int> counter{ 0u }; |
1675 | + std::array<std::unique_ptr<TrackedBuffer>, num_buffers> buffers; |
1676 | + for (auto& buffer : buffers) |
1677 | + buffer = std::make_unique<TrackedBuffer>(connection, counter); |
1678 | + |
1679 | + auto const stall = mir::raii::paired_calls( |
1680 | + [this] { stall_compositor = true; }, |
1681 | + [this] { stall_compositor = false; }); |
1682 | + for (auto& b : buffers) |
1683 | + b->submit_to(window.chain()); |
1684 | + for (auto &b : buffers) |
1685 | + EXPECT_FALSE(b->is_ready()); |
1686 | + |
1687 | + mir_presentation_chain_set_mode(window.chain(), mir_present_mode_mailbox); |
1688 | + |
1689 | + for (auto i = 0u; i < buffers.size() - 1; i++) |
1690 | + EXPECT_TRUE(buffers[i]->wait_ready(5s)); |
1691 | +} |
1692 | +>>>>>>> MERGE-SOURCE |
1693 | |
1694 | === modified file 'tests/unit-tests/compositor/test_multi_monitor_arbiter.cpp' |
1695 | === modified file 'tests/unit-tests/frontend/test_session_mediator.cpp' |
1696 | === modified file 'tests/unit-tests/input/test_default_device.cpp' |
1697 | --- tests/unit-tests/input/test_default_device.cpp 2017-05-08 03:04:26 +0000 |
1698 | +++ tests/unit-tests/input/test_default_device.cpp 2017-05-26 09:20:21 +0000 |
1699 | @@ -183,6 +183,7 @@ |
1700 | |
1701 | queue->dispatch(md::FdEvent::readable); |
1702 | } |
1703 | +<<<<<<< TREE |
1704 | |
1705 | TEST_F(DefaultDevice, touchpad_device_can_be_constructed_from_input_config) |
1706 | { |
1707 | @@ -339,3 +340,28 @@ |
1708 | conf.set_keyboard_config(kbd_config); |
1709 | EXPECT_NO_THROW(mi::DefaultDevice dev(conf, queue, keyboard, mt::fake_shared(key_mapper), change_callback)); |
1710 | } |
1711 | +======= |
1712 | + |
1713 | +TEST_F(DefaultDevice, disable_queue_ends_config_processing) |
1714 | +{ |
1715 | + mi::DefaultDevice dev(MirInputDeviceId{17}, queue, touchpad, mt::fake_shared(key_mapper)); |
1716 | + |
1717 | + dev.disable_queue(); |
1718 | + MirPointerConfig pointer_conf; |
1719 | + pointer_conf.cursor_acceleration_bias(1.0); |
1720 | + |
1721 | + EXPECT_CALL(touchpad, apply_settings(Matcher<mi::TouchpadSettings const&>(_))).Times(0); |
1722 | + dev.apply_pointer_configuration(pointer_conf); |
1723 | +} |
1724 | + |
1725 | +TEST_F(DefaultDevice, disable_queue_removes_reference_to_queue) |
1726 | +{ |
1727 | + std::weak_ptr<md::ActionQueue> ref = queue; |
1728 | + mi::DefaultDevice dev(MirInputDeviceId{17}, queue, touchpad, mt::fake_shared(key_mapper)); |
1729 | + queue.reset(); |
1730 | + |
1731 | + EXPECT_THAT(ref.lock(), Ne(nullptr)); |
1732 | + dev.disable_queue(); |
1733 | + EXPECT_THAT(ref.lock(), Eq(nullptr)); |
1734 | +} |
1735 | +>>>>>>> MERGE-SOURCE |
1736 | |
1737 | === modified file 'tests/unit-tests/input/test_default_input_device_hub.cpp' |
1738 | --- tests/unit-tests/input/test_default_input_device_hub.cpp 2017-05-08 03:04:26 +0000 |
1739 | +++ tests/unit-tests/input/test_default_input_device_hub.cpp 2017-05-26 09:20:21 +0000 |
1740 | @@ -238,6 +238,7 @@ |
1741 | |
1742 | hub.remove_device(mt::fake_shared(device)); |
1743 | hub.remove_device(mt::fake_shared(another_device)); |
1744 | +<<<<<<< TREE |
1745 | } |
1746 | |
1747 | TEST_F(InputDeviceHubTest, when_pointer_configuration_is_applied_successfully_observer_is_triggerd) |
1748 | @@ -359,3 +360,26 @@ |
1749 | hub.remove_device(mt::fake_shared(mouse)); |
1750 | expect_and_execute_multiplexer(); |
1751 | } |
1752 | +======= |
1753 | + observer_loop.trigger_server_actions(); |
1754 | +} |
1755 | + |
1756 | +TEST_F(InputDeviceHubTest, no_device_config_action_after_device_removal) |
1757 | +{ |
1758 | + std::shared_ptr<mi::Device> dev_ptr; |
1759 | + MirPointerConfig ptr_config; |
1760 | + ptr_config.cursor_acceleration_bias(0.5); |
1761 | + |
1762 | + ON_CALL(mock_observer, device_added(WithName("mouse"))).WillByDefault(SaveArg<0>(&dev_ptr)); |
1763 | + |
1764 | + hub.add_device(mt::fake_shared(mouse)); |
1765 | + hub.add_observer(mt::fake_shared(mock_observer)); |
1766 | + observer_loop.trigger_server_actions(); |
1767 | + |
1768 | + EXPECT_CALL(mouse, apply_settings(Matcher<mi::PointerSettings const&>(_))).Times(0); |
1769 | + |
1770 | + dev_ptr->apply_pointer_configuration(ptr_config); |
1771 | + hub.remove_device(mt::fake_shared(mouse)); |
1772 | + observer_loop.trigger_server_actions(); |
1773 | +} |
1774 | +>>>>>>> MERGE-SOURCE |
1775 | |
1776 | === modified file 'tests/unit-tests/platforms/mesa/client/test_client_platform.cpp' |
1777 | === modified file 'tests/unit-tests/platforms/nested/mir_display_configuration_builder.cpp' |
1778 | --- tests/unit-tests/platforms/nested/mir_display_configuration_builder.cpp 2017-05-08 03:04:26 +0000 |
1779 | +++ tests/unit-tests/platforms/nested/mir_display_configuration_builder.cpp 2017-05-26 09:20:21 +0000 |
1780 | @@ -81,11 +81,15 @@ |
1781 | output->set_power_mode(mir_power_mode_on); |
1782 | output->set_orientation(mir_orientation_normal); |
1783 | output->set_edid(valid_edid, sizeof(valid_edid)); |
1784 | +<<<<<<< TREE |
1785 | output->set_subpixel_arrangement(mir_subpixel_arrangement_horizontal_rgb); |
1786 | |
1787 | auto const& current_mode = output->mode(output->current_mode()); |
1788 | output->set_logical_width(current_mode.horizontal_resolution()); |
1789 | output->set_logical_height(current_mode.vertical_resolution()); |
1790 | +======= |
1791 | + output->set_subpixel_arrangement(mir_subpixel_arrangement_horizontal_rgb); |
1792 | +>>>>>>> MERGE-SOURCE |
1793 | |
1794 | return std::make_shared<MirDisplayConfig>(conf); |
1795 | } |
1796 | @@ -126,11 +130,15 @@ |
1797 | output->set_power_mode(mir_power_mode_on); |
1798 | output->set_orientation(mir_orientation_normal); |
1799 | output->set_edid(valid_edid, sizeof(valid_edid)); |
1800 | +<<<<<<< TREE |
1801 | output->set_subpixel_arrangement(mir_subpixel_arrangement_horizontal_rgb); |
1802 | |
1803 | auto const& current_mode = output->mode(output->current_mode()); |
1804 | output->set_logical_width(current_mode.horizontal_resolution()); |
1805 | output->set_logical_height(current_mode.vertical_resolution()); |
1806 | +======= |
1807 | + output->set_subpixel_arrangement(mir_subpixel_arrangement_horizontal_rgb); |
1808 | +>>>>>>> MERGE-SOURCE |
1809 | } |
1810 | |
1811 | return std::make_shared<MirDisplayConfig>(conf); |