Mir

Merge lp:~vanvugt/mir/set-logical-size into lp:mir

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
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.

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);

Subscribers

People subscribed via source and target branches