Mir

Merge lp:~andreas-pokorny/mir/add-pixel-format-to-display-configuration into lp:mir/0.1

Proposed by Andreas Pokorny
Status: Superseded
Proposed branch: lp:~andreas-pokorny/mir/add-pixel-format-to-display-configuration
Merge into: lp:mir/0.1
Diff against target: 2751 lines (+957/-452)
58 files modified
benchmarks/CMakeLists.txt (+3/-1)
doc/building_source_for_android.md (+21/-32)
examples/demo-shell/window_manager.cpp (+2/-1)
examples/server_configuration.cpp (+8/-4)
include/platform/mir/graphics/display_configuration.h (+3/-3)
include/platform/mir/graphics/pixel_format_utils.h (+50/-0)
include/platform/mir/graphics/platform.h (+1/-1)
include/shared/mir/logging/input_timestamp.h (+35/-0)
include/shared/mir_toolkit/client_types.h (+1/-1)
include/test/mir_test_doubles/mock_surface_renderer.h (+2/-1)
include/test/mir_test_doubles/null_display_configuration.h (+1/-1)
include/test/mir_test_doubles/stub_display_configuration.h (+6/-5)
src/client/display_configuration.cpp (+1/-1)
src/client/logging/input_receiver_report.cpp (+3/-2)
src/platform/graphics/CMakeLists.txt (+1/-0)
src/platform/graphics/android/android_display_configuration.cpp (+4/-2)
src/platform/graphics/android/android_display_configuration.h (+1/-1)
src/platform/graphics/mesa/real_kms_display_configuration.cpp (+64/-40)
src/platform/graphics/mesa/real_kms_display_configuration.h (+2/-2)
src/platform/graphics/pixel_format_utils.cpp (+71/-0)
src/server/compositor/default_display_buffer_compositor.cpp (+2/-1)
src/server/compositor/gl_renderer.cpp (+28/-33)
src/server/compositor/gl_renderer.h (+12/-22)
src/server/compositor/renderer.h (+2/-1)
src/server/frontend/protobuf_buffer_packer.cpp (+1/-1)
src/server/frontend/session_mediator.cpp (+3/-1)
src/server/graphics/default_display_configuration_policy.cpp (+54/-19)
src/server/graphics/nested/nested_display.cpp (+42/-57)
src/server/graphics/nested/nested_display.h (+6/-5)
src/server/graphics/nested/nested_display_configuration.cpp (+35/-10)
src/server/graphics/nested/nested_display_configuration.h (+1/-1)
src/server/graphics/nested/nested_output.cpp (+3/-2)
src/server/graphics/nested/nested_output.h (+2/-1)
src/server/graphics/nested/nested_platform.cpp (+2/-2)
src/server/graphics/nested/nested_platform.h (+5/-5)
src/server/graphics/offscreen/display_configuration.cpp (+4/-2)
src/server/graphics/offscreen/display_configuration.h (+4/-4)
src/server/logging/input_report.cpp (+4/-3)
src/server/scene/mediating_display_changer.cpp (+1/-0)
src/shared/logging/CMakeLists.txt (+1/-0)
src/shared/logging/input_timestamp.cpp (+41/-0)
tests/acceptance-tests/test_server_shutdown.cpp (+5/-1)
tests/integration-tests/test_session.cpp (+4/-1)
tests/integration-tests/test_surface_first_frame_sync.cpp (+5/-1)
tests/mir_test/display_config_matchers.cpp (+2/-2)
tests/mir_test_framework/stubbed_server_configuration.cpp (+6/-2)
tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp (+63/-2)
tests/unit-tests/frontend/test_session_mediator.cpp (+7/-3)
tests/unit-tests/graphics/CMakeLists.txt (+1/-0)
tests/unit-tests/graphics/android/test_android_fb.cpp (+22/-22)
tests/unit-tests/graphics/mesa/test_cursor.cpp (+7/-7)
tests/unit-tests/graphics/mesa/test_display_configuration.cpp (+7/-7)
tests/unit-tests/graphics/mesa/test_display_multi_monitor.cpp (+16/-6)
tests/unit-tests/graphics/mesa/test_overlapping_output_grouping.cpp (+2/-2)
tests/unit-tests/graphics/nested/test_nested_display_configuration.cpp (+27/-11)
tests/unit-tests/graphics/test_default_display_configuration_policy.cpp (+159/-116)
tests/unit-tests/graphics/test_display_configuration.cpp (+1/-1)
tests/unit-tests/graphics/test_pixel_format_utils.cpp (+90/-0)
To merge this branch: bzr merge lp:~andreas-pokorny/mir/add-pixel-format-to-display-configuration
Reviewer Review Type Date Requested Status
Mir development team Pending
Review via email: mp+200292@code.launchpad.net

This proposal has been superseded by a proposal from 2014-01-02.

Description of the change

Adds a mir pixel format parameter to DisplayConfiguration::configure_output

So within DisplayConfigurationPolicy the format can be specified for each output.
The pixel format parameter is still ignored by android and also mesa to some degree,
which only validates it. It is supported by nested display. The default configuration
policy implementation tries to select an opaque format though.

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 'benchmarks/CMakeLists.txt'
2--- benchmarks/CMakeLists.txt 2013-10-15 10:10:05 +0000
3+++ benchmarks/CMakeLists.txt 2014-01-02 11:14:12 +0000
4@@ -2,7 +2,9 @@
5 benchmarks
6 )
7
8-add_subdirectory(android-input)
9+if (MIR_ENABLE_TESTS)
10+ add_subdirectory(android-input)
11+endif ()
12 add_subdirectory(cpu)
13 add_subdirectory(memory)
14
15
16=== modified file 'doc/building_source_for_android.md'
17--- doc/building_source_for_android.md 2013-12-17 18:24:51 +0000
18+++ doc/building_source_for_android.md 2014-01-02 11:14:12 +0000
19@@ -51,35 +51,24 @@
20 ubuntu package) to produce armhf code. This is typically the quickest way to
21 compile and run code, and is well suited for a development workflow.
22
23-- Be sure that the cross compiler that you are using matches the target
24- environment. (eg, make sure you're using the trusty toolchain if you're
25- targeting a trusty phablet image) You can specify the toolchain version
26- thusly:
27-
28- $ apt-get install g++-arm-linux-gnueabihf/trusty
29-
30-- Get access to armhf packages via apt-get. On an amd64/ia32 system, you can
31- do this by adding a file like the one below to /etc/apt/sources.list.d/
32-
33- #example sources.list with armhf dependencies
34- deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe multiverse
35-
36- Then you should run:
37-
38- $ apt-get update
39-
40- To test, try downloading a package like this:
41-
42- $ apt-get download my-package:armhf
43-
44-- Once you're able to download armhf packages from the repository, the
45- cross-compile-chroot.sh script provides an example of how to download
46- a partial chroot with the mir dependencies, and compile the source for
47- android targets.
48-
49- The script sets up a partial chroot via tools/setup-partial-armhf-chroot.sh
50- and then runs build commands similar to this:
51-
52- $ mkdir mir/build; cd mir/build
53- $ MIR_NDK_PATH=/path/to/depenendcies/chroot cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/LinuxCrossCompile.cmake -DBoost_COMPILER=-gcc -DMIR_PLATFORM=android ..
54- $ make
55+Initial setup of a desktop machine for cross-compiling to armhf is simple:
56+
57+ $ sudo apt-get install g++-arm-linux-gnueabihf/trusty debootstrap
58+ $ sudo sh -c 'echo "deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe multiverse" > /etc/apt/sources.list.d/armhf-xcompile.list'
59+ $ sudo apt-get update
60+
61+Now to test that everything is working you can try downloading a package like
62+this:
63+
64+ $ apt-get download gcc:armhf
65+
66+Once you're able to download armhf packages from the repository, the
67+cross-compile-chroot.sh script provides an example of how to build Mir for
68+armhf:
69+
70+ $ ./cross-compile-chroot.sh
71+ $ ls -l build-android-arm/* # binaries to copy to your device
72+
73+To speed up the process for future branches you may wish to cache the files
74+downloaded by setting environment variable MIR_NDK_PATH to point to a directory
75+that cross-compile-chroot.sh should reuse each time.
76
77=== modified file 'examples/demo-shell/window_manager.cpp'
78--- examples/demo-shell/window_manager.cpp 2013-12-17 18:24:51 +0000
79+++ examples/demo-shell/window_manager.cpp 2014-01-02 11:14:12 +0000
80@@ -151,8 +151,9 @@
81 power_mode = mir_power_mode_off;
82
83 conf->configure_output(output.id, output.used,
84- output.top_left,
85+ output.top_left,
86 output.current_mode_index,
87+ output.current_format,
88 power_mode);
89 });
90 display_off = !display_off;
91
92=== modified file 'examples/server_configuration.cpp'
93--- examples/server_configuration.cpp 2013-10-21 10:40:19 +0000
94+++ examples/server_configuration.cpp 2014-01-02 11:14:12 +0000
95@@ -61,14 +61,16 @@
96 available_outputs_for_card[conf_output.card_id] > 0)
97 {
98 conf.configure_output(conf_output.id, true, geom::Point{max_x, 0},
99- preferred_mode_index, mir_power_mode_on);
100+ preferred_mode_index, conf_output.current_format,
101+ mir_power_mode_on);
102 max_x += conf_output.modes[preferred_mode_index].size.width.as_int();
103 --available_outputs_for_card[conf_output.card_id];
104 }
105 else
106 {
107 conf.configure_output(conf_output.id, false, conf_output.top_left,
108- conf_output.current_mode_index, mir_power_mode_on);
109+ conf_output.current_mode_index, conf_output.current_format,
110+ mir_power_mode_on);
111 }
112 });
113 }
114@@ -88,13 +90,15 @@
115 if (!done && conf_output.connected && conf_output.modes.size() > 0)
116 {
117 conf.configure_output(conf_output.id, true, geom::Point{0, 0},
118- preferred_mode_index, mir_power_mode_on);
119+ preferred_mode_index, conf_output.current_format,
120+ mir_power_mode_on);
121 done = true;
122 }
123 else
124 {
125 conf.configure_output(conf_output.id, false, conf_output.top_left,
126- conf_output.current_mode_index, mir_power_mode_on);
127+ conf_output.current_mode_index, conf_output.current_format,
128+ mir_power_mode_on);
129 }
130 });
131 }
132
133=== modified file 'include/platform/mir/graphics/display_configuration.h'
134--- include/platform/mir/graphics/display_configuration.h 2013-12-17 18:24:51 +0000
135+++ include/platform/mir/graphics/display_configuration.h 2014-01-02 11:14:12 +0000
136@@ -104,7 +104,7 @@
137 /** The index in the 'modes' vector of the current output mode. */
138 size_t current_mode_index;
139 /** The index in the 'pixel_format' vector of the current output pixel format. */
140- size_t current_format_index;
141+ MirPixelFormat current_format;
142 /** Current power mode **/
143 MirPowerMode power_mode;
144 };
145@@ -135,8 +135,8 @@
146 virtual void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const = 0;
147
148 /** Configures an output. */
149- virtual void configure_output(DisplayConfigurationOutputId id, bool used,
150- geometry::Point top_left, size_t mode_index, MirPowerMode power_mode) = 0;
151+ virtual void configure_output(DisplayConfigurationOutputId id, bool used, geometry::Point top_left,
152+ size_t mode_index, MirPixelFormat format, MirPowerMode power_mode) = 0;
153
154 protected:
155 DisplayConfiguration() = default;
156
157=== added file 'include/platform/mir/graphics/pixel_format_utils.h'
158--- include/platform/mir/graphics/pixel_format_utils.h 1970-01-01 00:00:00 +0000
159+++ include/platform/mir/graphics/pixel_format_utils.h 2014-01-02 11:14:12 +0000
160@@ -0,0 +1,50 @@
161+/*
162+ * Copyright © 2013 Canonical Ltd.
163+ *
164+ * This program is free software: you can redistribute it and/or modify it
165+ * under the terms of the GNU Lesser General Public License version 3,
166+ * as published by the Free Software Foundation.
167+ *
168+ * This program is distributed in the hope that it will be useful,
169+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
170+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
171+ * GNU Lesser General Public License for more details.
172+ *
173+ * You should have received a copy of the GNU Lesser General Public License
174+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
175+ *
176+ * Authored by: Andreas Pokorny <andreas.pokorny@canonical.com>
177+ */
178+
179+#ifndef MIR_GRAPHICS_PIXEL_FORMAT_UTILS_H_
180+#define MIR_GRAPHICS_PIXEL_FORMAT_UTILS_H_
181+
182+#include "mir_toolkit/common.h"
183+
184+namespace mir
185+{
186+namespace graphics
187+{
188+
189+/*!
190+ * \name MirPixelFormat utility functions
191+ *
192+ * A set of functions to query details of MirPixelFormat
193+ * TODO improve this through https://bugs.launchpad.net/mir/+bug/1236254
194+ * \{
195+ */
196+bool contains_alpha(MirPixelFormat format);
197+int red_channel_depth(MirPixelFormat format);
198+int blue_channel_depth(MirPixelFormat format);
199+int green_channel_depth(MirPixelFormat format);
200+int alpha_channel_depth(MirPixelFormat format);
201+bool valid_mir_pixel_format(MirPixelFormat format);
202+/*!
203+ * \}
204+ */
205+
206+
207+}
208+}
209+
210+#endif
211
212=== modified file 'include/platform/mir/graphics/platform.h'
213--- include/platform/mir/graphics/platform.h 2013-12-17 18:24:51 +0000
214+++ include/platform/mir/graphics/platform.h 2014-01-02 11:14:12 +0000
215@@ -81,7 +81,7 @@
216 * Creates the display subsystem.
217 */
218 virtual std::shared_ptr<Display> create_display(
219- std::shared_ptr<DisplayConfigurationPolicy> const& initial_conf_policy) = 0;
220+ std::shared_ptr<DisplayConfigurationPolicy> const& initial_conf_policy) = 0;
221
222 /**
223 * Gets the IPC package for the platform.
224
225=== added file 'include/shared/mir/logging/input_timestamp.h'
226--- include/shared/mir/logging/input_timestamp.h 1970-01-01 00:00:00 +0000
227+++ include/shared/mir/logging/input_timestamp.h 2014-01-02 11:14:12 +0000
228@@ -0,0 +1,35 @@
229+/*
230+ * Copyright © 2013 Canonical Ltd.
231+ *
232+ * This program is free software: you can redistribute it and/or modify it
233+ * under the terms of the GNU Lesser General Public License version 3,
234+ * as published by the Free Software Foundation.
235+ *
236+ * This program is distributed in the hope that it will be useful,
237+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
238+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
239+ * GNU Lesser General Public License for more details.
240+ *
241+ * You should have received a copy of the GNU Lesser General Public License
242+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
243+ *
244+ * Authored by: Daniel van Vugt <daniel.van.vugt@canonical.com>
245+ */
246+
247+#ifndef MIR_LOGGING_INPUT_TIMESTAMP_H_
248+#define MIR_LOGGING_INPUT_TIMESTAMP_H_
249+
250+#include "mir_toolkit/event.h"
251+#include <string>
252+
253+namespace mir
254+{
255+namespace logging
256+{
257+
258+std::string input_timestamp(nsecs_t when);
259+
260+}
261+}
262+
263+#endif // MIR_LOGGING_INPUT_TIMESTAMP_H_
264
265=== modified file 'include/shared/mir_toolkit/client_types.h'
266--- include/shared/mir_toolkit/client_types.h 2013-12-17 18:24:51 +0000
267+++ include/shared/mir_toolkit/client_types.h 2014-01-02 11:14:12 +0000
268@@ -230,7 +230,7 @@
269
270 uint32_t num_output_formats;
271 MirPixelFormat* output_formats;
272- uint32_t current_output_format;
273+ MirPixelFormat current_output_format;
274
275 uint32_t card_id;
276 uint32_t output_id;
277
278=== modified file 'include/test/mir_test_doubles/mock_surface_renderer.h'
279--- include/test/mir_test_doubles/mock_surface_renderer.h 2013-12-17 18:24:51 +0000
280+++ include/test/mir_test_doubles/mock_surface_renderer.h 2014-01-02 11:14:12 +0000
281@@ -31,8 +31,9 @@
282
283 struct MockSurfaceRenderer : public compositor::Renderer
284 {
285+ MOCK_CONST_METHOD0(begin, void());
286 MOCK_CONST_METHOD2(render, void(compositor::CompositingCriteria const&, graphics::Buffer&));
287- MOCK_CONST_METHOD0(clear, void());
288+ MOCK_CONST_METHOD0(end, void());
289
290 ~MockSurfaceRenderer() noexcept {}
291 };
292
293=== modified file 'include/test/mir_test_doubles/null_display_configuration.h'
294--- include/test/mir_test_doubles/null_display_configuration.h 2013-09-12 21:36:55 +0000
295+++ include/test/mir_test_doubles/null_display_configuration.h 2014-01-02 11:14:12 +0000
296@@ -35,7 +35,7 @@
297 void for_each_output(std::function<void(graphics::DisplayConfigurationOutput const&)>) const
298 {
299 }
300- void configure_output(graphics::DisplayConfigurationOutputId, bool, geometry::Point, size_t, MirPowerMode) override
301+ void configure_output(graphics::DisplayConfigurationOutputId, bool, geometry::Point, size_t, MirPixelFormat, MirPowerMode) override
302 {
303 }
304 };
305
306=== modified file 'include/test/mir_test_doubles/stub_display_configuration.h'
307--- include/test/mir_test_doubles/stub_display_configuration.h 2013-12-17 18:24:51 +0000
308+++ include/test/mir_test_doubles/stub_display_configuration.h 2014-01-02 11:14:12 +0000
309@@ -79,7 +79,7 @@
310 ((i % 2) == 0),
311 ((i % 2) == 1),
312 top_left,
313- mode_index, 1u,
314+ mode_index, pfs[1u],
315 mir_power_mode_off
316 };
317
318@@ -107,7 +107,8 @@
319 graphics::DisplayConfigurationOutputType::vga,
320 std::vector<MirPixelFormat>{mir_pixel_format_abgr_8888},
321 {{rect.size, 60.0}},
322- 0, geometry::Size{}, true, true, rect.top_left, 0, 0, mir_power_mode_on
323+ 0, geometry::Size{}, true, true, rect.top_left, 0,
324+ mir_pixel_format_abgr_8888, mir_power_mode_on
325 };
326
327 outputs.push_back(output);
328@@ -122,13 +123,13 @@
329 cards.push_back(card);
330 }
331
332- void for_each_card(std::function<void(graphics::DisplayConfigurationCard const&)> f) const
333+ void for_each_card(std::function<void(graphics::DisplayConfigurationCard const&)> f) const override
334 {
335 for (auto const& card : cards)
336 f(card);
337 }
338
339- void for_each_output(std::function<void(graphics::DisplayConfigurationOutput const&)> f) const
340+ void for_each_output(std::function<void(graphics::DisplayConfigurationOutput const&)> f) const override
341 {
342 for (auto& disp : outputs)
343 {
344@@ -136,7 +137,7 @@
345 }
346 }
347
348- void configure_output(graphics::DisplayConfigurationOutputId, bool, geometry::Point, size_t, MirPowerMode)
349+ void configure_output(graphics::DisplayConfigurationOutputId, bool, geometry::Point, size_t, MirPixelFormat, MirPowerMode) override
350 {
351 }
352
353
354=== modified file 'src/client/display_configuration.cpp'
355--- src/client/display_configuration.cpp 2013-12-17 18:24:51 +0000
356+++ src/client/display_configuration.cpp 2014-01-02 11:14:12 +0000
357@@ -88,7 +88,7 @@
358 {
359 output.output_formats[i] = static_cast<MirPixelFormat>(msg.pixel_format(i));
360 }
361- output.current_output_format = msg.current_format();
362+ output.current_output_format = static_cast<MirPixelFormat>(msg.current_format());
363
364 output.position_x = msg.position_x();
365 output.position_y = msg.position_y();
366
367=== modified file 'src/client/logging/input_receiver_report.cpp'
368--- src/client/logging/input_receiver_report.cpp 2013-12-17 18:24:51 +0000
369+++ src/client/logging/input_receiver_report.cpp 2014-01-02 11:14:12 +0000
370@@ -19,6 +19,7 @@
371 #include "input_receiver_report.h"
372
373 #include "mir/logging/logger.h"
374+#include "mir/logging/input_timestamp.h"
375
376 #include <boost/throw_exception.hpp>
377
378@@ -53,7 +54,7 @@
379 ss << " scan_code: " << ev.scan_code << std::endl;
380 ss << " repeat_count: " << ev.repeat_count << std::endl;
381 ss << " down_time: " << ev.down_time << std::endl;
382- ss << " event_time: " << ev.event_time << std::endl;
383+ ss << " event_time: " << ml::input_timestamp(ev.event_time) << std::endl;
384 ss << " is_system_key: " << ev.is_system_key << std::endl;
385 ss << "}";
386 }
387@@ -73,7 +74,7 @@
388 ss << " x_precision: " << ev.x_precision << std::endl;
389 ss << " y_precision: " << ev.y_precision << std::endl;
390 ss << " down_time: " << ev.down_time << std::endl;
391- ss << " event_time: " << ev.event_time << std::endl;
392+ ss << " event_time: " << ml::input_timestamp(ev.event_time) << std::endl;
393 ss << " pointer_count: " << ev.pointer_count << std::endl;
394 for (unsigned int i = 0; i < ev.pointer_count; i++)
395 {
396
397=== modified file 'src/platform/graphics/CMakeLists.txt'
398--- src/platform/graphics/CMakeLists.txt 2013-12-17 18:24:51 +0000
399+++ src/platform/graphics/CMakeLists.txt 2014-01-02 11:14:12 +0000
400@@ -10,6 +10,7 @@
401 display_configuration.cpp
402 null_display_report.cpp
403 buffer_basic.cpp
404+ pixel_format_utils.cpp
405 )
406
407 add_library(
408
409=== modified file 'src/platform/graphics/android/android_display_configuration.cpp'
410--- src/platform/graphics/android/android_display_configuration.cpp 2013-12-17 18:24:51 +0000
411+++ src/platform/graphics/android/android_display_configuration.cpp 2014-01-02 11:14:12 +0000
412@@ -31,7 +31,9 @@
413 true,
414 true,
415 geom::Point{0,0},
416- 0, 0, mir_power_mode_on},
417+ 0,
418+ mir_pixel_format_abgr_8888,
419+ mir_power_mode_on},
420 card{mg::DisplayConfigurationCardId{0}, 1}
421 {
422 }
423@@ -62,7 +64,7 @@
424 f(configuration);
425 }
426
427-void mga::AndroidDisplayConfiguration::configure_output(mg::DisplayConfigurationOutputId, bool, geom::Point, size_t, MirPowerMode power_mode)
428+void mga::AndroidDisplayConfiguration::configure_output(mg::DisplayConfigurationOutputId, bool, geom::Point, size_t, MirPixelFormat, MirPowerMode power_mode)
429 {
430 configuration.power_mode = power_mode;
431 }
432
433=== modified file 'src/platform/graphics/android/android_display_configuration.h'
434--- src/platform/graphics/android/android_display_configuration.h 2013-12-17 18:24:51 +0000
435+++ src/platform/graphics/android/android_display_configuration.h 2014-01-02 11:14:12 +0000
436@@ -37,7 +37,7 @@
437
438 void for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const;
439 void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const;
440- void configure_output(DisplayConfigurationOutputId, bool, geometry::Point, size_t, MirPowerMode power_mode);
441+ void configure_output(DisplayConfigurationOutputId, bool, geometry::Point, size_t, MirPixelFormat, MirPowerMode power_mode);
442
443 private:
444 DisplayConfigurationOutput configuration;
445
446=== modified file 'src/platform/graphics/mesa/real_kms_display_configuration.cpp'
447--- src/platform/graphics/mesa/real_kms_display_configuration.cpp 2013-12-17 18:24:51 +0000
448+++ src/platform/graphics/mesa/real_kms_display_configuration.cpp 2014-01-02 11:14:12 +0000
449@@ -18,6 +18,7 @@
450
451 #include "real_kms_display_configuration.h"
452 #include "drm_mode_resources.h"
453+#include "mir/graphics/pixel_format_utils.h"
454
455 #include <cmath>
456 #include <limits>
457@@ -26,9 +27,15 @@
458 #include <stdexcept>
459 #include <algorithm>
460
461-namespace mg = mir::graphics;
462-namespace mgm = mir::graphics::mesa;
463-namespace geom = mir::geometry;
464+
465+namespace mir
466+{
467+namespace graphics
468+{
469+namespace mesa
470+{
471+
472+namespace geom = geometry;
473
474 namespace
475 {
476@@ -59,28 +66,33 @@
477 return round(vrefresh_hz * 10.0) / 10.0;
478 }
479
480-mg::DisplayConfigurationOutputType
481+DisplayConfigurationOutputType
482 kms_connector_type_to_output_type(uint32_t connector_type)
483 {
484- return static_cast<mg::DisplayConfigurationOutputType>(connector_type);
485-}
486-
487-}
488-
489-mgm::RealKMSDisplayConfiguration::RealKMSDisplayConfiguration(int drm_fd)
490+ return static_cast<DisplayConfigurationOutputType>(connector_type);
491+}
492+
493+bool format_available_in_pixel_formats(MirPixelFormat format, DisplayConfigurationOutput const& output)
494+{
495+ return output.pixel_formats.end() != find(output.pixel_formats.begin(), output.pixel_formats.end(), format);
496+}
497+
498+}
499+
500+RealKMSDisplayConfiguration::RealKMSDisplayConfiguration(int drm_fd)
501 : drm_fd{drm_fd}
502 {
503 update();
504 }
505
506-mgm::RealKMSDisplayConfiguration::RealKMSDisplayConfiguration(
507+RealKMSDisplayConfiguration::RealKMSDisplayConfiguration(
508 RealKMSDisplayConfiguration const& conf)
509 : KMSDisplayConfiguration(), drm_fd{conf.drm_fd},
510 card(conf.card), outputs{conf.outputs}
511 {
512 }
513
514-mgm::RealKMSDisplayConfiguration& mgm::RealKMSDisplayConfiguration::operator=(
515+RealKMSDisplayConfiguration& RealKMSDisplayConfiguration::operator=(
516 RealKMSDisplayConfiguration const& conf)
517 {
518 if (&conf != this)
519@@ -93,23 +105,23 @@
520 return *this;
521 }
522
523-void mgm::RealKMSDisplayConfiguration::for_each_card(
524+void RealKMSDisplayConfiguration::for_each_card(
525 std::function<void(DisplayConfigurationCard const&)> f) const
526 {
527 f(card);
528 }
529
530-void mgm::RealKMSDisplayConfiguration::for_each_output(
531+void RealKMSDisplayConfiguration::for_each_output(
532 std::function<void(DisplayConfigurationOutput const&)> f) const
533 {
534 for (auto const& output : outputs)
535 f(output);
536 }
537
538-void mgm::RealKMSDisplayConfiguration::configure_output(
539+void RealKMSDisplayConfiguration::configure_output(
540 DisplayConfigurationOutputId id, bool used,
541 geometry::Point top_left, size_t mode_index,
542- MirPowerMode power_mode)
543+ MirPixelFormat format, MirPowerMode power_mode)
544 {
545 auto iter = find_output_with_id(id);
546
547@@ -120,9 +132,15 @@
548 if (used && mode_index >= output.modes.size())
549 BOOST_THROW_EXCEPTION(std::runtime_error("Invalid mode_index for used output"));
550
551+ if (used && !valid_mir_pixel_format(format))
552+ BOOST_THROW_EXCEPTION(std::runtime_error("Invalid format for used output"));
553+ if (used && !format_available_in_pixel_formats(format, output))
554+ BOOST_THROW_EXCEPTION(std::runtime_error("Format not available for used output"));
555+
556 output.used = used;
557 output.top_left = top_left;
558 output.current_mode_index = mode_index;
559+ output.current_format = format;
560 output.power_mode = power_mode;
561 }
562 else
563@@ -131,7 +149,7 @@
564 }
565 }
566
567-uint32_t mgm::RealKMSDisplayConfiguration::get_kms_connector_id(
568+uint32_t RealKMSDisplayConfiguration::get_kms_connector_id(
569 DisplayConfigurationOutputId id) const
570 {
571 auto iter = find_output_with_id(id);
572@@ -145,7 +163,7 @@
573 return id.as_value();
574 }
575
576-size_t mgm::RealKMSDisplayConfiguration::get_kms_mode_index(
577+size_t RealKMSDisplayConfiguration::get_kms_mode_index(
578 DisplayConfigurationOutputId id,
579 size_t conf_mode_index) const
580 {
581@@ -159,12 +177,12 @@
582
583 return conf_mode_index;
584 }
585-void mgm::RealKMSDisplayConfiguration::update()
586+void RealKMSDisplayConfiguration::update()
587 {
588 DRMModeResources resources{drm_fd};
589
590 size_t max_outputs = std::min(resources.num_crtcs(), resources.num_connectors());
591- card = {mg::DisplayConfigurationCardId{0}, max_outputs};
592+ card = {DisplayConfigurationCardId{0}, max_outputs};
593
594 resources.for_each_connector([&](DRMModeConnectorUPtr connector)
595 {
596@@ -172,7 +190,7 @@
597 });
598 }
599
600-void mgm::RealKMSDisplayConfiguration::add_or_update_output(
601+void RealKMSDisplayConfiguration::add_or_update_output(
602 DRMModeResources const& resources,
603 drmModeConnector const& connector)
604 {
605@@ -224,7 +242,8 @@
606 {
607 outputs.push_back({id, card_id, type, formats, modes, preferred_mode_index,
608 physical_size, connected, false, geom::Point(),
609- current_mode_index, 0u, mir_power_mode_on});
610+ current_mode_index, mir_pixel_format_xrgb_8888,
611+ mir_power_mode_on});
612 }
613 else
614 {
615@@ -235,25 +254,30 @@
616 output.physical_size_mm = physical_size;
617 output.connected = connected;
618 output.current_mode_index = current_mode_index;
619+ output.current_format = mir_pixel_format_xrgb_8888;
620 }
621 }
622
623-std::vector<mg::DisplayConfigurationOutput>::iterator
624-mgm::RealKMSDisplayConfiguration::find_output_with_id(DisplayConfigurationOutputId id)
625-{
626- return std::find_if(outputs.begin(), outputs.end(),
627- [id](DisplayConfigurationOutput const& output)
628- {
629- return output.id == id;
630- });
631-}
632-
633-std::vector<mg::DisplayConfigurationOutput>::const_iterator
634-mgm::RealKMSDisplayConfiguration::find_output_with_id(DisplayConfigurationOutputId id) const
635-{
636- return std::find_if(outputs.begin(), outputs.end(),
637- [id](DisplayConfigurationOutput const& output)
638- {
639- return output.id == id;
640- });
641+std::vector<DisplayConfigurationOutput>::iterator
642+RealKMSDisplayConfiguration::find_output_with_id(DisplayConfigurationOutputId id)
643+{
644+ return std::find_if(outputs.begin(), outputs.end(),
645+ [id](DisplayConfigurationOutput const& output)
646+ {
647+ return output.id == id;
648+ });
649+}
650+
651+std::vector<DisplayConfigurationOutput>::const_iterator
652+RealKMSDisplayConfiguration::find_output_with_id(DisplayConfigurationOutputId id) const
653+{
654+ return std::find_if(outputs.begin(), outputs.end(),
655+ [id](DisplayConfigurationOutput const& output)
656+ {
657+ return output.id == id;
658+ });
659+}
660+
661+}
662+}
663 }
664
665=== modified file 'src/platform/graphics/mesa/real_kms_display_configuration.h'
666--- src/platform/graphics/mesa/real_kms_display_configuration.h 2013-12-17 18:24:51 +0000
667+++ src/platform/graphics/mesa/real_kms_display_configuration.h 2014-01-02 11:14:12 +0000
668@@ -39,8 +39,8 @@
669
670 void for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const;
671 void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const;
672- void configure_output(DisplayConfigurationOutputId id, bool used,
673- geometry::Point top_left, size_t mode_index, MirPowerMode power_mode);
674+ void configure_output(DisplayConfigurationOutputId id, bool used, geometry::Point top_left,
675+ size_t mode_index, MirPixelFormat format, MirPowerMode power_mode);
676
677 uint32_t get_kms_connector_id(DisplayConfigurationOutputId id) const;
678 size_t get_kms_mode_index(DisplayConfigurationOutputId id, size_t conf_mode_index) const;
679
680=== added file 'src/platform/graphics/pixel_format_utils.cpp'
681--- src/platform/graphics/pixel_format_utils.cpp 1970-01-01 00:00:00 +0000
682+++ src/platform/graphics/pixel_format_utils.cpp 2014-01-02 11:14:12 +0000
683@@ -0,0 +1,71 @@
684+/*
685+ * Copyright © 2013 Canonical Ltd.
686+ *
687+ * This program is free software: you can redistribute it and/or modify it
688+ * under the terms of the GNU Lesser General Public License version 3,
689+ * as published by the Free Software Foundation.
690+ *
691+ * This program is distributed in the hope that it will be useful,
692+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
693+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
694+ * GNU Lesser General Public License for more details.
695+ *
696+ * You should have received a copy of the GNU Lesser General Public License
697+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
698+ *
699+ * Authored by: Andreas Pokorny <andreas.pokorny@canonical.com>
700+ */
701+
702+#include "mir/graphics/pixel_format_utils.h"
703+
704+namespace mir
705+{
706+namespace graphics
707+{
708+
709+bool contains_alpha(MirPixelFormat format)
710+{
711+ return (format == mir_pixel_format_abgr_8888 ||
712+ format == mir_pixel_format_argb_8888);
713+}
714+
715+int red_channel_depth(MirPixelFormat format)
716+{
717+ if (mir_pixel_format_invalid < format &&
718+ format < mir_pixel_formats)
719+ return 8;
720+ return 0;
721+}
722+
723+int blue_channel_depth(MirPixelFormat format)
724+{
725+ if (mir_pixel_format_invalid < format &&
726+ format < mir_pixel_formats)
727+ return 8;
728+ return 0;
729+}
730+
731+int green_channel_depth(MirPixelFormat format)
732+{
733+ if (mir_pixel_format_invalid < format &&
734+ format < mir_pixel_formats)
735+ return 8;
736+ return 0;
737+}
738+
739+int alpha_channel_depth(MirPixelFormat format)
740+{
741+ if (format == mir_pixel_format_abgr_8888 ||
742+ format == mir_pixel_format_argb_8888)
743+ return 8;
744+ return 0;
745+}
746+
747+bool valid_mir_pixel_format(MirPixelFormat format)
748+{
749+ return (format > mir_pixel_format_invalid &&
750+ format < mir_pixel_formats);
751+}
752+
753+}
754+}
755
756=== modified file 'src/server/compositor/default_display_buffer_compositor.cpp'
757--- src/server/compositor/default_display_buffer_compositor.cpp 2013-12-17 18:24:51 +0000
758+++ src/server/compositor/default_display_buffer_compositor.cpp 2014-01-02 11:14:12 +0000
759@@ -135,10 +135,11 @@
760 mc::OcclusionMatch occlusion_match;
761 scene->reverse_for_each_if(occlusion_search, occlusion_match);
762
763- renderer->clear();
764+ renderer->begin();
765 mc::RenderingOperator applicator(*renderer, save_resource, local_frameno);
766 FilterForVisibleSceneInRegion selector(view_area, occlusion_match);
767 scene->for_each_if(selector, applicator);
768+ renderer->end();
769
770 display_buffer.post_update();
771 }
772
773=== modified file 'src/server/compositor/gl_renderer.cpp'
774--- src/server/compositor/gl_renderer.cpp 2013-12-17 18:24:51 +0000
775+++ src/server/compositor/gl_renderer.cpp 2014-01-02 11:14:12 +0000
776@@ -117,7 +117,7 @@
777
778 }
779
780-mc::GLRenderer::Resources::Resources() :
781+mc::GLRenderer::GLRenderer(geom::Rectangle const& display_area) :
782 vertex_shader(0),
783 fragment_shader(0),
784 program(0),
785@@ -128,24 +128,6 @@
786 vertex_attribs_vbo(0),
787 texture(0)
788 {
789-}
790-
791-mc::GLRenderer::Resources::~Resources()
792-{
793- if (vertex_shader)
794- glDeleteShader(vertex_shader);
795- if (fragment_shader)
796- glDeleteShader(fragment_shader);
797- if (program)
798- glDeleteProgram(program);
799- if (vertex_attribs_vbo)
800- glDeleteBuffers(1, &vertex_attribs_vbo);
801- if (texture)
802- glDeleteTextures(1, &texture);
803-}
804-
805-void mc::GLRenderer::Resources::setup(geometry::Rectangle const& display_area)
806-{
807 GLint param = 0;
808
809 /* Create shaders and program */
810@@ -235,14 +217,23 @@
811 glUseProgram(0);
812 }
813
814-mc::GLRenderer::GLRenderer(geom::Rectangle const& display_area)
815+mc::GLRenderer::~GLRenderer() noexcept
816 {
817- resources.setup(display_area);
818+ if (vertex_shader)
819+ glDeleteShader(vertex_shader);
820+ if (fragment_shader)
821+ glDeleteShader(fragment_shader);
822+ if (program)
823+ glDeleteProgram(program);
824+ if (vertex_attribs_vbo)
825+ glDeleteBuffers(1, &vertex_attribs_vbo);
826+ if (texture)
827+ glDeleteTextures(1, &texture);
828 }
829
830 void mc::GLRenderer::render(CompositingCriteria const& criteria, mg::Buffer& buffer) const
831 {
832- glUseProgram(resources.program);
833+ glUseProgram(program);
834
835 if (criteria.shaped() || criteria.alpha() < 1.0f)
836 {
837@@ -255,32 +246,36 @@
838 }
839 glActiveTexture(GL_TEXTURE0);
840
841- glUniformMatrix4fv(resources.transform_uniform_loc, 1, GL_FALSE,
842+ glUniformMatrix4fv(transform_uniform_loc, 1, GL_FALSE,
843 glm::value_ptr(criteria.transformation()));
844- glUniform1f(resources.alpha_uniform_loc, criteria.alpha());
845+ glUniform1f(alpha_uniform_loc, criteria.alpha());
846
847 /* Set up vertex attribute data */
848- glBindBuffer(GL_ARRAY_BUFFER, resources.vertex_attribs_vbo);
849- glVertexAttribPointer(resources.position_attr_loc, 3, GL_FLOAT,
850+ glBindBuffer(GL_ARRAY_BUFFER, vertex_attribs_vbo);
851+ glVertexAttribPointer(position_attr_loc, 3, GL_FLOAT,
852 GL_FALSE, sizeof(VertexAttributes), 0);
853- glVertexAttribPointer(resources.texcoord_attr_loc, 2, GL_FLOAT,
854+ glVertexAttribPointer(texcoord_attr_loc, 2, GL_FLOAT,
855 GL_FALSE, sizeof(VertexAttributes),
856 reinterpret_cast<void*>(sizeof(glm::vec3)));
857
858 /* Use the renderable's texture */
859- glBindTexture(GL_TEXTURE_2D, resources.texture);
860+ glBindTexture(GL_TEXTURE_2D, texture);
861
862 buffer.bind_to_texture();
863
864 /* Draw */
865- glEnableVertexAttribArray(resources.position_attr_loc);
866- glEnableVertexAttribArray(resources.texcoord_attr_loc);
867+ glEnableVertexAttribArray(position_attr_loc);
868+ glEnableVertexAttribArray(texcoord_attr_loc);
869 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
870- glDisableVertexAttribArray(resources.texcoord_attr_loc);
871- glDisableVertexAttribArray(resources.position_attr_loc);
872+ glDisableVertexAttribArray(texcoord_attr_loc);
873+ glDisableVertexAttribArray(position_attr_loc);
874 }
875
876-void mc::GLRenderer::clear() const
877+void mc::GLRenderer::begin() const
878 {
879 glClear(GL_COLOR_BUFFER_BIT);
880 }
881+
882+void mc::GLRenderer::end() const
883+{
884+}
885
886=== modified file 'src/server/compositor/gl_renderer.h'
887--- src/server/compositor/gl_renderer.h 2013-12-17 18:24:51 +0000
888+++ src/server/compositor/gl_renderer.h 2014-01-02 11:14:12 +0000
889@@ -32,32 +32,22 @@
890 {
891 public:
892 GLRenderer(geometry::Rectangle const& display_area);
893+ virtual ~GLRenderer() noexcept;
894
895+ void begin() const override;
896 void render(CompositingCriteria const& info, graphics::Buffer& buffer) const override;
897- void clear() const override;
898-
899- ~GLRenderer() noexcept {}
900+ void end() const override;
901
902 private:
903- class Resources
904- {
905- public:
906- Resources();
907- ~Resources();
908- void setup(geometry::Rectangle const& display_area);
909-
910- GLuint vertex_shader;
911- GLuint fragment_shader;
912- GLuint program;
913- GLuint position_attr_loc;
914- GLuint texcoord_attr_loc;
915- GLuint transform_uniform_loc;
916- GLuint alpha_uniform_loc;
917- GLuint vertex_attribs_vbo;
918- GLuint texture;
919- };
920-
921- Resources resources;
922+ GLuint vertex_shader;
923+ GLuint fragment_shader;
924+ GLuint program;
925+ GLuint position_attr_loc;
926+ GLuint texcoord_attr_loc;
927+ GLuint transform_uniform_loc;
928+ GLuint alpha_uniform_loc;
929+ GLuint vertex_attribs_vbo;
930+ GLuint texture;
931 };
932
933 }
934
935=== modified file 'src/server/compositor/renderer.h'
936--- src/server/compositor/renderer.h 2013-12-17 18:24:51 +0000
937+++ src/server/compositor/renderer.h 2014-01-02 11:14:12 +0000
938@@ -34,8 +34,9 @@
939 public:
940 virtual ~Renderer() = default;
941
942- virtual void clear() const = 0;
943+ virtual void begin() const = 0;
944 virtual void render(CompositingCriteria const& info, graphics::Buffer& buffer) const = 0;
945+ virtual void end() const = 0;
946
947 protected:
948 Renderer() = default;
949
950=== modified file 'src/server/frontend/protobuf_buffer_packer.cpp'
951--- src/server/frontend/protobuf_buffer_packer.cpp 2013-12-17 18:24:51 +0000
952+++ src/server/frontend/protobuf_buffer_packer.cpp 2014-01-02 11:14:12 +0000
953@@ -64,7 +64,7 @@
954 protobuf_output.set_position_x(display_output.top_left.x.as_uint32_t());
955 protobuf_output.set_position_y(display_output.top_left.y.as_uint32_t());
956 protobuf_output.set_current_mode(display_output.current_mode_index);
957- protobuf_output.set_current_format(display_output.current_format_index);
958+ protobuf_output.set_current_format(static_cast<uint32_t>(display_output.current_format));
959 protobuf_output.set_power_mode(static_cast<uint32_t>(display_output.power_mode));
960 }
961
962
963=== modified file 'src/server/frontend/session_mediator.cpp'
964--- src/server/frontend/session_mediator.cpp 2013-12-17 18:24:51 +0000
965+++ src/server/frontend/session_mediator.cpp 2014-01-02 11:14:12 +0000
966@@ -321,7 +321,9 @@
967 mg::DisplayConfigurationOutputId output_id{static_cast<int>(output.output_id())};
968 config->configure_output(output_id, output.used(),
969 geom::Point{output.position_x(), output.position_y()},
970- output.current_mode(), static_cast<MirPowerMode>(output.power_mode()));
971+ output.current_mode(),
972+ static_cast<MirPixelFormat>(output.current_format()),
973+ static_cast<MirPowerMode>(output.power_mode()));
974 }
975
976 display_changer->configure(session, config);
977
978=== modified file 'src/server/graphics/default_display_configuration_policy.cpp'
979--- src/server/graphics/default_display_configuration_policy.cpp 2013-12-17 18:24:51 +0000
980+++ src/server/graphics/default_display_configuration_policy.cpp 2014-01-02 11:14:12 +0000
981@@ -18,13 +18,47 @@
982
983 #include "default_display_configuration_policy.h"
984 #include "mir/graphics/display_configuration.h"
985+#include "mir/graphics/pixel_format_utils.h"
986
987 #include <unordered_map>
988-
989-namespace mg = mir::graphics;
990-namespace geom = mir::geometry;
991-
992-void mg::DefaultDisplayConfigurationPolicy::apply_to(DisplayConfiguration& conf)
993+#include <algorithm>
994+
995+namespace mir
996+{
997+namespace geom = geometry;
998+namespace graphics
999+{
1000+
1001+namespace
1002+{
1003+inline size_t select_mode_index(size_t mode_index, std::vector<DisplayConfigurationMode> const & modes)
1004+{
1005+ if (modes.empty())
1006+ return std::numeric_limits<size_t>::max();
1007+ if (mode_index > modes.size())
1008+ return 0;
1009+ return mode_index;
1010+}
1011+
1012+inline MirPixelFormat select_format(MirPixelFormat format, std::vector<MirPixelFormat> const& formats)
1013+{
1014+ if (formats.empty())
1015+ return mir_pixel_format_invalid;
1016+
1017+ if (!contains_alpha(format))
1018+ return format;
1019+
1020+ auto opaque_pos = std::find_if_not(formats.begin(), formats.end(), contains_alpha);
1021+
1022+ if (opaque_pos == formats.end())
1023+ return format;
1024+
1025+ return *opaque_pos;
1026+}
1027+
1028+}
1029+
1030+void DefaultDisplayConfigurationPolicy::apply_to(DisplayConfiguration& conf)
1031 {
1032 static MirPowerMode const default_power_state = mir_power_mode_on;
1033 std::unordered_map<DisplayConfigurationCardId, size_t> available_outputs_for_card;
1034@@ -38,23 +72,24 @@
1035 conf.for_each_output(
1036 [&](DisplayConfigurationOutput const& conf_output)
1037 {
1038- if (conf_output.connected && conf_output.modes.size() > 0 &&
1039- available_outputs_for_card[conf_output.card_id] > 0)
1040- {
1041- size_t preferred_mode_index{conf_output.preferred_mode_index};
1042- if (preferred_mode_index > conf_output.modes.size())
1043- preferred_mode_index = 0;
1044-
1045- conf.configure_output(conf_output.id, true, geom::Point(),
1046- preferred_mode_index, default_power_state);
1047-
1048- --available_outputs_for_card[conf_output.card_id];
1049- }
1050- else
1051+ if (!conf_output.connected || conf_output.modes.empty() ||
1052+ available_outputs_for_card[conf_output.card_id] == 0)
1053 {
1054 conf.configure_output(conf_output.id, false, conf_output.top_left,
1055- conf_output.current_mode_index, default_power_state);
1056+ conf_output.current_mode_index, conf_output.current_format,
1057+ default_power_state);
1058+ return;
1059 }
1060+
1061+ size_t preferred_mode_index{select_mode_index(conf_output.preferred_mode_index, conf_output.modes)};
1062+ MirPixelFormat format{select_format(conf_output.current_format, conf_output.pixel_formats)};
1063+
1064+ conf.configure_output(conf_output.id, true, geom::Point(), preferred_mode_index,
1065+ format, default_power_state);
1066+
1067+ --available_outputs_for_card[conf_output.card_id];
1068 });
1069 }
1070
1071+} // graphics
1072+} // mir
1073
1074=== modified file 'src/server/graphics/nested/nested_display.cpp'
1075--- src/server/graphics/nested/nested_display.cpp 2013-12-19 19:05:57 +0000
1076+++ src/server/graphics/nested/nested_display.cpp 2014-01-02 11:14:12 +0000
1077@@ -22,8 +22,10 @@
1078 #include "mir_api_wrappers.h"
1079
1080 #include "mir/geometry/rectangle.h"
1081+#include "mir/graphics/pixel_format_utils.h"
1082 #include "mir/graphics/gl_context.h"
1083 #include "mir/graphics/surfaceless_egl_context.h"
1084+#include "mir/graphics/display_configuration_policy.h"
1085 #include "host_connection.h"
1086
1087 #include <boost/throw_exception.hpp>
1088@@ -34,45 +36,8 @@
1089 namespace mgnw = mir::graphics::nested::mir_api_wrappers;
1090 namespace geom = mir::geometry;
1091
1092-namespace
1093-{
1094-
1095-MirPixelFormat find_opaque_surface_format(MirConnection* connection)
1096-{
1097- static unsigned const max_formats = 32;
1098- MirPixelFormat formats[max_formats];
1099- unsigned int valid_formats;
1100-
1101- mir_connection_get_available_surface_formats(connection, formats,
1102- max_formats, &valid_formats);
1103-
1104- // Find an opaque surface format
1105- for (auto f = formats; f != formats+valid_formats; ++f)
1106- {
1107- if (*f == mir_pixel_format_xbgr_8888 ||
1108- *f == mir_pixel_format_xrgb_8888)
1109- {
1110- return *f;
1111- }
1112- }
1113-
1114- BOOST_THROW_EXCEPTION(
1115- std::runtime_error("Nested Mir failed to find an opaque surface format"));
1116-}
1117-
1118-}
1119-
1120-EGLint const mgn::detail::nested_egl_config_attribs[] = {
1121- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
1122- EGL_RED_SIZE, 8,
1123- EGL_GREEN_SIZE, 8,
1124- EGL_BLUE_SIZE, 8,
1125- EGL_ALPHA_SIZE, 0,
1126- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1127- EGL_NONE
1128-};
1129-
1130-EGLint const mgn::detail::nested_egl_context_attribs[] = {
1131+EGLint const mgn::detail::nested_egl_context_attribs[] =
1132+{
1133 EGL_CONTEXT_CLIENT_VERSION, 2,
1134 EGL_NONE
1135 };
1136@@ -93,6 +58,8 @@
1137 }
1138
1139 mgn::detail::EGLDisplayHandle::EGLDisplayHandle(MirConnection* connection)
1140+ : egl_display(EGL_NO_DISPLAY),
1141+ egl_context_(EGL_NO_CONTEXT)
1142 {
1143 auto const native_display = (EGLNativeDisplayType) mir_connection_get_egl_native_display(connection);
1144 egl_display = eglGetDisplay(native_display);
1145@@ -100,7 +67,7 @@
1146 BOOST_THROW_EXCEPTION(std::runtime_error("Nested Mir Display Error: Failed to fetch EGL display."));
1147 }
1148
1149-void mgn::detail::EGLDisplayHandle::initialize()
1150+void mgn::detail::EGLDisplayHandle::initialize(MirPixelFormat format)
1151 {
1152 int major;
1153 int minor;
1154@@ -110,17 +77,28 @@
1155 BOOST_THROW_EXCEPTION(std::runtime_error("Nested Mir Display Error: Failed to initialize EGL."));
1156 }
1157
1158- egl_context_ = eglCreateContext(egl_display, choose_config(detail::nested_egl_config_attribs), EGL_NO_CONTEXT, detail::nested_egl_context_attribs);
1159+ egl_context_ = eglCreateContext(egl_display, choose_windowed_es_config(format), EGL_NO_CONTEXT, detail::nested_egl_context_attribs);
1160+
1161 if (egl_context_ == EGL_NO_CONTEXT)
1162 BOOST_THROW_EXCEPTION(std::runtime_error("Failed to create shared EGL context"));
1163 }
1164
1165-EGLConfig mgn::detail::EGLDisplayHandle::choose_config(const EGLint attrib_list[]) const
1166+EGLConfig mgn::detail::EGLDisplayHandle::choose_windowed_es_config(MirPixelFormat format) const
1167 {
1168+ EGLint const nested_egl_config_attribs[] =
1169+ {
1170+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
1171+ EGL_RED_SIZE, mg::red_channel_depth(format),
1172+ EGL_GREEN_SIZE, mg::green_channel_depth(format),
1173+ EGL_BLUE_SIZE, mg::blue_channel_depth(format),
1174+ EGL_ALPHA_SIZE, mg::alpha_channel_depth(format),
1175+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1176+ EGL_NONE
1177+ };
1178 EGLConfig result;
1179 int n;
1180
1181- int res = eglChooseConfig(egl_display, attrib_list, &result, 1, &n);
1182+ int res = eglChooseConfig(egl_display, nested_egl_config_attribs, &result, 1, &n);
1183 if ((res != EGL_TRUE) || (n != 1))
1184 BOOST_THROW_EXCEPTION(std::runtime_error("Nested Mir Display Error: Failed to choose EGL configuration."));
1185
1186@@ -149,17 +127,18 @@
1187 mgn::NestedDisplay::NestedDisplay(
1188 std::shared_ptr<HostConnection> const& connection,
1189 std::shared_ptr<input::EventFilter> const& event_handler,
1190- std::shared_ptr<mg::DisplayReport> const& display_report) :
1191+ std::shared_ptr<mg::DisplayReport> const& display_report,
1192+ std::shared_ptr<mg::DisplayConfigurationPolicy> const& initial_conf_policy) :
1193 connection{connection},
1194 event_handler{event_handler},
1195 display_report{display_report},
1196 egl_display{*connection},
1197- egl_pixel_format{find_opaque_surface_format(*connection)},
1198 outputs{}
1199 {
1200- egl_display.initialize();
1201- eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, egl_display.egl_context());
1202- configure(*configuration());
1203+
1204+ std::shared_ptr<DisplayConfiguration> conf(configuration());
1205+ initial_conf_policy->apply_to(*conf);
1206+ configure(*conf);
1207 }
1208
1209 mgn::NestedDisplay::~NestedDisplay() noexcept
1210@@ -178,6 +157,14 @@
1211 return std::make_shared<NestedDisplayConfiguration>(mir_connection_create_display_config(*connection));
1212 }
1213
1214+void mgn::NestedDisplay::complete_display_initialization(MirPixelFormat format)
1215+{
1216+ if (egl_display.egl_context() != EGL_NO_CONTEXT) return;
1217+
1218+ egl_display.initialize(format);
1219+ eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, egl_display.egl_context());
1220+}
1221+
1222 void mgn::NestedDisplay::configure(mg::DisplayConfiguration const& configuration)
1223 {
1224 decltype(outputs) result;
1225@@ -193,13 +180,16 @@
1226 geometry::Rectangle const area{output.top_left, output.modes[output.current_mode_index].size};
1227
1228 auto const& egl_display_mode = output.modes[output.current_mode_index];
1229+ auto const& egl_config_format = output.current_format;
1230+
1231+ complete_display_initialization(egl_config_format);
1232
1233 MirSurfaceParameters const request_params =
1234 {
1235 "Mir nested display",
1236 egl_display_mode.size.width.as_int(),
1237 egl_display_mode.size.height.as_int(),
1238- egl_pixel_format,
1239+ egl_config_format,
1240 mir_buffer_usage_hardware,
1241 static_cast<uint32_t>(output.id.as_value())
1242 };
1243@@ -213,7 +203,8 @@
1244 egl_display,
1245 mir_surface,
1246 area,
1247- event_handler);
1248+ event_handler,
1249+ output.current_format);
1250 }
1251 });
1252
1253@@ -274,13 +265,7 @@
1254 return std::weak_ptr<Cursor>();
1255 }
1256
1257-namespace
1258-{
1259-}
1260-
1261 std::unique_ptr<mg::GLContext> mgn::NestedDisplay::create_gl_context()
1262 {
1263- return std::unique_ptr<mg::GLContext>{new SurfacelessEGLContext(egl_display,
1264- detail::nested_egl_config_attribs,
1265- EGL_NO_CONTEXT)};
1266+ return std::unique_ptr<mg::GLContext>{new SurfacelessEGLContext(egl_display, EGL_NO_CONTEXT)};
1267 }
1268
1269=== modified file 'src/server/graphics/nested/nested_display.h'
1270--- src/server/graphics/nested/nested_display.h 2013-12-17 18:24:51 +0000
1271+++ src/server/graphics/nested/nested_display.h 2014-01-02 11:14:12 +0000
1272@@ -42,6 +42,7 @@
1273 {
1274 class DisplayReport;
1275 class DisplayBuffer;
1276+class DisplayConfigurationPolicy;
1277
1278 namespace nested
1279 {
1280@@ -67,8 +68,8 @@
1281 explicit EGLDisplayHandle(MirConnection* connection);
1282 ~EGLDisplayHandle() noexcept;
1283
1284- void initialize();
1285- EGLConfig choose_config(const EGLint attrib_list[]) const;
1286+ void initialize(MirPixelFormat format);
1287+ EGLConfig choose_windowed_es_config (MirPixelFormat format) const;
1288 EGLNativeWindowType native_window(EGLConfig egl_config, MirSurface* mir_surface) const;
1289 EGLContext egl_context() const;
1290 operator EGLDisplay() const { return egl_display; }
1291@@ -83,7 +84,6 @@
1292
1293 class NestedOutput;
1294
1295-extern EGLint const nested_egl_config_attribs[];
1296 extern EGLint const nested_egl_context_attribs[];
1297 }
1298
1299@@ -95,7 +95,8 @@
1300 NestedDisplay(
1301 std::shared_ptr<HostConnection> const& connection,
1302 std::shared_ptr<input::EventFilter> const& event_handler,
1303- std::shared_ptr<DisplayReport> const& display_report);
1304+ std::shared_ptr<DisplayReport> const& display_report,
1305+ std::shared_ptr<DisplayConfigurationPolicy> const& conf_policy);
1306
1307 ~NestedDisplay() noexcept;
1308
1309@@ -124,11 +125,11 @@
1310 std::shared_ptr<input::EventFilter> const event_handler;
1311 std::shared_ptr<DisplayReport> const display_report;
1312 detail::EGLDisplayHandle egl_display;
1313- MirPixelFormat const egl_pixel_format;
1314
1315 std::mutex outputs_mutex;
1316 std::unordered_map<DisplayConfigurationOutputId, std::shared_ptr<detail::NestedOutput>> outputs;
1317 DisplayConfigurationChangeHandler my_conf_change_handler;
1318+ void complete_display_initialization(MirPixelFormat format);
1319 };
1320
1321 }
1322
1323=== modified file 'src/server/graphics/nested/nested_display_configuration.cpp'
1324--- src/server/graphics/nested/nested_display_configuration.cpp 2013-12-17 18:24:51 +0000
1325+++ src/server/graphics/nested/nested_display_configuration.cpp 2014-01-02 11:14:12 +0000
1326@@ -18,26 +18,40 @@
1327
1328 #include "nested_display_configuration.h"
1329
1330-namespace mg = mir::graphics;
1331-namespace mgn = mg::nested;
1332+#include "mir/graphics/pixel_format_utils.h"
1333
1334 #include <boost/throw_exception.hpp>
1335
1336 #include <stdexcept>
1337 #include <algorithm>
1338
1339-namespace mgn = mir::graphics::nested;
1340-
1341-mgn::NestedDisplayConfiguration::NestedDisplayConfiguration(MirDisplayConfiguration* connection) :
1342+namespace mir
1343+{
1344+namespace graphics
1345+{
1346+namespace nested
1347+{
1348+
1349+namespace
1350+{
1351+bool format_valid_for_output(MirDisplayOutput const& output, MirPixelFormat format)
1352+{
1353+ MirPixelFormat * end = output.output_formats + output.num_output_formats;
1354+ return end != std::find(output.output_formats, end, format);
1355+}
1356+
1357+}
1358+
1359+NestedDisplayConfiguration::NestedDisplayConfiguration(MirDisplayConfiguration* connection) :
1360 display_config{connection}
1361 {
1362 }
1363
1364-mgn::NestedDisplayConfiguration::~NestedDisplayConfiguration() noexcept
1365+NestedDisplayConfiguration::~NestedDisplayConfiguration() noexcept
1366 {
1367 }
1368
1369-void mgn::NestedDisplayConfiguration::for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const
1370+void NestedDisplayConfiguration::for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const
1371 {
1372 std::for_each(
1373 display_config->cards,
1374@@ -48,7 +62,7 @@
1375 });
1376 }
1377
1378-void mgn::NestedDisplayConfiguration::for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const
1379+void NestedDisplayConfiguration::for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const
1380 {
1381 std::for_each(
1382 display_config->outputs,
1383@@ -85,8 +99,8 @@
1384 });
1385 }
1386
1387-void mgn::NestedDisplayConfiguration::configure_output(DisplayConfigurationOutputId id, bool used,
1388- geometry::Point top_left, size_t mode_index, MirPowerMode power_mode)
1389+void NestedDisplayConfiguration::configure_output(DisplayConfigurationOutputId id, bool used,
1390+ geometry::Point top_left, size_t mode_index, MirPixelFormat format, MirPowerMode power_mode)
1391 {
1392 for (auto mir_output = display_config->outputs;
1393 mir_output != display_config->outputs+display_config->num_outputs;
1394@@ -97,13 +111,24 @@
1395 if (used && mode_index >= mir_output->num_modes)
1396 BOOST_THROW_EXCEPTION(std::runtime_error("Invalid mode_index for used output"));
1397
1398+ if (used && !valid_mir_pixel_format(format))
1399+ BOOST_THROW_EXCEPTION(std::runtime_error("Invalid format for used output"));
1400+
1401+ if (used && !format_valid_for_output(*mir_output, format))
1402+ BOOST_THROW_EXCEPTION(std::runtime_error("Format not available for used output"));
1403+
1404 mir_output->used = used;
1405 mir_output->position_x = top_left.x.as_uint32_t();
1406 mir_output->position_y = top_left.y.as_uint32_t();
1407 mir_output->current_mode = mode_index;
1408+ mir_output->current_output_format = format;
1409 mir_output->power_mode = static_cast<MirPowerMode>(power_mode);
1410 return;
1411 }
1412 }
1413 BOOST_THROW_EXCEPTION(std::runtime_error("Trying to configure invalid output"));
1414 }
1415+
1416+} // nested
1417+} // graphics
1418+} // mir
1419
1420=== modified file 'src/server/graphics/nested/nested_display_configuration.h'
1421--- src/server/graphics/nested/nested_display_configuration.h 2013-09-12 21:36:55 +0000
1422+++ src/server/graphics/nested/nested_display_configuration.h 2014-01-02 11:14:12 +0000
1423@@ -38,7 +38,7 @@
1424 void for_each_output(std::function<void(DisplayConfigurationOutput const&)>) const;
1425
1426 void configure_output(DisplayConfigurationOutputId id, bool used, geometry::Point top_left, size_t mode_index,
1427- MirPowerMode power_mode);
1428+ MirPixelFormat format, MirPowerMode power_mode);
1429
1430 operator MirDisplayConfiguration*() const { return display_config; }
1431 private:
1432
1433=== modified file 'src/server/graphics/nested/nested_output.cpp'
1434--- src/server/graphics/nested/nested_output.cpp 2013-09-23 13:37:44 +0000
1435+++ src/server/graphics/nested/nested_output.cpp 2014-01-02 11:14:12 +0000
1436@@ -41,10 +41,11 @@
1437 EGLDisplayHandle const& egl_display,
1438 MirSurface* mir_surface,
1439 geometry::Rectangle const& area,
1440- std::shared_ptr<input::EventFilter> const& event_handler) :
1441+ std::shared_ptr<input::EventFilter> const& event_handler,
1442+ MirPixelFormat preferred_format) :
1443 egl_display(egl_display),
1444 mir_surface{mir_surface},
1445- egl_config{egl_display.choose_config(nested_egl_config_attribs)},
1446+ egl_config{egl_display.choose_windowed_es_config(preferred_format)},
1447 egl_context{egl_display, eglCreateContext(egl_display, egl_config, egl_display.egl_context(), nested_egl_context_attribs)},
1448 area{area.top_left, area.size},
1449 event_handler{event_handler},
1450
1451=== modified file 'src/server/graphics/nested/nested_output.h'
1452--- src/server/graphics/nested/nested_output.h 2013-09-23 13:37:44 +0000
1453+++ src/server/graphics/nested/nested_output.h 2014-01-02 11:14:12 +0000
1454@@ -54,7 +54,8 @@
1455 EGLDisplayHandle const& egl_display,
1456 MirSurface* mir_surface,
1457 geometry::Rectangle const& area,
1458- std::shared_ptr<input::EventFilter> const& event_handler);
1459+ std::shared_ptr<input::EventFilter> const& event_handler,
1460+ MirPixelFormat preferred_format);
1461
1462 ~NestedOutput() noexcept;
1463
1464
1465=== modified file 'src/server/graphics/nested/nested_platform.cpp'
1466--- src/server/graphics/nested/nested_platform.cpp 2013-12-17 18:24:51 +0000
1467+++ src/server/graphics/nested/nested_platform.cpp 2014-01-02 11:14:12 +0000
1468@@ -113,9 +113,9 @@
1469 return native_platform->create_buffer_allocator(buffer_initializer);
1470 }
1471
1472-std::shared_ptr<mg::Display> mgn::NestedPlatform::create_display(std::shared_ptr<mg::DisplayConfigurationPolicy> const& /*initial_conf_policy*/)
1473+std::shared_ptr<mg::Display> mgn::NestedPlatform::create_display(std::shared_ptr<mg::DisplayConfigurationPolicy> const& conf_policy)
1474 {
1475- return std::make_shared<mgn::NestedDisplay>(connection, event_handler, display_report);
1476+ return std::make_shared<mgn::NestedDisplay>(connection, event_handler, display_report, conf_policy);
1477 }
1478
1479 std::shared_ptr<mg::PlatformIPCPackage> mgn::NestedPlatform::get_ipc_package()
1480
1481=== modified file 'src/server/graphics/nested/nested_platform.h'
1482--- src/server/graphics/nested/nested_platform.h 2013-12-17 18:24:51 +0000
1483+++ src/server/graphics/nested/nested_platform.h 2014-01-02 11:14:12 +0000
1484@@ -42,12 +42,12 @@
1485
1486 ~NestedPlatform() noexcept;
1487 std::shared_ptr<GraphicBufferAllocator> create_buffer_allocator(
1488- std::shared_ptr<BufferInitializer> const& buffer_initializer);
1489+ std::shared_ptr<BufferInitializer> const& buffer_initializer) override;
1490 std::shared_ptr<Display> create_display(
1491- std::shared_ptr<DisplayConfigurationPolicy> const& initial_conf_policy);
1492- std::shared_ptr<PlatformIPCPackage> get_ipc_package();
1493- std::shared_ptr<InternalClient> create_internal_client();
1494- void fill_ipc_package(BufferIPCPacker* packer, Buffer const* Buffer) const;
1495+ std::shared_ptr<DisplayConfigurationPolicy> const& initial_conf_policy) override;
1496+ std::shared_ptr<PlatformIPCPackage> get_ipc_package() override;
1497+ std::shared_ptr<InternalClient> create_internal_client() override;
1498+ void fill_ipc_package(BufferIPCPacker* packer, Buffer const* Buffer) const override;
1499 EGLNativeDisplayType egl_native_display() const;
1500
1501 private:
1502
1503=== modified file 'src/server/graphics/offscreen/display_configuration.cpp'
1504--- src/server/graphics/offscreen/display_configuration.cpp 2013-12-17 18:24:51 +0000
1505+++ src/server/graphics/offscreen/display_configuration.cpp 2014-01-02 11:14:12 +0000
1506@@ -31,7 +31,9 @@
1507 true,
1508 true,
1509 geom::Point{0,0},
1510- 0, 0, mir_power_mode_on},
1511+ 0,
1512+ mir_pixel_format_xrgb_8888,
1513+ mir_power_mode_on},
1514 card{mg::DisplayConfigurationCardId{0}, 1}
1515 {
1516 }
1517@@ -67,6 +69,6 @@
1518 }
1519
1520 void mgo::DisplayConfiguration::configure_output(
1521- mg::DisplayConfigurationOutputId, bool, geom::Point, size_t, MirPowerMode)
1522+ mg::DisplayConfigurationOutputId, bool, geom::Point, size_t, MirPixelFormat, MirPowerMode)
1523 {
1524 }
1525
1526=== modified file 'src/server/graphics/offscreen/display_configuration.h'
1527--- src/server/graphics/offscreen/display_configuration.h 2013-11-12 17:23:53 +0000
1528+++ src/server/graphics/offscreen/display_configuration.h 2014-01-02 11:14:12 +0000
1529@@ -33,10 +33,10 @@
1530 DisplayConfiguration(DisplayConfiguration const& other);
1531 DisplayConfiguration& operator=(DisplayConfiguration const& other);
1532
1533- void for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const;
1534- void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const;
1535- void configure_output(DisplayConfigurationOutputId, bool, geometry::Point,
1536- size_t, MirPowerMode power_mode);
1537+ void for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const override;
1538+ void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const override;
1539+ virtual void configure_output(DisplayConfigurationOutputId id, bool used, geometry::Point top_left,
1540+ size_t mode_index, MirPixelFormat format, MirPowerMode power_mode) override;
1541
1542 private:
1543 DisplayConfigurationOutput output;
1544
1545=== modified file 'src/server/logging/input_report.cpp'
1546--- src/server/logging/input_report.cpp 2013-12-19 16:33:56 +0000
1547+++ src/server/logging/input_report.cpp 2014-01-02 11:14:12 +0000
1548@@ -18,6 +18,7 @@
1549
1550 #include "mir/logging/input_report.h"
1551 #include "mir/logging/logger.h"
1552+#include "mir/logging/input_timestamp.h"
1553
1554 #include "std/MirLog.h"
1555 #include <std/Log.h>
1556@@ -108,7 +109,7 @@
1557 std::stringstream ss;
1558
1559 ss << "Received event"
1560- << " time=" << when
1561+ << " time=" << ml::input_timestamp(when)
1562 << " type=" << type
1563 << " code=" << code
1564 << " value=" << value;
1565@@ -122,7 +123,7 @@
1566
1567 ss << "Published key event"
1568 << " seq_id=" << seq_id
1569- << " time=" << event_time
1570+ << " time=" << ml::input_timestamp(event_time)
1571 << " dest_fd=" << dest_fd;
1572
1573 logger->log(Logger::informational, ss.str(), component());
1574@@ -134,7 +135,7 @@
1575
1576 ss << "Published motion event"
1577 << " seq_id=" << seq_id
1578- << " time=" << event_time
1579+ << " time=" << ml::input_timestamp(event_time)
1580 << " dest_fd=" << dest_fd;
1581
1582 logger->log(Logger::informational, ss.str(), component());
1583
1584=== modified file 'src/server/scene/mediating_display_changer.cpp'
1585--- src/server/scene/mediating_display_changer.cpp 2013-12-17 18:24:51 +0000
1586+++ src/server/scene/mediating_display_changer.cpp 2014-01-02 11:14:12 +0000
1587@@ -136,6 +136,7 @@
1588 conf->configure_output(output.id, output.used,
1589 output.top_left,
1590 output.current_mode_index,
1591+ output.current_format,
1592 mir_power_mode_on);
1593 }
1594 });
1595
1596=== modified file 'src/shared/logging/CMakeLists.txt'
1597--- src/shared/logging/CMakeLists.txt 2013-12-12 07:51:12 +0000
1598+++ src/shared/logging/CMakeLists.txt 2014-01-02 11:14:12 +0000
1599@@ -16,4 +16,5 @@
1600
1601 add_library(mirsharedlogging STATIC
1602 dumb_console_logger.cpp
1603+ input_timestamp.cpp
1604 )
1605
1606=== added file 'src/shared/logging/input_timestamp.cpp'
1607--- src/shared/logging/input_timestamp.cpp 1970-01-01 00:00:00 +0000
1608+++ src/shared/logging/input_timestamp.cpp 2014-01-02 11:14:12 +0000
1609@@ -0,0 +1,41 @@
1610+/*
1611+ * Copyright © 2013 Canonical Ltd.
1612+ *
1613+ * This program is free software: you can redistribute it and/or modify it
1614+ * under the terms of the GNU Lesser General Public License version 3,
1615+ * as published by the Free Software Foundation.
1616+ *
1617+ * This program is distributed in the hope that it will be useful,
1618+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1619+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1620+ * GNU Lesser General Public License for more details.
1621+ *
1622+ * You should have received a copy of the GNU Lesser General Public License
1623+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
1624+ *
1625+ * Authored by: Daniel van Vugt <daniel.van.vugt@canonical.com>
1626+ */
1627+
1628+#include "mir/logging/input_timestamp.h"
1629+#include <ctime>
1630+#include <cstdio>
1631+#include <string>
1632+
1633+std::string mir::logging::input_timestamp(nsecs_t when)
1634+{
1635+ // Input events use CLOCK_REALTIME, and so we must...
1636+ struct timespec ts;
1637+ clock_gettime(CLOCK_REALTIME, &ts);
1638+
1639+ nsecs_t now = ts.tv_sec * 1000000000LL + ts.tv_nsec;
1640+ nsecs_t age = now - when;
1641+
1642+ char str[64];
1643+ snprintf(str, sizeof str, "%lld (%ld.%06ld ms ago)",
1644+ static_cast<long long>(when),
1645+ static_cast<long>(age / 1000000LL),
1646+ static_cast<long>(age % 1000000LL));
1647+
1648+ return std::string(str);
1649+}
1650+
1651
1652=== modified file 'tests/acceptance-tests/test_server_shutdown.cpp'
1653--- tests/acceptance-tests/test_server_shutdown.cpp 2013-12-17 18:24:51 +0000
1654+++ tests/acceptance-tests/test_server_shutdown.cpp 2014-01-02 11:14:12 +0000
1655@@ -48,6 +48,10 @@
1656 class NullRenderer : public mc::Renderer
1657 {
1658 public:
1659+ void begin() const override
1660+ {
1661+ }
1662+
1663 void render(mc::CompositingCriteria const&, mg::Buffer&) const override
1664 {
1665 /*
1666@@ -58,7 +62,7 @@
1667 std::this_thread::yield();
1668 }
1669
1670- void clear() const override
1671+ void end() const override
1672 {
1673 }
1674 };
1675
1676=== modified file 'tests/integration-tests/test_session.cpp'
1677--- tests/integration-tests/test_session.cpp 2013-12-17 18:24:51 +0000
1678+++ tests/integration-tests/test_session.cpp 2014-01-02 11:14:12 +0000
1679@@ -87,12 +87,15 @@
1680 {
1681 struct StubRenderer : public mc::Renderer
1682 {
1683- void clear() const override
1684+ void begin() const override
1685 {
1686 }
1687 void render(mc::CompositingCriteria const&, mg::Buffer&) const override
1688 {
1689 }
1690+ void end() const override
1691+ {
1692+ }
1693 };
1694
1695 struct StubRendererFactory : public mc::RendererFactory
1696
1697=== modified file 'tests/integration-tests/test_surface_first_frame_sync.cpp'
1698--- tests/integration-tests/test_surface_first_frame_sync.cpp 2013-12-17 18:24:51 +0000
1699+++ tests/integration-tests/test_surface_first_frame_sync.cpp 2014-01-02 11:14:12 +0000
1700@@ -96,7 +96,7 @@
1701 {
1702 }
1703
1704- void clear() const override
1705+ void begin() const override
1706 {
1707 }
1708
1709@@ -105,6 +105,10 @@
1710 while (write(render_operations_fd, "a", 1) != 1) continue;
1711 }
1712
1713+ void end() const override
1714+ {
1715+ }
1716+
1717 private:
1718 int render_operations_fd;
1719 };
1720
1721=== modified file 'tests/mir_test/display_config_matchers.cpp'
1722--- tests/mir_test/display_config_matchers.cpp 2013-12-17 18:24:51 +0000
1723+++ tests/mir_test/display_config_matchers.cpp 2014-01-02 11:14:12 +0000
1724@@ -67,7 +67,7 @@
1725 geom::Point{protobuf_output.position_x(),
1726 protobuf_output.position_y()},
1727 protobuf_output.current_mode(),
1728- protobuf_output.current_format(),
1729+ static_cast<MirPixelFormat>(protobuf_output.current_format()),
1730 static_cast<MirPowerMode>(protobuf_output.power_mode())
1731 };
1732
1733@@ -175,7 +175,7 @@
1734 }
1735
1736 void configure_output(mg::DisplayConfigurationOutputId, bool,
1737- geom::Point, size_t, MirPowerMode)
1738+ geom::Point, size_t, MirPixelFormat, MirPowerMode)
1739 {
1740 }
1741
1742
1743=== modified file 'tests/mir_test_framework/stubbed_server_configuration.cpp'
1744--- tests/mir_test_framework/stubbed_server_configuration.cpp 2013-12-19 16:34:53 +0000
1745+++ tests/mir_test_framework/stubbed_server_configuration.cpp 2014-01-02 11:14:12 +0000
1746@@ -132,7 +132,7 @@
1747 mg::DisplayConfigurationCardId{0},
1748 mg::DisplayConfigurationOutputType::vga,
1749 std::vector<MirPixelFormat>{mir_pixel_format_abgr_8888},
1750- modes, 0, geom::Size{}, true, true, geom::Point{0,0}, 0, 0, mir_power_mode_on};
1751+ modes, 0, geom::Size{}, true, true, geom::Point{0,0}, 0, mir_pixel_format_abgr_8888, mir_power_mode_on};
1752
1753 f(dummy_output_config);
1754 }
1755@@ -201,11 +201,15 @@
1756 class StubRenderer : public mc::Renderer
1757 {
1758 public:
1759+ void begin() const override
1760+ {
1761+ }
1762+
1763 void render(mc::CompositingCriteria const&, mg::Buffer&) const override
1764 {
1765 }
1766
1767- void clear() const override
1768+ void end() const override
1769 {
1770 }
1771 };
1772
1773=== modified file 'tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp'
1774--- tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp 2013-12-17 18:24:51 +0000
1775+++ tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp 2014-01-02 11:14:12 +0000
1776@@ -106,9 +106,9 @@
1777 {
1778 }
1779
1780- void clear() const override
1781+ void begin() const override
1782 {
1783- renderer->clear();
1784+ renderer->begin();
1785 }
1786
1787 void render(mc::CompositingCriteria const& criteria, mg::Buffer& buffer) const override
1788@@ -116,6 +116,11 @@
1789 renderer->render(criteria, buffer);
1790 }
1791
1792+ void end() const override
1793+ {
1794+ renderer->end();
1795+ }
1796+
1797 mc::Renderer* const renderer;
1798 };
1799
1800@@ -241,10 +246,14 @@
1801 renderable_vec.push_back(&small);
1802 renderable_vec.push_back(&fullscreen);
1803
1804+ EXPECT_CALL(renderer_factory.mock_renderer, begin())
1805+ .Times(0);
1806 EXPECT_CALL(renderer_factory.mock_renderer, render(Ref(small),_))
1807 .Times(0);
1808 EXPECT_CALL(renderer_factory.mock_renderer, render(Ref(fullscreen),_))
1809 .Times(0);
1810+ EXPECT_CALL(renderer_factory.mock_renderer, end())
1811+ .Times(0);
1812
1813 FakeScene scene(renderable_vec);
1814
1815@@ -263,6 +272,58 @@
1816 comp->composite();
1817 }
1818
1819+TEST(DefaultDisplayBufferCompositor, calls_renderer_in_sequence)
1820+{
1821+ using namespace testing;
1822+
1823+ StubRendererFactory renderer_factory;
1824+
1825+ geom::Rectangle screen{{0, 0}, {1366, 768}};
1826+
1827+ mtd::MockDisplayBuffer display_buffer;
1828+
1829+ EXPECT_CALL(display_buffer, view_area())
1830+ .WillRepeatedly(Return(screen));
1831+ EXPECT_CALL(display_buffer, can_bypass())
1832+ .WillRepeatedly(Return(false));
1833+
1834+ mtd::StubCompositingCriteria big(5, 10, 100, 200);
1835+ mtd::StubCompositingCriteria small(10, 20, 30, 40);
1836+
1837+ std::vector<mc::CompositingCriteria*> renderable_vec;
1838+ renderable_vec.push_back(&big);
1839+ renderable_vec.push_back(&small);
1840+
1841+ Sequence render_seq;
1842+
1843+ EXPECT_CALL(display_buffer, make_current())
1844+ .InSequence(render_seq);
1845+ EXPECT_CALL(renderer_factory.mock_renderer, begin())
1846+ .InSequence(render_seq);
1847+ EXPECT_CALL(renderer_factory.mock_renderer, render(Ref(big),_))
1848+ .InSequence(render_seq);
1849+ EXPECT_CALL(renderer_factory.mock_renderer, render(Ref(small),_))
1850+ .InSequence(render_seq);
1851+ EXPECT_CALL(renderer_factory.mock_renderer, end())
1852+ .InSequence(render_seq);
1853+ EXPECT_CALL(display_buffer, post_update())
1854+ .InSequence(render_seq);
1855+
1856+ FakeScene scene(renderable_vec);
1857+
1858+ auto compositor_buffer = std::make_shared<mtd::MockBuffer>();
1859+ EXPECT_CALL(*compositor_buffer, can_bypass())
1860+ .Times(0);
1861+
1862+ mc::DefaultDisplayBufferCompositorFactory factory(
1863+ mt::fake_shared(scene),
1864+ mt::fake_shared(renderer_factory));
1865+
1866+ auto comp = factory.create_compositor_for(display_buffer);
1867+
1868+ comp->composite();
1869+}
1870+
1871 TEST(DefaultDisplayBufferCompositor, obscured_fullscreen_does_not_bypass)
1872 {
1873 using namespace testing;
1874
1875=== modified file 'tests/unit-tests/frontend/test_session_mediator.cpp'
1876--- tests/unit-tests/frontend/test_session_mediator.cpp 2013-12-17 18:24:51 +0000
1877+++ tests/unit-tests/frontend/test_session_mediator.cpp 2014-01-02 11:14:12 +0000
1878@@ -83,7 +83,7 @@
1879 {
1880 MOCK_CONST_METHOD1(for_each_card, void(std::function<void(mg::DisplayConfigurationCard const&)>));
1881 MOCK_CONST_METHOD1(for_each_output, void(std::function<void(mg::DisplayConfigurationOutput const&)>));
1882- MOCK_METHOD5(configure_output, void(mg::DisplayConfigurationOutputId, bool, geom::Point, size_t, MirPowerMode));
1883+ MOCK_METHOD6(configure_output, void(mg::DisplayConfigurationOutputId, bool, geom::Point, size_t, MirPixelFormat, MirPowerMode));
1884 };
1885
1886 }
1887@@ -555,6 +555,8 @@
1888 bool used0 = false, used1 = true;
1889 geom::Point pt0{44,22}, pt1{3,2};
1890 size_t mode_index0 = 1, mode_index1 = 3;
1891+ MirPixelFormat format0 = mir_pixel_format_invalid;
1892+ MirPixelFormat format1 = mir_pixel_format_argb_8888;
1893 mg::DisplayConfigurationOutputId id0{6}, id1{3};
1894
1895 NiceMock<MockConfig> mock_display_config;
1896@@ -568,9 +570,9 @@
1897 EXPECT_CALL(*mock_display_selector, active_configuration())
1898 .InSequence(seq)
1899 .WillOnce(Return(mt::fake_shared(mock_display_config)));
1900- EXPECT_CALL(mock_display_config, configure_output(id0, used0, pt0, mode_index0, mir_power_mode_on))
1901+ EXPECT_CALL(mock_display_config, configure_output(id0, used0, pt0, mode_index0, format0, mir_power_mode_on))
1902 .InSequence(seq);
1903- EXPECT_CALL(mock_display_config, configure_output(id1, used1, pt1, mode_index1, mir_power_mode_off))
1904+ EXPECT_CALL(mock_display_config, configure_output(id1, used1, pt1, mode_index1, format1, mir_power_mode_off))
1905 .InSequence(seq);
1906 EXPECT_CALL(*mock_display_selector, configure(_,_))
1907 .InSequence(seq);
1908@@ -593,6 +595,7 @@
1909 disp0->set_position_x(pt0.x.as_uint32_t());
1910 disp0->set_position_y(pt0.y.as_uint32_t());
1911 disp0->set_current_mode(mode_index0);
1912+ disp0->set_current_format(format0);
1913 disp0->set_power_mode(static_cast<uint32_t>(mir_power_mode_on));
1914
1915 auto disp1 = configuration.add_display_output();
1916@@ -601,6 +604,7 @@
1917 disp1->set_position_x(pt1.x.as_uint32_t());
1918 disp1->set_position_y(pt1.y.as_uint32_t());
1919 disp1->set_current_mode(mode_index1);
1920+ disp1->set_current_format(format1);
1921 disp1->set_power_mode(static_cast<uint32_t>(mir_power_mode_off));
1922
1923 session_mediator.configure_display(nullptr, &configuration,
1924
1925=== modified file 'tests/unit-tests/graphics/CMakeLists.txt'
1926--- tests/unit-tests/graphics/CMakeLists.txt 2013-12-19 19:05:57 +0000
1927+++ tests/unit-tests/graphics/CMakeLists.txt 2014-01-02 11:14:12 +0000
1928@@ -6,6 +6,7 @@
1929 ${CMAKE_CURRENT_SOURCE_DIR}/test_default_display_configuration_policy.cpp
1930 ${CMAKE_CURRENT_SOURCE_DIR}/test_buffer_id.cpp
1931 ${CMAKE_CURRENT_SOURCE_DIR}/test_buffer_properties.cpp
1932+ ${CMAKE_CURRENT_SOURCE_DIR}/test_pixel_format_utils.cpp
1933 ${CMAKE_CURRENT_SOURCE_DIR}/test_surfaceless_egl_context.cpp
1934 )
1935
1936
1937=== modified file 'tests/unit-tests/graphics/android/test_android_fb.cpp'
1938--- tests/unit-tests/graphics/android/test_android_fb.cpp 2013-12-17 18:24:51 +0000
1939+++ tests/unit-tests/graphics/android/test_android_fb.cpp 2014-01-02 11:14:12 +0000
1940@@ -256,28 +256,28 @@
1941 configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)
1942 {
1943 configuration->configure_output(
1944- output.id, output.used, output.top_left, output.current_mode_index, mir_power_mode_on);
1945- });
1946- display.configure(*configuration);
1947-
1948- configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)
1949- {
1950- configuration->configure_output(
1951- output.id, output.used, output.top_left, output.current_mode_index, mir_power_mode_standby);
1952- });
1953- display.configure(*configuration);
1954-
1955- configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)
1956- {
1957- configuration->configure_output(
1958- output.id, output.used, output.top_left, output.current_mode_index, mir_power_mode_off);
1959- });
1960- display.configure(*configuration);
1961-
1962- configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)
1963- {
1964- configuration->configure_output(
1965- output.id, output.used, output.top_left, output.current_mode_index, mir_power_mode_suspend);
1966+ output.id, output.used, output.top_left, output.current_mode_index, output.current_format, mir_power_mode_on);
1967+ });
1968+ display.configure(*configuration);
1969+
1970+ configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)
1971+ {
1972+ configuration->configure_output(
1973+ output.id, output.used, output.top_left, output.current_mode_index, output.current_format, mir_power_mode_standby);
1974+ });
1975+ display.configure(*configuration);
1976+
1977+ configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)
1978+ {
1979+ configuration->configure_output(
1980+ output.id, output.used, output.top_left, output.current_mode_index, output.current_format, mir_power_mode_off);
1981+ });
1982+ display.configure(*configuration);
1983+
1984+ configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)
1985+ {
1986+ configuration->configure_output(
1987+ output.id, output.used, output.top_left, output.current_mode_index, output.current_format, mir_power_mode_suspend);
1988 });
1989 display.configure(*configuration);
1990 }
1991
1992=== modified file 'tests/unit-tests/graphics/mesa/test_cursor.cpp'
1993--- tests/unit-tests/graphics/mesa/test_cursor.cpp 2013-12-17 18:24:51 +0000
1994+++ tests/unit-tests/graphics/mesa/test_cursor.cpp 2014-01-02 11:14:12 +0000
1995@@ -105,7 +105,7 @@
1996 true,
1997 geom::Point{0, 0},
1998 1,
1999- 0,
2000+ mir_pixel_format_invalid,
2001 mir_power_mode_on
2002 });
2003 outputs.push_back(
2004@@ -124,33 +124,33 @@
2005 true,
2006 geom::Point{100, 50},
2007 0,
2008- 0,
2009+ mir_pixel_format_invalid,
2010 mir_power_mode_on
2011 });
2012 }
2013
2014- void for_each_card(std::function<void(mg::DisplayConfigurationCard const&)> f) const
2015+ void for_each_card(std::function<void(mg::DisplayConfigurationCard const&)> f) const override
2016 {
2017 f({card_id, outputs.size()});
2018 }
2019
2020- void for_each_output(std::function<void(mg::DisplayConfigurationOutput const&)> f) const
2021+ void for_each_output(std::function<void(mg::DisplayConfigurationOutput const&)> f) const override
2022 {
2023 for (auto const& output : outputs)
2024 f(output);
2025 }
2026
2027 void configure_output(mg::DisplayConfigurationOutputId, bool,
2028- geom::Point, size_t, MirPowerMode)
2029+ geom::Point, size_t, MirPixelFormat, MirPowerMode) override
2030 {
2031 }
2032
2033- uint32_t get_kms_connector_id(mg::DisplayConfigurationOutputId id) const
2034+ uint32_t get_kms_connector_id(mg::DisplayConfigurationOutputId id) const override
2035 {
2036 return id.as_value();
2037 }
2038
2039- size_t get_kms_mode_index(mg::DisplayConfigurationOutputId, size_t conf_mode_index) const
2040+ size_t get_kms_mode_index(mg::DisplayConfigurationOutputId, size_t conf_mode_index) const override
2041 {
2042 return conf_mode_index;
2043 }
2044
2045=== modified file 'tests/unit-tests/graphics/mesa/test_display_configuration.cpp'
2046--- tests/unit-tests/graphics/mesa/test_display_configuration.cpp 2013-12-17 18:24:51 +0000
2047+++ tests/unit-tests/graphics/mesa/test_display_configuration.cpp 2014-01-02 11:14:12 +0000
2048@@ -197,7 +197,7 @@
2049 true,
2050 geom::Point(),
2051 1,
2052- 0,
2053+ mir_pixel_format_invalid,
2054 mir_power_mode_on
2055 },
2056 {
2057@@ -212,7 +212,7 @@
2058 false,
2059 geom::Point(),
2060 std::numeric_limits<size_t>::max(),
2061- std::numeric_limits<size_t>::max(),
2062+ mir_pixel_format_invalid,
2063 mir_power_mode_on
2064 },
2065 {
2066@@ -227,7 +227,7 @@
2067 false,
2068 geom::Point(),
2069 std::numeric_limits<size_t>::max(),
2070- std::numeric_limits<size_t>::max(),
2071+ mir_pixel_format_invalid,
2072 mir_power_mode_on
2073 }
2074 };
2075@@ -381,7 +381,7 @@
2076 true,
2077 geom::Point(),
2078 1,
2079- 0,
2080+ mir_pixel_format_invalid,
2081 mir_power_mode_on
2082 },
2083 {
2084@@ -396,7 +396,7 @@
2085 false,
2086 geom::Point(),
2087 std::numeric_limits<size_t>::max(),
2088- std::numeric_limits<size_t>::max(),
2089+ mir_pixel_format_invalid,
2090 mir_power_mode_on
2091 },
2092 };
2093@@ -415,7 +415,7 @@
2094 true,
2095 geom::Point(),
2096 std::numeric_limits<size_t>::max(),
2097- std::numeric_limits<size_t>::max(),
2098+ mir_pixel_format_invalid,
2099 mir_power_mode_on
2100 },
2101 {
2102@@ -430,7 +430,7 @@
2103 false,
2104 geom::Point(),
2105 1,
2106- 0,
2107+ mir_pixel_format_invalid,
2108 mir_power_mode_on
2109 },
2110 };
2111
2112=== modified file 'tests/unit-tests/graphics/mesa/test_display_multi_monitor.cpp'
2113--- tests/unit-tests/graphics/mesa/test_display_multi_monitor.cpp 2013-12-17 18:24:51 +0000
2114+++ tests/unit-tests/graphics/mesa/test_display_multi_monitor.cpp 2014-01-02 11:14:12 +0000
2115@@ -57,12 +57,16 @@
2116 if (conf_output.connected && conf_output.modes.size() > 0)
2117 {
2118 conf.configure_output(conf_output.id, true, geom::Point{0, 0},
2119- conf_output.preferred_mode_index, mir_power_mode_on);
2120+ conf_output.preferred_mode_index,
2121+ conf_output.current_format,
2122+ mir_power_mode_on);
2123 }
2124 else
2125 {
2126 conf.configure_output(conf_output.id, false, conf_output.top_left,
2127- conf_output.current_mode_index, mir_power_mode_on);
2128+ conf_output.current_mode_index,
2129+ conf_output.current_format,
2130+ mir_power_mode_on);
2131 }
2132 });
2133 }
2134@@ -81,13 +85,17 @@
2135 if (conf_output.connected && conf_output.modes.size() > 0)
2136 {
2137 conf.configure_output(conf_output.id, true, geom::Point{max_x, 0},
2138- conf_output.preferred_mode_index, mir_power_mode_on);
2139+ conf_output.preferred_mode_index,
2140+ conf_output.current_format,
2141+ mir_power_mode_on);
2142 max_x += conf_output.modes[conf_output.preferred_mode_index].size.width.as_int();
2143 }
2144 else
2145 {
2146 conf.configure_output(conf_output.id, false, conf_output.top_left,
2147- conf_output.current_mode_index, mir_power_mode_on);
2148+ conf_output.current_mode_index,
2149+ conf_output.current_format,
2150+ mir_power_mode_on);
2151 }
2152 });
2153 }
2154@@ -472,7 +480,8 @@
2155 [&](mg::DisplayConfigurationOutput const& conf_output)
2156 {
2157 conf->configure_output(conf_output.id, false, conf_output.top_left,
2158- conf_output.preferred_mode_index, mir_power_mode_on);
2159+ conf_output.preferred_mode_index, mir_pixel_format_xrgb_8888,
2160+ mir_power_mode_on);
2161 });
2162
2163 display->configure(*conf);
2164@@ -508,7 +517,8 @@
2165 [&](mg::DisplayConfigurationOutput const& conf_output)
2166 {
2167 conf->configure_output(conf_output.id, false, conf_output.top_left,
2168- conf_output.preferred_mode_index, mir_power_mode_on);
2169+ conf_output.preferred_mode_index, mir_pixel_format_xrgb_8888,
2170+ mir_power_mode_on);
2171 });
2172
2173 display->configure(*conf);
2174
2175=== modified file 'tests/unit-tests/graphics/mesa/test_overlapping_output_grouping.cpp'
2176--- tests/unit-tests/graphics/mesa/test_overlapping_output_grouping.cpp 2013-12-17 18:24:51 +0000
2177+++ tests/unit-tests/graphics/mesa/test_overlapping_output_grouping.cpp 2014-01-02 11:14:12 +0000
2178@@ -79,7 +79,7 @@
2179 used,
2180 rect.top_left,
2181 i - 1,
2182- 0,
2183+ mir_pixel_format_invalid,
2184 mir_power_mode_on
2185 };
2186
2187@@ -89,7 +89,7 @@
2188 }
2189
2190 void configure_output(mg::DisplayConfigurationOutputId, bool,
2191- geom::Point, size_t, MirPowerMode)
2192+ geom::Point, size_t, MirPixelFormat, MirPowerMode)
2193 {
2194 }
2195
2196
2197=== modified file 'tests/unit-tests/graphics/nested/test_nested_display_configuration.cpp'
2198--- tests/unit-tests/graphics/nested/test_nested_display_configuration.cpp 2013-09-12 21:36:55 +0000
2199+++ tests/unit-tests/graphics/nested/test_nested_display_configuration.cpp 2014-01-02 11:14:12 +0000
2200@@ -36,7 +36,7 @@
2201 uint32_t const default_current_mode = 0;
2202 uint32_t const default_num_output_formats = 0;
2203 MirPixelFormat* const default_output_formats = nullptr;
2204-uint32_t const default_current_output_format = 0;
2205+MirPixelFormat const default_current_output_format = mir_pixel_format_abgr_8888;
2206 uint32_t const default_card_id = 1;
2207 uint32_t const second_card_id = 2;
2208 uint32_t const default_output_id = 0;
2209@@ -84,7 +84,7 @@
2210 output->current_mode = 0;
2211 output->num_output_formats = NoOfFormats;
2212 output->output_formats = format_tmp;
2213- output->current_output_format = 0;
2214+ output->current_output_format = NoOfFormats > 0 ? formats[0] : mir_pixel_format_invalid;
2215 }
2216
2217 template<int NoOfOutputs, int NoOfModes, int NoOfFormats>
2218@@ -257,7 +257,7 @@
2219 mgn::NestedDisplayConfiguration config(build_trivial_configuration());
2220
2221 config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true,
2222- top_left, default_current_mode, mir_power_mode_on);
2223+ top_left, default_current_mode, default_current_output_format, mir_power_mode_on);
2224
2225 MockOutputVisitor ov;
2226 EXPECT_CALL(ov, f(_)).Times(Exactly(1));
2227@@ -268,6 +268,7 @@
2228 EXPECT_EQ(true, output.used);
2229 EXPECT_EQ(top_left, output.top_left);
2230 EXPECT_EQ(0, output.current_mode_index);
2231+ EXPECT_EQ(default_current_output_format, output.current_format);
2232 });
2233 }
2234
2235@@ -278,11 +279,25 @@
2236 mgn::NestedDisplayConfiguration config(build_trivial_configuration());
2237
2238 EXPECT_THROW(
2239- {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true, top_left, -1, mir_power_mode_on);},
2240- std::runtime_error);
2241-
2242- EXPECT_THROW(
2243- {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true, top_left, too_big_mode_index, mir_power_mode_on);},
2244+ {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true, top_left, -1, default_current_output_format, mir_power_mode_on);},
2245+ std::runtime_error);
2246+
2247+ EXPECT_THROW(
2248+ {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true, top_left, too_big_mode_index, default_current_output_format, mir_power_mode_on);},
2249+ std::runtime_error);
2250+}
2251+
2252+TEST_F(NestedDisplayConfiguration, configure_output_rejects_invalid_format)
2253+{
2254+ geom::Point const top_left{10,20};
2255+ mgn::NestedDisplayConfiguration config(build_trivial_configuration());
2256+
2257+ EXPECT_THROW(
2258+ {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true, top_left, default_current_mode, mir_pixel_format_invalid, mir_power_mode_on);},
2259+ std::runtime_error);
2260+
2261+ EXPECT_THROW(
2262+ {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true, top_left, default_current_mode, mir_pixel_formats, mir_power_mode_on);},
2263 std::runtime_error);
2264 }
2265
2266@@ -292,11 +307,11 @@
2267 mgn::NestedDisplayConfiguration config(build_trivial_configuration());
2268
2269 EXPECT_THROW(
2270- {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id+1), true, top_left, default_current_mode, mir_power_mode_on);},
2271+ {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id+1), true, top_left, default_current_mode, default_current_output_format, mir_power_mode_on);},
2272 std::runtime_error);
2273
2274 EXPECT_THROW(
2275- {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id-1), true, top_left, default_current_mode, mir_power_mode_on);},
2276+ {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id-1), true, top_left, default_current_mode, default_current_output_format, mir_power_mode_on);},
2277 std::runtime_error);
2278 }
2279
2280@@ -326,7 +341,7 @@
2281 geom::Point const top_left{100,200};
2282 mgn::NestedDisplayConfiguration config(build_non_trivial_configuration());
2283
2284- config.configure_output(id, true, top_left, 1, mir_power_mode_on);
2285+ config.configure_output(id, true, top_left, 1, mir_pixel_format_argb_8888, mir_power_mode_on);
2286
2287 MockOutputVisitor ov;
2288 EXPECT_CALL(ov, f(_)).Times(Exactly(3));
2289@@ -338,6 +353,7 @@
2290 EXPECT_EQ(true, output.used);
2291 EXPECT_EQ(top_left, output.top_left);
2292 EXPECT_EQ(1, output.current_mode_index);
2293+ EXPECT_EQ(mir_pixel_format_argb_8888, output.current_format);
2294 }
2295 });
2296 }
2297
2298=== modified file 'tests/unit-tests/graphics/test_default_display_configuration_policy.cpp'
2299--- tests/unit-tests/graphics/test_default_display_configuration_policy.cpp 2013-12-17 18:24:51 +0000
2300+++ tests/unit-tests/graphics/test_default_display_configuration_policy.cpp 2014-01-02 11:14:12 +0000
2301@@ -22,149 +22,158 @@
2302 #include <gtest/gtest.h>
2303 #include <gmock/gmock.h>
2304
2305-namespace mg = mir::graphics;
2306-namespace geom = mir::geometry;
2307+using namespace mir::graphics;
2308+using namespace mir::geometry;
2309
2310 namespace
2311 {
2312
2313-class MockDisplayConfiguration : public mg::DisplayConfiguration
2314+class MockDisplayConfiguration : public DisplayConfiguration
2315 {
2316 public:
2317- MockDisplayConfiguration(size_t max_simultaneous_outputs)
2318- : card_id{1}, max_simultaneous_outputs{max_simultaneous_outputs}
2319+ MockDisplayConfiguration(MockDisplayConfiguration && m)
2320+ : max_simultaneous_outputs{m.max_simultaneous_outputs},
2321+ outputs{std::move(m.outputs)}
2322 {
2323- /* Connected with modes */
2324- outputs.push_back(
2325- {
2326- mg::DisplayConfigurationOutputId{10},
2327- card_id,
2328- mg::DisplayConfigurationOutputType::vga,
2329- {
2330- mir_pixel_format_abgr_8888
2331- },
2332- {
2333- {geom::Size{123, 111}, 59.9},
2334- {geom::Size{123, 111}, 59.9},
2335- {geom::Size{123, 111}, 59.9}
2336- },
2337- 2,
2338- geom::Size{324, 642},
2339- true,
2340- false,
2341- geom::Point{geom::X{123}, geom::Y{343}},
2342- 1,
2343- 0,
2344- mir_power_mode_on
2345- });
2346- /* Connected without modes */
2347- outputs.push_back(
2348- {
2349- mg::DisplayConfigurationOutputId{11},
2350- card_id,
2351- mg::DisplayConfigurationOutputType::vga,
2352- {},
2353- {},
2354- std::numeric_limits<size_t>::max(),
2355- geom::Size{566, 111},
2356- true,
2357- false,
2358- geom::Point(),
2359- std::numeric_limits<size_t>::max(),
2360- std::numeric_limits<size_t>::max(),
2361- mir_power_mode_on
2362- });
2363- /* Connected with a single mode */
2364- outputs.push_back(
2365- {
2366- mg::DisplayConfigurationOutputId{12},
2367- card_id,
2368- mg::DisplayConfigurationOutputType::vga,
2369- {
2370- mir_pixel_format_abgr_8888
2371- },
2372- {
2373- {geom::Size{523, 555}, 60.0},
2374- },
2375- 0,
2376- geom::Size{324, 642},
2377- true,
2378- false,
2379- geom::Point(),
2380- 0,
2381- 0,
2382- mir_power_mode_on
2383- });
2384- /* Not connected */
2385- outputs.push_back(
2386- {
2387- mg::DisplayConfigurationOutputId{13},
2388- card_id,
2389- mg::DisplayConfigurationOutputType::vga,
2390- {
2391- mir_pixel_format_abgr_8888
2392- },
2393- {},
2394- 0,
2395- geom::Size{324, 642},
2396- false,
2397- false,
2398- geom::Point(),
2399- 1,
2400- 0,
2401- mir_power_mode_on
2402- });
2403+ }
2404
2405+ MockDisplayConfiguration(size_t max_simultaneous_outputs, std::vector<DisplayConfigurationOutput> && config)
2406+ : max_simultaneous_outputs{max_simultaneous_outputs},
2407+ outputs{config}
2408+ {
2409 if (max_simultaneous_outputs == max_simultaneous_outputs_all)
2410 max_simultaneous_outputs = outputs.size();
2411 }
2412
2413- MockDisplayConfiguration()
2414- : MockDisplayConfiguration{max_simultaneous_outputs_all}
2415- {
2416- }
2417-
2418- void for_each_card(std::function<void(mg::DisplayConfigurationCard const&)> f) const
2419- {
2420- f({card_id, max_simultaneous_outputs});
2421- }
2422-
2423- void for_each_output(std::function<void(mg::DisplayConfigurationOutput const&)> f) const
2424+ MockDisplayConfiguration(std::vector<DisplayConfigurationOutput> && config)
2425+ : MockDisplayConfiguration(max_simultaneous_outputs_all, std::move(config))
2426+ {
2427+ }
2428+
2429+ void for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const
2430+ {
2431+ f({DisplayConfigurationCardId{1}, max_simultaneous_outputs});
2432+ }
2433+
2434+ void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const
2435 {
2436 for (auto const& output : outputs)
2437 f(output);
2438 }
2439
2440- MOCK_METHOD5(configure_output, void(mg::DisplayConfigurationOutputId, bool,
2441- geom::Point, size_t, MirPowerMode));
2442+ MOCK_METHOD6(configure_output, void(DisplayConfigurationOutputId, bool,
2443+ Point, size_t, MirPixelFormat, MirPowerMode));
2444
2445+ static const size_t max_simultaneous_outputs_all{std::numeric_limits<size_t>::max()};
2446 private:
2447- static const size_t max_simultaneous_outputs_all{std::numeric_limits<size_t>::max()};
2448- mg::DisplayConfigurationCardId const card_id;
2449 size_t max_simultaneous_outputs;
2450- std::vector<mg::DisplayConfigurationOutput> outputs;
2451+ std::vector<DisplayConfigurationOutput> outputs;
2452 };
2453
2454 }
2455
2456+DisplayConfigurationOutput default_output(DisplayConfigurationOutputId id)
2457+{
2458+ return { id, DisplayConfigurationCardId{1},
2459+ DisplayConfigurationOutputType::vga,
2460+ {mir_pixel_format_abgr_8888},
2461+ { {Size{523, 555}, 60.0} },
2462+ 0,
2463+ Size{324, 642},
2464+ true,
2465+ false,
2466+ Point{X{123}, Y{343}},
2467+ 0,
2468+ mir_pixel_format_abgr_8888,
2469+ mir_power_mode_on
2470+ };
2471+}
2472+
2473+DisplayConfigurationOutput connected_with_modes()
2474+{
2475+ DisplayConfigurationOutput output = default_output(DisplayConfigurationOutputId{10}) ;
2476+ output.modes =
2477+ {
2478+ {Size{123, 111}, 59.9},
2479+ {Size{123, 111}, 59.9},
2480+ {Size{123, 111}, 59.9}
2481+ };
2482+ output.preferred_mode_index = 2;
2483+ output.current_mode_index = 1;
2484+ return output;
2485+}
2486+DisplayConfigurationOutput connected_without_modes()
2487+{
2488+ DisplayConfigurationOutput output = default_output(DisplayConfigurationOutputId{11});
2489+ output.pixel_formats = {};
2490+ output.modes = {};
2491+ output.current_format = mir_pixel_format_invalid;
2492+ output.current_mode_index = std::numeric_limits<size_t>::max();
2493+ return output;
2494+}
2495+
2496+DisplayConfigurationOutput connected_with_single_mode()
2497+{
2498+ return default_output(DisplayConfigurationOutputId{12});
2499+}
2500+
2501+DisplayConfigurationOutput not_connected()
2502+{
2503+ DisplayConfigurationOutput output = default_output(DisplayConfigurationOutputId{13});
2504+ output.connected = false;
2505+ output.current_mode_index = 1;
2506+ return output;
2507+}
2508+
2509+DisplayConfigurationOutput connected_with_rgba_and_xrgb()
2510+{
2511+ DisplayConfigurationOutput output = default_output(DisplayConfigurationOutputId{14});
2512+ output.pixel_formats = {mir_pixel_format_argb_8888, mir_pixel_format_xrgb_8888};
2513+ return output;
2514+}
2515+
2516+DisplayConfigurationOutput connected_with_xrgb_bgr()
2517+{
2518+ DisplayConfigurationOutput output = default_output(DisplayConfigurationOutputId{15});
2519+ output.pixel_formats = {mir_pixel_format_xrgb_8888, mir_pixel_format_bgr_888};
2520+ output.current_format = mir_pixel_format_bgr_888;
2521+ return output;
2522+}
2523+
2524+MockDisplayConfiguration create_default_configuration(size_t max_outputs = MockDisplayConfiguration::max_simultaneous_outputs_all)
2525+{
2526+ return MockDisplayConfiguration
2527+ {
2528+ max_outputs,
2529+ {
2530+ connected_with_modes(),
2531+ connected_without_modes(),
2532+ connected_with_single_mode(),
2533+ not_connected(),
2534+ }
2535+ };
2536+}
2537+
2538 TEST(DefaultDisplayConfigurationPolicyTest, uses_all_connected_valid_outputs)
2539 {
2540 using namespace ::testing;
2541
2542- mg::DefaultDisplayConfigurationPolicy policy;
2543- MockDisplayConfiguration conf;
2544+ DefaultDisplayConfigurationPolicy policy;
2545+ MockDisplayConfiguration conf{create_default_configuration()};
2546
2547- conf.for_each_output([&conf](mg::DisplayConfigurationOutput const& output)
2548+ conf.for_each_output([&conf](DisplayConfigurationOutput const& output)
2549 {
2550 if (output.connected && output.modes.size() > 0)
2551 {
2552- EXPECT_CALL(conf, configure_output(output.id, true, geom::Point(),
2553- output.preferred_mode_index, _));
2554+ EXPECT_CALL(conf, configure_output(output.id, true, Point(),
2555+ output.preferred_mode_index,
2556+ _, _));
2557 }
2558 else
2559 {
2560 EXPECT_CALL(conf, configure_output(output.id, false, output.top_left,
2561- output.current_mode_index, _));
2562+ output.current_mode_index,
2563+ _, _));
2564 }
2565 });
2566
2567@@ -175,12 +184,12 @@
2568 {
2569 using namespace ::testing;
2570
2571- mg::DefaultDisplayConfigurationPolicy policy;
2572- MockDisplayConfiguration conf;
2573+ DefaultDisplayConfigurationPolicy policy;
2574+ MockDisplayConfiguration conf{create_default_configuration()};
2575
2576- conf.for_each_output([&conf](mg::DisplayConfigurationOutput const& output)
2577+ conf.for_each_output([&conf](DisplayConfigurationOutput const& output)
2578 {
2579- EXPECT_CALL(conf, configure_output(output.id, _, _, _, mir_power_mode_on));
2580+ EXPECT_CALL(conf, configure_output(output.id, _, _, _, _, mir_power_mode_on));
2581 });
2582
2583 policy.apply_to(conf);
2584@@ -191,20 +200,54 @@
2585 using namespace ::testing;
2586
2587 size_t const max_simultaneous_outputs{1};
2588- mg::DefaultDisplayConfigurationPolicy policy;
2589- MockDisplayConfiguration conf{max_simultaneous_outputs};
2590+ DefaultDisplayConfigurationPolicy policy;
2591+ MockDisplayConfiguration conf{create_default_configuration(max_simultaneous_outputs)};
2592
2593 size_t output_count{0};
2594- conf.for_each_output([&output_count](mg::DisplayConfigurationOutput const&)
2595+ conf.for_each_output([&output_count](DisplayConfigurationOutput const&)
2596 {
2597 ++output_count;
2598 });
2599
2600- EXPECT_CALL(conf, configure_output(_, true, _, _, _))
2601+ EXPECT_CALL(conf, configure_output(_, true, _, _, _, _))
2602 .Times(AtMost(max_simultaneous_outputs));
2603
2604- EXPECT_CALL(conf, configure_output(_, false, _, _, _))
2605+ EXPECT_CALL(conf, configure_output(_, false, _, _, _, _))
2606 .Times(AtLeast(output_count - max_simultaneous_outputs));
2607
2608 policy.apply_to(conf);
2609 }
2610+
2611+TEST(DefaultDisplayConfigurationPolicyTest, prefer_opaque_over_alpha)
2612+{
2613+ using namespace ::testing;
2614+
2615+ DefaultDisplayConfigurationPolicy policy;
2616+ MockDisplayConfiguration pick_xrgb{ { connected_with_rgba_and_xrgb() } };
2617+
2618+ EXPECT_CALL(pick_xrgb, configure_output(_, true, _, _, mir_pixel_format_xrgb_8888, _));
2619+ policy.apply_to(pick_xrgb);
2620+}
2621+
2622+TEST(DefaultDisplayConfigurationPolicyTest, preserve_opaque_selection)
2623+{
2624+ using namespace ::testing;
2625+
2626+ DefaultDisplayConfigurationPolicy policy;
2627+ MockDisplayConfiguration keep_bgr{ { connected_with_xrgb_bgr() } };
2628+
2629+ EXPECT_CALL(keep_bgr, configure_output(_, true, _, _, mir_pixel_format_bgr_888, _));
2630+ policy.apply_to(keep_bgr);
2631+}
2632+
2633+TEST(DefaultDisplayConfigurationPolicyTest, accept_transparency_when_only_option)
2634+{
2635+ using namespace ::testing;
2636+
2637+ DefaultDisplayConfigurationPolicy policy;
2638+ MockDisplayConfiguration pick_rgba{ { default_output(DisplayConfigurationOutputId{15}) } };
2639+
2640+ EXPECT_CALL(pick_rgba, configure_output(_, true, _, _, mir_pixel_format_abgr_8888, _));
2641+ policy.apply_to(pick_rgba);
2642+}
2643+
2644
2645=== modified file 'tests/unit-tests/graphics/test_display_configuration.cpp'
2646--- tests/unit-tests/graphics/test_display_configuration.cpp 2013-12-17 18:24:51 +0000
2647+++ tests/unit-tests/graphics/test_display_configuration.cpp 2014-01-02 11:14:12 +0000
2648@@ -45,7 +45,7 @@
2649 true,
2650 geom::Point(),
2651 2,
2652- 0,
2653+ mir_pixel_format_abgr_8888,
2654 mir_power_mode_on
2655 };
2656
2657
2658=== added file 'tests/unit-tests/graphics/test_pixel_format_utils.cpp'
2659--- tests/unit-tests/graphics/test_pixel_format_utils.cpp 1970-01-01 00:00:00 +0000
2660+++ tests/unit-tests/graphics/test_pixel_format_utils.cpp 2014-01-02 11:14:12 +0000
2661@@ -0,0 +1,90 @@
2662+/*
2663+ * Copyright © 2013 Canonical Ltd.
2664+ *
2665+ * This program is free software: you can redistribute it and/or modify it
2666+ * under the terms of the GNU General Public License version 3,
2667+ * as published by the Free Software Foundation.
2668+ *
2669+ * This program is distributed in the hope that it will be useful,
2670+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2671+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2672+ * GNU General Public License for more details.
2673+ *
2674+ * You should have received a copy of the GNU General Public License
2675+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
2676+ *
2677+ * Authored by: Andreas Pokorny <andreas.pokorny@canonical.com>
2678+ */
2679+
2680+#include "mir_toolkit/common.h"
2681+#include "mir/graphics/pixel_format_utils.h"
2682+#include <gmock/gmock.h>
2683+#include <gtest/gtest.h>
2684+
2685+using namespace mir::graphics;
2686+TEST(MirPixelFormatUtils, contains_alpha)
2687+{
2688+ EXPECT_FALSE(contains_alpha(mir_pixel_format_xbgr_8888));
2689+ EXPECT_FALSE(contains_alpha(mir_pixel_format_bgr_888));
2690+ EXPECT_FALSE(contains_alpha(mir_pixel_format_xrgb_8888));
2691+ EXPECT_FALSE(contains_alpha(mir_pixel_format_xbgr_8888));
2692+ EXPECT_TRUE(contains_alpha(mir_pixel_format_argb_8888));
2693+ EXPECT_TRUE(contains_alpha(mir_pixel_format_abgr_8888));
2694+ EXPECT_FALSE(contains_alpha(mir_pixel_format_invalid));
2695+}
2696+
2697+TEST(MirPixelFormatUtils, red_channel_depths)
2698+{
2699+ EXPECT_EQ(8, red_channel_depth(mir_pixel_format_xbgr_8888));
2700+ EXPECT_EQ(8, red_channel_depth(mir_pixel_format_bgr_888));
2701+ EXPECT_EQ(8, red_channel_depth(mir_pixel_format_xrgb_8888));
2702+ EXPECT_EQ(8, red_channel_depth(mir_pixel_format_xbgr_8888));
2703+ EXPECT_EQ(8, red_channel_depth(mir_pixel_format_argb_8888));
2704+ EXPECT_EQ(8, red_channel_depth(mir_pixel_format_abgr_8888));
2705+ EXPECT_EQ(0, red_channel_depth(mir_pixel_format_invalid));
2706+}
2707+
2708+TEST(MirPixelFormatUtils, blue_channel_depths)
2709+{
2710+ EXPECT_EQ(8, blue_channel_depth(mir_pixel_format_xbgr_8888));
2711+ EXPECT_EQ(8, blue_channel_depth(mir_pixel_format_bgr_888));
2712+ EXPECT_EQ(8, blue_channel_depth(mir_pixel_format_xrgb_8888));
2713+ EXPECT_EQ(8, blue_channel_depth(mir_pixel_format_xbgr_8888));
2714+ EXPECT_EQ(8, blue_channel_depth(mir_pixel_format_argb_8888));
2715+ EXPECT_EQ(8, blue_channel_depth(mir_pixel_format_abgr_8888));
2716+ EXPECT_EQ(0, blue_channel_depth(mir_pixel_format_invalid));
2717+}
2718+
2719+TEST(MirPixelFormatUtils, green_channel_depths)
2720+{
2721+ EXPECT_EQ(8, green_channel_depth(mir_pixel_format_xbgr_8888));
2722+ EXPECT_EQ(8, green_channel_depth(mir_pixel_format_bgr_888));
2723+ EXPECT_EQ(8, green_channel_depth(mir_pixel_format_xrgb_8888));
2724+ EXPECT_EQ(8, green_channel_depth(mir_pixel_format_xbgr_8888));
2725+ EXPECT_EQ(8, green_channel_depth(mir_pixel_format_argb_8888));
2726+ EXPECT_EQ(8, green_channel_depth(mir_pixel_format_abgr_8888));
2727+ EXPECT_EQ(0, green_channel_depth(mir_pixel_format_invalid));
2728+}
2729+
2730+
2731+TEST(MirPixelFormatUtils, alpha_channel_depths)
2732+{
2733+ EXPECT_EQ(0, alpha_channel_depth(mir_pixel_format_xbgr_8888));
2734+ EXPECT_EQ(0, alpha_channel_depth(mir_pixel_format_bgr_888));
2735+ EXPECT_EQ(0, alpha_channel_depth(mir_pixel_format_xrgb_8888));
2736+ EXPECT_EQ(0, alpha_channel_depth(mir_pixel_format_xbgr_8888));
2737+ EXPECT_EQ(8, alpha_channel_depth(mir_pixel_format_argb_8888));
2738+ EXPECT_EQ(8, alpha_channel_depth(mir_pixel_format_abgr_8888));
2739+ EXPECT_EQ(0, alpha_channel_depth(mir_pixel_format_invalid));
2740+}
2741+
2742+TEST(MirPixelFormatUtils, valid_mir_pixel_format)
2743+{
2744+ EXPECT_TRUE(valid_mir_pixel_format(mir_pixel_format_xbgr_8888));
2745+ EXPECT_TRUE(valid_mir_pixel_format(mir_pixel_format_bgr_888));
2746+ EXPECT_TRUE(valid_mir_pixel_format(mir_pixel_format_xrgb_8888));
2747+ EXPECT_TRUE(valid_mir_pixel_format(mir_pixel_format_xbgr_8888));
2748+ EXPECT_TRUE(valid_mir_pixel_format(mir_pixel_format_argb_8888));
2749+ EXPECT_TRUE(valid_mir_pixel_format(mir_pixel_format_abgr_8888));
2750+ EXPECT_FALSE(valid_mir_pixel_format(mir_pixel_format_invalid));
2751+}

Subscribers

People subscribed via source and target branches