Merge lp:~vanvugt/mir/set-logical-size into lp:mir
- set-logical-size
- Merge into development-branch
Proposed by
Daniel van Vugt
Status: | Superseded |
---|---|
Proposed branch: | lp:~vanvugt/mir/set-logical-size |
Merge into: | lp:mir |
Diff against target: |
779 lines (+247/-20) 28 files modified
include/client/mir_toolkit/mir_display_configuration.h (+14/-0) include/platform/mir/graphics/display_configuration.h (+12/-0) src/client/display_configuration_api.cpp (+13/-0) src/client/symbols.map (+6/-1) src/platform/graphics/display_configuration.cpp (+35/-3) src/platform/graphics/overlapping_output_grouping.cpp (+2/-2) src/platform/symbols.map (+7/-0) src/platforms/android/server/display.cpp (+2/-2) src/platforms/android/server/display_configuration.cpp (+1/-0) src/platforms/android/server/fb_device.cpp (+1/-0) src/platforms/android/server/hwc_blanking_control.cpp (+1/-0) src/platforms/eglstream-kms/server/display.cpp (+1/-1) src/platforms/mesa/server/kms/display.cpp (+5/-9) src/platforms/mesa/server/x11/graphics/display.cpp (+3/-1) src/platforms/mesa/server/x11/graphics/display_configuration.cpp (+1/-0) src/server/frontend/session_mediator.cpp (+6/-0) src/server/graphics/nested/nested_display_configuration.cpp (+3/-1) src/server/graphics/offscreen/display_configuration.cpp (+1/-0) tests/acceptance-tests/test_latency.cpp (+1/-0) tests/acceptance-tests/test_new_display_configuration.cpp (+55/-0) tests/mir_test/display_config_matchers.cpp (+3/-0) tests/mir_test_doubles/stub_display_configuration.cpp (+4/-0) tests/unit-tests/graphics/test_default_display_configuration_policy.cpp (+1/-0) tests/unit-tests/graphics/test_display_configuration.cpp (+48/-0) tests/unit-tests/graphics/test_overlapping_output_grouping.cpp (+1/-0) tests/unit-tests/platforms/mesa/kms/test_cursor.cpp (+3/-0) tests/unit-tests/platforms/mesa/kms/test_display_configuration.cpp (+9/-0) tests/unit-tests/platforms/nested/mir_display_configuration_builder.cpp (+8/-0) |
To merge this branch: | bzr merge lp:~vanvugt/mir/set-logical-size |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Mir development team | Pending | ||
Review via email: mp+322511@code.launchpad.net |
This proposal has been superseded by a proposal from 2017-04-13.
Commit message
Add the ability to set the logical size/resolution of an output,
independently of its physical resolution.
That's another big step in LP: #1639226, almost done.
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 'include/client/mir_toolkit/mir_display_configuration.h' |
2 | --- include/client/mir_toolkit/mir_display_configuration.h 2017-02-17 08:46:05 +0000 |
3 | +++ include/client/mir_toolkit/mir_display_configuration.h 2017-04-13 08:26:06 +0000 |
4 | @@ -333,6 +333,20 @@ |
5 | unsigned int mir_output_get_logical_height(MirOutput const* output); |
6 | |
7 | /** |
8 | + * Set the logical size of the virtual display space occupied by an output. |
9 | + * By default this is the dimensions of the output's current mode, but you |
10 | + * can now set it to an arbitrary size and the compositor will scale |
11 | + * accordingly. |
12 | + * |
13 | + * \param [in] output The output to modify |
14 | + * \param [in] w The width in logical view area pixels, or zero to |
15 | + * revert to the current display mode dimensions. |
16 | + * \param [in] h The height in logical view area pixels, or zero to |
17 | + * revert to the current display mode dimensions. |
18 | + */ |
19 | +void mir_output_set_logical_size(MirOutput* output, unsigned w, unsigned h); |
20 | + |
21 | +/** |
22 | * Set the coordinates of the top-left point of the output in the virtual |
23 | * display space. |
24 | * |
25 | |
26 | === modified file 'include/platform/mir/graphics/display_configuration.h' |
27 | --- include/platform/mir/graphics/display_configuration.h 2017-01-18 02:29:37 +0000 |
28 | +++ include/platform/mir/graphics/display_configuration.h 2017-04-13 08:26:06 +0000 |
29 | @@ -24,8 +24,11 @@ |
30 | #include "mir/geometry/rectangle.h" |
31 | #include "mir/geometry/point.h" |
32 | #include "mir/graphics/gamma_curves.h" |
33 | +#include "mir/optional_value.h" |
34 | #include "mir_toolkit/common.h" |
35 | |
36 | +#include <glm/glm.hpp> |
37 | + |
38 | #include <functional> |
39 | #include <vector> |
40 | #include <memory> |
41 | @@ -130,10 +133,18 @@ |
42 | /** EDID of the display, if non-empty */ |
43 | std::vector<uint8_t> edid; |
44 | |
45 | + mir::optional_value<geometry::Size> custom_logical_size; |
46 | + |
47 | /** The logical rectangle occupied by the output, based on its position, |
48 | current mode and orientation (rotation) */ |
49 | geometry::Rectangle extents() const; |
50 | bool valid() const; |
51 | + |
52 | + /** |
53 | + * The transformation required to map this output's logical view area |
54 | + * (returned by extents()) on to the output's current mode. |
55 | + */ |
56 | + glm::mat2 transformation() const; |
57 | }; |
58 | |
59 | /** |
60 | @@ -162,6 +173,7 @@ |
61 | GammaCurves& gamma; |
62 | MirOutputGammaSupported const& gamma_supported; |
63 | std::vector<uint8_t const> const& edid; |
64 | + mir::optional_value<geometry::Size>& custom_logical_size; |
65 | |
66 | UserDisplayConfigurationOutput(DisplayConfigurationOutput& master); |
67 | geometry::Rectangle extents() const; |
68 | |
69 | === modified file 'src/client/display_configuration_api.cpp' |
70 | --- src/client/display_configuration_api.cpp 2017-02-17 08:46:05 +0000 |
71 | +++ src/client/display_configuration_api.cpp 2017-04-13 08:26:06 +0000 |
72 | @@ -261,6 +261,19 @@ |
73 | return output->logical_height(); |
74 | } |
75 | |
76 | +void mir_output_set_logical_size(MirOutput* output, unsigned w, unsigned h) |
77 | +{ |
78 | + if (w) |
79 | + output->set_logical_width(w); |
80 | + else |
81 | + output->clear_logical_width(); |
82 | + |
83 | + if (h) |
84 | + output->set_logical_height(h); |
85 | + else |
86 | + output->clear_logical_height(); |
87 | +} |
88 | + |
89 | void mir_output_set_position(MirOutput* output, int x, int y) |
90 | { |
91 | output->set_position_x(x); |
92 | |
93 | === modified file 'src/client/symbols.map' |
94 | --- src/client/symbols.map 2017-04-13 04:26:20 +0000 |
95 | +++ src/client/symbols.map 2017-04-13 08:26:06 +0000 |
96 | @@ -579,7 +579,7 @@ |
97 | }; |
98 | } MIR_CLIENT_DETAIL_0.26.1; |
99 | |
100 | -MIR_CLIENT_0.27 { # New functions in Mir 0.27 or 1.0 |
101 | +MIR_CLIENT_0.27 { # New functions in Mir 0.27 |
102 | global: |
103 | mir_connection_apply_session_input_config; |
104 | mir_connection_set_base_input_config; |
105 | @@ -611,3 +611,8 @@ |
106 | mir_touchscreen_config_set_mapping_mode; |
107 | mir_touchscreen_config_set_output_id; |
108 | } MIR_CLIENT_0.26.1; |
109 | + |
110 | +MIR_CLIENT_0.28 { # New functions in Mir 0.28 |
111 | + global: |
112 | + mir_output_set_logical_size; |
113 | +} MIR_CLIENT_0.27; |
114 | |
115 | === modified file 'src/platform/graphics/display_configuration.cpp' |
116 | --- src/platform/graphics/display_configuration.cpp 2017-01-18 02:29:37 +0000 |
117 | +++ src/platform/graphics/display_configuration.cpp 2017-04-13 08:26:06 +0000 |
118 | @@ -18,6 +18,7 @@ |
119 | |
120 | #include "mir/graphics/display_configuration.h" |
121 | #include "mir/output_type_names.h" |
122 | +#include "mir/graphics/transformation.h" |
123 | |
124 | #include <ostream> |
125 | #include <algorithm> |
126 | @@ -243,7 +244,28 @@ |
127 | |
128 | mir::geometry::Rectangle mg::DisplayConfigurationOutput::extents() const |
129 | { |
130 | - return extents_of(modes, current_mode_index, orientation, top_left); |
131 | + return custom_logical_size.is_set() ? |
132 | + mir::geometry::Rectangle(top_left, custom_logical_size.value()) : |
133 | + extents_of(modes, current_mode_index, orientation, top_left); |
134 | +} |
135 | + |
136 | +glm::mat2 mg::DisplayConfigurationOutput::transformation() const |
137 | +{ |
138 | + auto rot = mg::transformation(orientation); |
139 | + |
140 | + if (!custom_logical_size.is_set()) |
141 | + return rot; |
142 | + |
143 | + auto const& physical_size = extents_of(modes, current_mode_index, |
144 | + orientation, top_left).size; |
145 | + auto const& logical_size = custom_logical_size.value(); |
146 | + |
147 | + float scale_x = static_cast<float>(physical_size.width.as_int()) / |
148 | + logical_size.width.as_int(); |
149 | + float scale_y = static_cast<float>(physical_size.height.as_int()) / |
150 | + logical_size.height.as_int(); |
151 | + |
152 | + return glm::mat2(scale_x, 0, 0, scale_y) * rot; |
153 | } |
154 | |
155 | bool mg::DisplayConfigurationOutput::valid() const |
156 | @@ -260,6 +282,13 @@ |
157 | if (current_mode_index >= nmodes) |
158 | return false; |
159 | |
160 | + if (custom_logical_size.is_set()) |
161 | + { |
162 | + auto const& logical_size = custom_logical_size.value(); |
163 | + if (!logical_size.width.as_int() || !logical_size.height.as_int()) |
164 | + return false; |
165 | + } |
166 | + |
167 | return true; |
168 | } |
169 | |
170 | @@ -297,13 +326,16 @@ |
171 | subpixel_arrangement(master.subpixel_arrangement), |
172 | gamma(master.gamma), |
173 | gamma_supported(master.gamma_supported), |
174 | - edid(*reinterpret_cast<std::vector<uint8_t const>*>(&master.edid)) |
175 | + edid(*reinterpret_cast<std::vector<uint8_t const>*>(&master.edid)), |
176 | + custom_logical_size(master.custom_logical_size) |
177 | { |
178 | } |
179 | |
180 | mir::geometry::Rectangle mg::UserDisplayConfigurationOutput::extents() const |
181 | { |
182 | - return extents_of(modes, current_mode_index, orientation, top_left); |
183 | + return custom_logical_size.is_set() ? |
184 | + mir::geometry::Rectangle(top_left, custom_logical_size.value()) : |
185 | + extents_of(modes, current_mode_index, orientation, top_left); |
186 | } |
187 | |
188 | |
189 | |
190 | === modified file 'src/platform/graphics/overlapping_output_grouping.cpp' |
191 | --- src/platform/graphics/overlapping_output_grouping.cpp 2015-02-22 07:46:25 +0000 |
192 | +++ src/platform/graphics/overlapping_output_grouping.cpp 2017-04-13 08:26:06 +0000 |
193 | @@ -112,11 +112,11 @@ |
194 | { |
195 | /* |
196 | * Prevent grouping of outputs when they have differing |
197 | - * orientations. It's safer to assume the hardware can't |
198 | + * transformations. It's safer to assume the hardware can't |
199 | * handle it for now... until proven otherwise. |
200 | */ |
201 | if (conf_o.extents().overlaps(rect_output) && |
202 | - conf_o.orientation == conf_output.orientation) |
203 | + conf_o.transformation() == conf_output.transformation()) |
204 | found_overlap = true; |
205 | }); |
206 | |
207 | |
208 | === modified file 'src/platform/symbols.map' |
209 | --- src/platform/symbols.map 2017-04-05 03:11:28 +0000 |
210 | +++ src/platform/symbols.map 2017-04-13 08:26:06 +0000 |
211 | @@ -159,3 +159,10 @@ |
212 | }; |
213 | local: *; |
214 | }; |
215 | + |
216 | +MIRPLATFORM_0.28 { |
217 | + global: |
218 | + extern "C++" { |
219 | + mir::graphics::DisplayConfigurationOutput::transformation*; |
220 | + }; |
221 | +} MIRPLATFORM_0.27; |
222 | |
223 | === modified file 'src/platforms/android/server/display.cpp' |
224 | --- src/platforms/android/server/display.cpp 2017-04-05 03:11:28 +0000 |
225 | +++ src/platforms/android/server/display.cpp 2017-04-13 08:26:06 +0000 |
226 | @@ -133,7 +133,7 @@ |
227 | native_window, |
228 | gl_context, |
229 | *gl_program_factory, |
230 | - mg::transformation(config.orientation), |
231 | + config.transformation(), |
232 | config.extents(), |
233 | overlay_option)); |
234 | } |
235 | @@ -398,7 +398,7 @@ |
236 | config[output.id].scale = output.scale; |
237 | config[output.id].top_left = output.top_left; |
238 | |
239 | - auto const& transform = mg::transformation(output.orientation); |
240 | + auto const& transform = output.transformation(); |
241 | |
242 | if (config.primary().id == output.id) |
243 | { |
244 | |
245 | === modified file 'src/platforms/android/server/display_configuration.cpp' |
246 | --- src/platforms/android/server/display_configuration.cpp 2017-01-18 02:29:37 +0000 |
247 | +++ src/platforms/android/server/display_configuration.cpp 2017-04-13 08:26:06 +0000 |
248 | @@ -69,6 +69,7 @@ |
249 | subpixel_arrangement, |
250 | {}, |
251 | mir_output_gamma_unsupported, |
252 | + {}, |
253 | {} |
254 | }; |
255 | } |
256 | |
257 | === modified file 'src/platforms/android/server/fb_device.cpp' |
258 | --- src/platforms/android/server/fb_device.cpp 2017-01-18 02:29:37 +0000 |
259 | +++ src/platforms/android/server/fb_device.cpp 2017-04-13 08:26:06 +0000 |
260 | @@ -92,6 +92,7 @@ |
261 | mir_subpixel_arrangement_unknown, |
262 | {}, |
263 | mir_output_gamma_unsupported, |
264 | + {}, |
265 | {} |
266 | }; |
267 | } |
268 | |
269 | === modified file 'src/platforms/android/server/hwc_blanking_control.cpp' |
270 | --- src/platforms/android/server/hwc_blanking_control.cpp 2017-01-18 02:29:37 +0000 |
271 | +++ src/platforms/android/server/hwc_blanking_control.cpp 2017-04-13 08:26:06 +0000 |
272 | @@ -179,6 +179,7 @@ |
273 | mir_subpixel_arrangement_unknown, |
274 | {}, |
275 | mir_output_gamma_unsupported, |
276 | + {}, |
277 | {} |
278 | }; |
279 | } |
280 | |
281 | === modified file 'src/platforms/eglstream-kms/server/display.cpp' |
282 | --- src/platforms/eglstream-kms/server/display.cpp 2017-04-05 03:11:28 +0000 |
283 | +++ src/platforms/eglstream-kms/server/display.cpp 2017-04-13 08:26:06 +0000 |
284 | @@ -126,7 +126,7 @@ |
285 | ctx{create_context(dpy, config, ctx)}, |
286 | layer{output.output_layer()}, |
287 | view_area_{output.extents()}, |
288 | - transform{mg::transformation(output.orientation)} |
289 | + transform{output.transformation()} |
290 | { |
291 | EGLint const stream_attribs[] = { |
292 | EGL_STREAM_FIFO_LENGTH_KHR, 1, |
293 | |
294 | === modified file 'src/platforms/mesa/server/kms/display.cpp' |
295 | --- src/platforms/mesa/server/kms/display.cpp 2017-04-05 03:11:28 +0000 |
296 | +++ src/platforms/mesa/server/kms/display.cpp 2017-04-13 08:26:06 +0000 |
297 | @@ -521,7 +521,7 @@ |
298 | auto bounding_rect = group.bounding_rectangle(); |
299 | // Each vector<KMSOutput> is a single GPU memory domain |
300 | std::vector<std::vector<std::shared_ptr<KMSOutput>>> kms_output_groups; |
301 | - MirOrientation orientation = mir_orientation_normal; |
302 | + glm::mat2 transformation; |
303 | |
304 | group.for_each_output( |
305 | [&](DisplayConfigurationOutput const& conf_output) |
306 | @@ -539,16 +539,12 @@ |
307 | } |
308 | |
309 | /* |
310 | - * Presently OverlappingOutputGroup guarantees all grouped |
311 | - * outputs have the same orientation. |
312 | - */ |
313 | - orientation = conf_output.orientation; |
314 | + * Presently OverlappingOutputGroup guarantees all grouped |
315 | + * outputs have the same transformation. |
316 | + */ |
317 | + transformation = conf_output.transformation(); |
318 | }); |
319 | |
320 | - // TODO in future outputs should emit transformation instead of |
321 | - // orientation |
322 | - auto const transformation = mg::transformation(orientation); |
323 | - |
324 | if (comp) |
325 | { |
326 | display_buffers[group_idx++]->set_transformation(transformation, |
327 | |
328 | === modified file 'src/platforms/mesa/server/x11/graphics/display.cpp' |
329 | --- src/platforms/mesa/server/x11/graphics/display.cpp 2017-04-05 03:11:28 +0000 |
330 | +++ src/platforms/mesa/server/x11/graphics/display.cpp 2017-04-13 08:26:06 +0000 |
331 | @@ -289,12 +289,14 @@ |
332 | std::logic_error("Invalid or inconsistent display configuration")); |
333 | } |
334 | |
335 | + glm::mat2 trans; |
336 | MirOrientation o = mir_orientation_normal; |
337 | float new_scale = scale; |
338 | geom::Rectangle logical_area; |
339 | |
340 | new_configuration.for_each_output([&](DisplayConfigurationOutput const& conf_output) |
341 | { |
342 | + trans = conf_output.transformation(); |
343 | o = conf_output.orientation; |
344 | new_scale = conf_output.scale; |
345 | logical_area = conf_output.extents(); |
346 | @@ -302,7 +304,7 @@ |
347 | |
348 | orientation = o; |
349 | display_buffer->set_view_area(logical_area); |
350 | - display_buffer->set_transformation(mg::transformation(orientation)); |
351 | + display_buffer->set_transformation(trans); |
352 | scale = new_scale; |
353 | } |
354 | |
355 | |
356 | === modified file 'src/platforms/mesa/server/x11/graphics/display_configuration.cpp' |
357 | --- src/platforms/mesa/server/x11/graphics/display_configuration.cpp 2017-01-18 02:29:37 +0000 |
358 | +++ src/platforms/mesa/server/x11/graphics/display_configuration.cpp 2017-04-13 08:26:06 +0000 |
359 | @@ -48,6 +48,7 @@ |
360 | mir_subpixel_arrangement_unknown, |
361 | {}, |
362 | mir_output_gamma_unsupported, |
363 | + {}, |
364 | {}}, |
365 | card{mg::DisplayConfigurationCardId{0}, 1} |
366 | { |
367 | |
368 | === modified file 'src/server/frontend/session_mediator.cpp' |
369 | --- src/server/frontend/session_mediator.cpp 2017-04-13 04:26:20 +0000 |
370 | +++ src/server/frontend/session_mediator.cpp 2017-04-13 08:26:06 +0000 |
371 | @@ -1273,6 +1273,12 @@ |
372 | dest.gamma = {convert_string_to_gamma_curve(src.gamma_red()), |
373 | convert_string_to_gamma_curve(src.gamma_green()), |
374 | convert_string_to_gamma_curve(src.gamma_blue())}; |
375 | + |
376 | + if (src.has_logical_width() && src.has_logical_height()) |
377 | + { |
378 | + dest.custom_logical_size = {src.logical_width(), |
379 | + src.logical_height()}; |
380 | + } |
381 | }); |
382 | |
383 | return config; |
384 | |
385 | === modified file 'src/server/graphics/nested/nested_display_configuration.cpp' |
386 | --- src/server/graphics/nested/nested_display_configuration.cpp 2017-03-13 09:09:22 +0000 |
387 | +++ src/server/graphics/nested/nested_display_configuration.cpp 2017-04-13 08:26:06 +0000 |
388 | @@ -133,7 +133,9 @@ |
389 | local_config.subpixel_arrangement, |
390 | local_config.gamma, |
391 | local_config.gamma_supported, |
392 | - std::move(edid) |
393 | + std::move(edid), |
394 | + geometry::Size{mir_output_get_logical_width(output), |
395 | + mir_output_get_logical_height(output)} |
396 | }; |
397 | } |
398 | |
399 | |
400 | === modified file 'src/server/graphics/offscreen/display_configuration.cpp' |
401 | --- src/server/graphics/offscreen/display_configuration.cpp 2017-03-09 12:47:27 +0000 |
402 | +++ src/server/graphics/offscreen/display_configuration.cpp 2017-04-13 08:26:06 +0000 |
403 | @@ -40,6 +40,7 @@ |
404 | mir_subpixel_arrangement_unknown, |
405 | {}, |
406 | mir_output_gamma_unsupported, |
407 | + {}, |
408 | {}}, |
409 | card{mg::DisplayConfigurationCardId{0}, 1} |
410 | { |
411 | |
412 | === modified file 'tests/acceptance-tests/test_latency.cpp' |
413 | --- tests/acceptance-tests/test_latency.cpp 2017-04-11 14:13:20 +0000 |
414 | +++ tests/acceptance-tests/test_latency.cpp 2017-04-13 08:26:06 +0000 |
415 | @@ -255,6 +255,7 @@ |
416 | mir_subpixel_arrangement_unknown, |
417 | {}, |
418 | mir_output_gamma_unsupported, |
419 | + {}, |
420 | {} |
421 | }; |
422 | outputs.push_back(output); |
423 | |
424 | === modified file 'tests/acceptance-tests/test_new_display_configuration.cpp' |
425 | --- tests/acceptance-tests/test_new_display_configuration.cpp 2017-04-13 04:26:20 +0000 |
426 | +++ tests/acceptance-tests/test_new_display_configuration.cpp 2017-04-13 08:26:06 +0000 |
427 | @@ -934,6 +934,61 @@ |
428 | client.disconnect(); |
429 | } |
430 | |
431 | +TEST_F(DisplayConfigurationTest, client_can_set_logical_size) |
432 | +{ |
433 | + DisplayClient client{new_connection()}; |
434 | + |
435 | + client.connect(); |
436 | + |
437 | + auto client_config = client.get_base_config(); |
438 | + int num_outputs = mir_display_config_get_num_outputs(client_config.get()); |
439 | + |
440 | + for (int i = 0; i < num_outputs; ++i) |
441 | + { |
442 | + auto output = |
443 | + mir_display_config_get_mutable_output(client_config.get(), i); |
444 | + mir_output_set_logical_size(output, (i+1)*123, (i+3)*345); |
445 | + } |
446 | + |
447 | + DisplayConfigMatchingContext context; |
448 | + context.matcher = [c = client_config.get()](MirDisplayConfig* conf) |
449 | + { |
450 | + EXPECT_THAT(conf, mt::DisplayConfigMatches(c)); |
451 | + }; |
452 | + |
453 | + mir_connection_set_display_config_change_callback( |
454 | + client.connection, |
455 | + &new_display_config_matches, |
456 | + &context); |
457 | + |
458 | + mir_connection_preview_base_display_configuration(client.connection, |
459 | + client_config.get(), 10); |
460 | + |
461 | + EXPECT_TRUE(context.done.wait_for(std::chrono::seconds(30))); |
462 | + |
463 | + mir_connection_confirm_base_display_configuration(client.connection, |
464 | + client_config.get()); |
465 | + |
466 | + std::shared_ptr<mg::DisplayConfiguration> current_config = |
467 | + server.the_display()->configuration(); |
468 | + |
469 | + int j = 0; |
470 | + current_config->for_each_output( |
471 | + [&j](mg::UserDisplayConfigurationOutput& output) mutable |
472 | + { |
473 | + ASSERT_TRUE(output.custom_logical_size.is_set()); |
474 | + auto const& size = output.custom_logical_size.value(); |
475 | + int w = size.width.as_int(); |
476 | + int h = size.height.as_int(); |
477 | + EXPECT_EQ((j+1)*123, w); |
478 | + EXPECT_EQ((j+3)*345, h); |
479 | + ++j; |
480 | + }); |
481 | + |
482 | + EXPECT_TRUE(j); |
483 | + |
484 | + client.disconnect(); |
485 | +} |
486 | |
487 | TEST_F(DisplayConfigurationTest, client_sees_server_set_form_factor) |
488 | { |
489 | |
490 | === modified file 'tests/mir_test/display_config_matchers.cpp' |
491 | --- tests/mir_test/display_config_matchers.cpp 2017-01-27 04:57:53 +0000 |
492 | +++ tests/mir_test/display_config_matchers.cpp 2017-04-13 08:26:06 +0000 |
493 | @@ -75,6 +75,7 @@ |
494 | mir_subpixel_arrangement_unknown, |
495 | {}, |
496 | mir_output_gamma_unsupported, |
497 | + {}, |
498 | {} |
499 | }; |
500 | |
501 | @@ -134,6 +135,7 @@ |
502 | mir_subpixel_arrangement_unknown, |
503 | {}, |
504 | mir_output_gamma_unsupported, |
505 | + {}, |
506 | {} |
507 | }; |
508 | |
509 | @@ -192,6 +194,7 @@ |
510 | mir_subpixel_arrangement_unknown, |
511 | {}, |
512 | mir_output_gamma_unsupported, |
513 | + {}, |
514 | {} |
515 | }; |
516 | |
517 | |
518 | === modified file 'tests/mir_test_doubles/stub_display_configuration.cpp' |
519 | --- tests/mir_test_doubles/stub_display_configuration.cpp 2017-01-18 02:29:37 +0000 |
520 | +++ tests/mir_test_doubles/stub_display_configuration.cpp 2017-04-13 08:26:06 +0000 |
521 | @@ -93,6 +93,7 @@ |
522 | subpixel_arrangement, |
523 | {}, |
524 | mir_output_gamma_unsupported, |
525 | + {}, |
526 | {} |
527 | } |
528 | { |
529 | @@ -122,6 +123,7 @@ |
530 | mir_subpixel_arrangement_unknown, |
531 | {}, |
532 | mir_output_gamma_unsupported, |
533 | + {}, |
534 | {} |
535 | } |
536 | { |
537 | @@ -225,6 +227,7 @@ |
538 | mir_subpixel_arrangement_unknown, |
539 | {}, |
540 | mir_output_gamma_unsupported, |
541 | + {}, |
542 | {} |
543 | }; |
544 | |
545 | @@ -252,6 +255,7 @@ |
546 | mir_subpixel_arrangement_unknown, |
547 | {}, |
548 | mir_output_gamma_unsupported, |
549 | + {}, |
550 | {} |
551 | }; |
552 | |
553 | |
554 | === modified file 'tests/unit-tests/graphics/test_default_display_configuration_policy.cpp' |
555 | --- tests/unit-tests/graphics/test_default_display_configuration_policy.cpp 2017-01-30 05:18:36 +0000 |
556 | +++ tests/unit-tests/graphics/test_default_display_configuration_policy.cpp 2017-04-13 08:26:06 +0000 |
557 | @@ -65,6 +65,7 @@ |
558 | mir_subpixel_arrangement_unknown, |
559 | {}, |
560 | mir_output_gamma_unsupported, |
561 | + {}, |
562 | {} |
563 | }; |
564 | } |
565 | |
566 | === modified file 'tests/unit-tests/graphics/test_display_configuration.cpp' |
567 | --- tests/unit-tests/graphics/test_display_configuration.cpp 2017-01-18 02:29:37 +0000 |
568 | +++ tests/unit-tests/graphics/test_display_configuration.cpp 2017-04-13 08:26:06 +0000 |
569 | @@ -53,6 +53,7 @@ |
570 | mir_subpixel_arrangement_unknown, |
571 | {}, |
572 | mir_output_gamma_unsupported, |
573 | + {}, |
574 | {} |
575 | }; |
576 | |
577 | @@ -286,6 +287,36 @@ |
578 | EXPECT_EQ(out.modes[out.current_mode_index].size, out.extents().size); |
579 | } |
580 | |
581 | +TEST(DisplayConfiguration, output_extents_are_customizable) |
582 | +{ |
583 | + mg::DisplayConfigurationOutput out = tmpl_output; |
584 | + |
585 | + geom::Size const custom_size{1234, 9876}; |
586 | + out.custom_logical_size = custom_size; |
587 | + |
588 | + EXPECT_EQ(custom_size, out.extents().size); |
589 | +} |
590 | + |
591 | +TEST(DisplayConfiguration, custom_size_causes_scaling) |
592 | +{ |
593 | + mg::DisplayConfigurationOutput out = tmpl_output; |
594 | + |
595 | + auto const& physical_size = out.modes[out.current_mode_index].size; |
596 | + |
597 | + geom::Size const logical_size{1234, 9876}; |
598 | + out.custom_logical_size = logical_size; |
599 | + |
600 | + auto const& observed = out.transformation(); |
601 | + glm::mat2 const expected{static_cast<float>(physical_size.width.as_int()) / |
602 | + logical_size.width.as_int(), |
603 | + 0, |
604 | + 0, |
605 | + static_cast<float>(physical_size.height.as_int()) / |
606 | + logical_size.height.as_int()}; |
607 | + |
608 | + EXPECT_EQ(expected, observed); |
609 | +} |
610 | + |
611 | TEST(DisplayConfiguration, output_extents_rotates_with_orientation) |
612 | { |
613 | mg::DisplayConfigurationOutput out = tmpl_output; |
614 | @@ -329,6 +360,23 @@ |
615 | EXPECT_FALSE(out.valid()); |
616 | } |
617 | |
618 | +TEST(DisplayConfiguration, only_nonzero_custom_sizes_are_valid) |
619 | +{ |
620 | + mg::DisplayConfigurationOutput out = tmpl_output; |
621 | + |
622 | + out.custom_logical_size = {12, 34}; |
623 | + EXPECT_TRUE(out.valid()); |
624 | + |
625 | + out.custom_logical_size = {0, 56}; |
626 | + EXPECT_FALSE(out.valid()); |
627 | + |
628 | + out.custom_logical_size = {78, 0}; |
629 | + EXPECT_FALSE(out.valid()); |
630 | + |
631 | + out.custom_logical_size = {0, 0}; |
632 | + EXPECT_FALSE(out.valid()); |
633 | +} |
634 | + |
635 | TEST(DisplayConfiguration, unsupported_format_invalid) |
636 | { |
637 | mg::DisplayConfigurationOutput out = tmpl_output; |
638 | |
639 | === modified file 'tests/unit-tests/graphics/test_overlapping_output_grouping.cpp' |
640 | --- tests/unit-tests/graphics/test_overlapping_output_grouping.cpp 2017-01-18 02:29:37 +0000 |
641 | +++ tests/unit-tests/graphics/test_overlapping_output_grouping.cpp 2017-04-13 08:26:06 +0000 |
642 | @@ -100,6 +100,7 @@ |
643 | mir_subpixel_arrangement_unknown, |
644 | {}, |
645 | mir_output_gamma_unsupported, |
646 | + {}, |
647 | {} |
648 | }; |
649 | |
650 | |
651 | === modified file 'tests/unit-tests/platforms/mesa/kms/test_cursor.cpp' |
652 | --- tests/unit-tests/platforms/mesa/kms/test_cursor.cpp 2017-03-10 10:20:24 +0000 |
653 | +++ tests/unit-tests/platforms/mesa/kms/test_cursor.cpp 2017-04-13 08:26:06 +0000 |
654 | @@ -121,6 +121,7 @@ |
655 | mir_subpixel_arrangement_unknown, |
656 | {}, |
657 | mir_output_gamma_unsupported, |
658 | + {}, |
659 | {} |
660 | }, |
661 | { |
662 | @@ -146,6 +147,7 @@ |
663 | mir_subpixel_arrangement_unknown, |
664 | {}, |
665 | mir_output_gamma_unsupported, |
666 | + {}, |
667 | {} |
668 | }, |
669 | { |
670 | @@ -171,6 +173,7 @@ |
671 | mir_subpixel_arrangement_unknown, |
672 | {}, |
673 | mir_output_gamma_unsupported, |
674 | + {}, |
675 | {} |
676 | }}} |
677 | { |
678 | |
679 | === modified file 'tests/unit-tests/platforms/mesa/kms/test_display_configuration.cpp' |
680 | --- tests/unit-tests/platforms/mesa/kms/test_display_configuration.cpp 2017-04-05 03:11:28 +0000 |
681 | +++ tests/unit-tests/platforms/mesa/kms/test_display_configuration.cpp 2017-04-13 08:26:06 +0000 |
682 | @@ -300,6 +300,7 @@ |
683 | mir_subpixel_arrangement_unknown, |
684 | {}, |
685 | mir_output_gamma_unsupported, |
686 | + {}, |
687 | {} |
688 | }, |
689 | { |
690 | @@ -322,6 +323,7 @@ |
691 | mir_subpixel_arrangement_unknown, |
692 | {}, |
693 | mir_output_gamma_unsupported, |
694 | + {}, |
695 | {} |
696 | }, |
697 | { |
698 | @@ -344,6 +346,7 @@ |
699 | mir_subpixel_arrangement_unknown, |
700 | {}, |
701 | mir_output_gamma_unsupported, |
702 | + {}, |
703 | {} |
704 | } |
705 | }; |
706 | @@ -577,6 +580,7 @@ |
707 | mir_subpixel_arrangement_unknown, |
708 | {}, |
709 | mir_output_gamma_unsupported, |
710 | + {}, |
711 | {} |
712 | }, |
713 | { |
714 | @@ -599,6 +603,7 @@ |
715 | mir_subpixel_arrangement_unknown, |
716 | {}, |
717 | mir_output_gamma_unsupported, |
718 | + {}, |
719 | {} |
720 | }, |
721 | }; |
722 | @@ -625,6 +630,7 @@ |
723 | mir_subpixel_arrangement_unknown, |
724 | {}, |
725 | mir_output_gamma_unsupported, |
726 | + {}, |
727 | {} |
728 | }, |
729 | { |
730 | @@ -647,6 +653,7 @@ |
731 | mir_subpixel_arrangement_unknown, |
732 | {}, |
733 | mir_output_gamma_unsupported, |
734 | + {}, |
735 | {} |
736 | }, |
737 | }; |
738 | @@ -794,6 +801,7 @@ |
739 | mir_subpixel_arrangement_unknown, |
740 | {}, |
741 | mir_output_gamma_unsupported, |
742 | + {}, |
743 | {} |
744 | }, |
745 | }; |
746 | @@ -822,6 +830,7 @@ |
747 | mir_subpixel_arrangement_unknown, |
748 | {}, |
749 | mir_output_gamma_unsupported, |
750 | + {}, |
751 | {} |
752 | }, |
753 | }; |
754 | |
755 | === modified file 'tests/unit-tests/platforms/nested/mir_display_configuration_builder.cpp' |
756 | --- tests/unit-tests/platforms/nested/mir_display_configuration_builder.cpp 2017-02-17 07:35:08 +0000 |
757 | +++ tests/unit-tests/platforms/nested/mir_display_configuration_builder.cpp 2017-04-13 08:26:06 +0000 |
758 | @@ -83,6 +83,10 @@ |
759 | output->set_edid(valid_edid, sizeof(valid_edid)); |
760 | output->set_subpixel_arrangement(mir_subpixel_arrangement_horizontal_rgb); |
761 | |
762 | + auto const& current_mode = output->mode(output->current_mode()); |
763 | + output->set_logical_width(current_mode.horizontal_resolution()); |
764 | + output->set_logical_height(current_mode.vertical_resolution()); |
765 | + |
766 | return std::make_shared<MirDisplayConfig>(conf); |
767 | } |
768 | |
769 | @@ -123,6 +127,10 @@ |
770 | output->set_orientation(mir_orientation_normal); |
771 | output->set_edid(valid_edid, sizeof(valid_edid)); |
772 | output->set_subpixel_arrangement(mir_subpixel_arrangement_horizontal_rgb); |
773 | + |
774 | + auto const& current_mode = output->mode(output->current_mode()); |
775 | + output->set_logical_width(current_mode.horizontal_resolution()); |
776 | + output->set_logical_height(current_mode.vertical_resolution()); |
777 | } |
778 | |
779 | return std::make_shared<MirDisplayConfig>(conf); |