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
=== modified file 'benchmarks/CMakeLists.txt'
--- benchmarks/CMakeLists.txt 2013-10-15 10:10:05 +0000
+++ benchmarks/CMakeLists.txt 2014-01-02 11:14:12 +0000
@@ -2,7 +2,9 @@
2 benchmarks2 benchmarks
3)3)
44
5add_subdirectory(android-input)5if (MIR_ENABLE_TESTS)
6 add_subdirectory(android-input)
7endif ()
6add_subdirectory(cpu)8add_subdirectory(cpu)
7add_subdirectory(memory)9add_subdirectory(memory)
810
911
=== modified file 'doc/building_source_for_android.md'
--- doc/building_source_for_android.md 2013-12-17 18:24:51 +0000
+++ doc/building_source_for_android.md 2014-01-02 11:14:12 +0000
@@ -51,35 +51,24 @@
51ubuntu package) to produce armhf code. This is typically the quickest way to51ubuntu package) to produce armhf code. This is typically the quickest way to
52compile and run code, and is well suited for a development workflow.52compile and run code, and is well suited for a development workflow.
5353
54- Be sure that the cross compiler that you are using matches the target54Initial setup of a desktop machine for cross-compiling to armhf is simple:
55 environment. (eg, make sure you're using the trusty toolchain if you're55
56 targeting a trusty phablet image) You can specify the toolchain version56 $ sudo apt-get install g++-arm-linux-gnueabihf/trusty debootstrap
57 thusly:57 $ 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'
5858 $ sudo apt-get update
59 $ apt-get install g++-arm-linux-gnueabihf/trusty59
6060Now to test that everything is working you can try downloading a package like
61- Get access to armhf packages via apt-get. On an amd64/ia32 system, you can61this:
62 do this by adding a file like the one below to /etc/apt/sources.list.d/62
6363 $ apt-get download gcc:armhf
64 #example sources.list with armhf dependencies64
65 deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe multiverse65Once you're able to download armhf packages from the repository, the
66 66cross-compile-chroot.sh script provides an example of how to build Mir for
67 Then you should run:67armhf:
6868
69 $ apt-get update69 $ ./cross-compile-chroot.sh
7070 $ ls -l build-android-arm/* # binaries to copy to your device
71 To test, try downloading a package like this:71
7272To speed up the process for future branches you may wish to cache the files
73 $ apt-get download my-package:armhf73downloaded by setting environment variable MIR_NDK_PATH to point to a directory
7474that cross-compile-chroot.sh should reuse each time.
75- Once you're able to download armhf packages from the repository, the
76 cross-compile-chroot.sh script provides an example of how to download
77 a partial chroot with the mir dependencies, and compile the source for
78 android targets.
79
80 The script sets up a partial chroot via tools/setup-partial-armhf-chroot.sh
81 and then runs build commands similar to this:
82
83 $ mkdir mir/build; cd mir/build
84 $ MIR_NDK_PATH=/path/to/depenendcies/chroot cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/LinuxCrossCompile.cmake -DBoost_COMPILER=-gcc -DMIR_PLATFORM=android ..
85 $ make
8675
=== modified file 'examples/demo-shell/window_manager.cpp'
--- examples/demo-shell/window_manager.cpp 2013-12-17 18:24:51 +0000
+++ examples/demo-shell/window_manager.cpp 2014-01-02 11:14:12 +0000
@@ -151,8 +151,9 @@
151 power_mode = mir_power_mode_off;151 power_mode = mir_power_mode_off;
152152
153 conf->configure_output(output.id, output.used,153 conf->configure_output(output.id, output.used,
154 output.top_left, 154 output.top_left,
155 output.current_mode_index,155 output.current_mode_index,
156 output.current_format,
156 power_mode);157 power_mode);
157 });158 });
158 display_off = !display_off;159 display_off = !display_off;
159160
=== modified file 'examples/server_configuration.cpp'
--- examples/server_configuration.cpp 2013-10-21 10:40:19 +0000
+++ examples/server_configuration.cpp 2014-01-02 11:14:12 +0000
@@ -61,14 +61,16 @@
61 available_outputs_for_card[conf_output.card_id] > 0)61 available_outputs_for_card[conf_output.card_id] > 0)
62 {62 {
63 conf.configure_output(conf_output.id, true, geom::Point{max_x, 0},63 conf.configure_output(conf_output.id, true, geom::Point{max_x, 0},
64 preferred_mode_index, mir_power_mode_on);64 preferred_mode_index, conf_output.current_format,
65 mir_power_mode_on);
65 max_x += conf_output.modes[preferred_mode_index].size.width.as_int();66 max_x += conf_output.modes[preferred_mode_index].size.width.as_int();
66 --available_outputs_for_card[conf_output.card_id];67 --available_outputs_for_card[conf_output.card_id];
67 }68 }
68 else69 else
69 {70 {
70 conf.configure_output(conf_output.id, false, conf_output.top_left,71 conf.configure_output(conf_output.id, false, conf_output.top_left,
71 conf_output.current_mode_index, mir_power_mode_on);72 conf_output.current_mode_index, conf_output.current_format,
73 mir_power_mode_on);
72 }74 }
73 });75 });
74 }76 }
@@ -88,13 +90,15 @@
88 if (!done && conf_output.connected && conf_output.modes.size() > 0)90 if (!done && conf_output.connected && conf_output.modes.size() > 0)
89 {91 {
90 conf.configure_output(conf_output.id, true, geom::Point{0, 0},92 conf.configure_output(conf_output.id, true, geom::Point{0, 0},
91 preferred_mode_index, mir_power_mode_on);93 preferred_mode_index, conf_output.current_format,
94 mir_power_mode_on);
92 done = true;95 done = true;
93 }96 }
94 else97 else
95 {98 {
96 conf.configure_output(conf_output.id, false, conf_output.top_left,99 conf.configure_output(conf_output.id, false, conf_output.top_left,
97 conf_output.current_mode_index, mir_power_mode_on);100 conf_output.current_mode_index, conf_output.current_format,
101 mir_power_mode_on);
98 }102 }
99 });103 });
100 }104 }
101105
=== modified file 'include/platform/mir/graphics/display_configuration.h'
--- include/platform/mir/graphics/display_configuration.h 2013-12-17 18:24:51 +0000
+++ include/platform/mir/graphics/display_configuration.h 2014-01-02 11:14:12 +0000
@@ -104,7 +104,7 @@
104 /** The index in the 'modes' vector of the current output mode. */104 /** The index in the 'modes' vector of the current output mode. */
105 size_t current_mode_index;105 size_t current_mode_index;
106 /** The index in the 'pixel_format' vector of the current output pixel format. */106 /** The index in the 'pixel_format' vector of the current output pixel format. */
107 size_t current_format_index;107 MirPixelFormat current_format;
108 /** Current power mode **/108 /** Current power mode **/
109 MirPowerMode power_mode;109 MirPowerMode power_mode;
110};110};
@@ -135,8 +135,8 @@
135 virtual void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const = 0;135 virtual void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const = 0;
136136
137 /** Configures an output. */137 /** Configures an output. */
138 virtual void configure_output(DisplayConfigurationOutputId id, bool used,138 virtual void configure_output(DisplayConfigurationOutputId id, bool used, geometry::Point top_left,
139 geometry::Point top_left, size_t mode_index, MirPowerMode power_mode) = 0;139 size_t mode_index, MirPixelFormat format, MirPowerMode power_mode) = 0;
140140
141protected:141protected:
142 DisplayConfiguration() = default;142 DisplayConfiguration() = default;
143143
=== added file 'include/platform/mir/graphics/pixel_format_utils.h'
--- include/platform/mir/graphics/pixel_format_utils.h 1970-01-01 00:00:00 +0000
+++ include/platform/mir/graphics/pixel_format_utils.h 2014-01-02 11:14:12 +0000
@@ -0,0 +1,50 @@
1/*
2 * Copyright © 2013 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Andreas Pokorny <andreas.pokorny@canonical.com>
17 */
18
19#ifndef MIR_GRAPHICS_PIXEL_FORMAT_UTILS_H_
20#define MIR_GRAPHICS_PIXEL_FORMAT_UTILS_H_
21
22#include "mir_toolkit/common.h"
23
24namespace mir
25{
26namespace graphics
27{
28
29/*!
30 * \name MirPixelFormat utility functions
31 *
32 * A set of functions to query details of MirPixelFormat
33 * TODO improve this through https://bugs.launchpad.net/mir/+bug/1236254
34 * \{
35 */
36bool contains_alpha(MirPixelFormat format);
37int red_channel_depth(MirPixelFormat format);
38int blue_channel_depth(MirPixelFormat format);
39int green_channel_depth(MirPixelFormat format);
40int alpha_channel_depth(MirPixelFormat format);
41bool valid_mir_pixel_format(MirPixelFormat format);
42/*!
43 * \}
44 */
45
46
47}
48}
49
50#endif
051
=== modified file 'include/platform/mir/graphics/platform.h'
--- include/platform/mir/graphics/platform.h 2013-12-17 18:24:51 +0000
+++ include/platform/mir/graphics/platform.h 2014-01-02 11:14:12 +0000
@@ -81,7 +81,7 @@
81 * Creates the display subsystem.81 * Creates the display subsystem.
82 */82 */
83 virtual std::shared_ptr<Display> create_display(83 virtual std::shared_ptr<Display> create_display(
84 std::shared_ptr<DisplayConfigurationPolicy> const& initial_conf_policy) = 0;84 std::shared_ptr<DisplayConfigurationPolicy> const& initial_conf_policy) = 0;
8585
86 /**86 /**
87 * Gets the IPC package for the platform.87 * Gets the IPC package for the platform.
8888
=== added file 'include/shared/mir/logging/input_timestamp.h'
--- include/shared/mir/logging/input_timestamp.h 1970-01-01 00:00:00 +0000
+++ include/shared/mir/logging/input_timestamp.h 2014-01-02 11:14:12 +0000
@@ -0,0 +1,35 @@
1/*
2 * Copyright © 2013 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Daniel van Vugt <daniel.van.vugt@canonical.com>
17 */
18
19#ifndef MIR_LOGGING_INPUT_TIMESTAMP_H_
20#define MIR_LOGGING_INPUT_TIMESTAMP_H_
21
22#include "mir_toolkit/event.h"
23#include <string>
24
25namespace mir
26{
27namespace logging
28{
29
30std::string input_timestamp(nsecs_t when);
31
32}
33}
34
35#endif // MIR_LOGGING_INPUT_TIMESTAMP_H_
036
=== modified file 'include/shared/mir_toolkit/client_types.h'
--- include/shared/mir_toolkit/client_types.h 2013-12-17 18:24:51 +0000
+++ include/shared/mir_toolkit/client_types.h 2014-01-02 11:14:12 +0000
@@ -230,7 +230,7 @@
230230
231 uint32_t num_output_formats;231 uint32_t num_output_formats;
232 MirPixelFormat* output_formats;232 MirPixelFormat* output_formats;
233 uint32_t current_output_format;233 MirPixelFormat current_output_format;
234234
235 uint32_t card_id;235 uint32_t card_id;
236 uint32_t output_id;236 uint32_t output_id;
237237
=== modified file 'include/test/mir_test_doubles/mock_surface_renderer.h'
--- include/test/mir_test_doubles/mock_surface_renderer.h 2013-12-17 18:24:51 +0000
+++ include/test/mir_test_doubles/mock_surface_renderer.h 2014-01-02 11:14:12 +0000
@@ -31,8 +31,9 @@
3131
32struct MockSurfaceRenderer : public compositor::Renderer32struct MockSurfaceRenderer : public compositor::Renderer
33{33{
34 MOCK_CONST_METHOD0(begin, void());
34 MOCK_CONST_METHOD2(render, void(compositor::CompositingCriteria const&, graphics::Buffer&));35 MOCK_CONST_METHOD2(render, void(compositor::CompositingCriteria const&, graphics::Buffer&));
35 MOCK_CONST_METHOD0(clear, void());36 MOCK_CONST_METHOD0(end, void());
3637
37 ~MockSurfaceRenderer() noexcept {}38 ~MockSurfaceRenderer() noexcept {}
38};39};
3940
=== modified file 'include/test/mir_test_doubles/null_display_configuration.h'
--- include/test/mir_test_doubles/null_display_configuration.h 2013-09-12 21:36:55 +0000
+++ include/test/mir_test_doubles/null_display_configuration.h 2014-01-02 11:14:12 +0000
@@ -35,7 +35,7 @@
35 void for_each_output(std::function<void(graphics::DisplayConfigurationOutput const&)>) const35 void for_each_output(std::function<void(graphics::DisplayConfigurationOutput const&)>) const
36 {36 {
37 }37 }
38 void configure_output(graphics::DisplayConfigurationOutputId, bool, geometry::Point, size_t, MirPowerMode) override38 void configure_output(graphics::DisplayConfigurationOutputId, bool, geometry::Point, size_t, MirPixelFormat, MirPowerMode) override
39 {39 {
40 }40 }
41};41};
4242
=== modified file 'include/test/mir_test_doubles/stub_display_configuration.h'
--- include/test/mir_test_doubles/stub_display_configuration.h 2013-12-17 18:24:51 +0000
+++ include/test/mir_test_doubles/stub_display_configuration.h 2014-01-02 11:14:12 +0000
@@ -79,7 +79,7 @@
79 ((i % 2) == 0),79 ((i % 2) == 0),
80 ((i % 2) == 1),80 ((i % 2) == 1),
81 top_left,81 top_left,
82 mode_index, 1u,82 mode_index, pfs[1u],
83 mir_power_mode_off83 mir_power_mode_off
84 };84 };
8585
@@ -107,7 +107,8 @@
107 graphics::DisplayConfigurationOutputType::vga,107 graphics::DisplayConfigurationOutputType::vga,
108 std::vector<MirPixelFormat>{mir_pixel_format_abgr_8888},108 std::vector<MirPixelFormat>{mir_pixel_format_abgr_8888},
109 {{rect.size, 60.0}},109 {{rect.size, 60.0}},
110 0, geometry::Size{}, true, true, rect.top_left, 0, 0, mir_power_mode_on110 0, geometry::Size{}, true, true, rect.top_left, 0,
111 mir_pixel_format_abgr_8888, mir_power_mode_on
111 };112 };
112113
113 outputs.push_back(output);114 outputs.push_back(output);
@@ -122,13 +123,13 @@
122 cards.push_back(card);123 cards.push_back(card);
123 }124 }
124125
125 void for_each_card(std::function<void(graphics::DisplayConfigurationCard const&)> f) const126 void for_each_card(std::function<void(graphics::DisplayConfigurationCard const&)> f) const override
126 {127 {
127 for (auto const& card : cards)128 for (auto const& card : cards)
128 f(card);129 f(card);
129 }130 }
130131
131 void for_each_output(std::function<void(graphics::DisplayConfigurationOutput const&)> f) const132 void for_each_output(std::function<void(graphics::DisplayConfigurationOutput const&)> f) const override
132 {133 {
133 for (auto& disp : outputs)134 for (auto& disp : outputs)
134 {135 {
@@ -136,7 +137,7 @@
136 }137 }
137 }138 }
138139
139 void configure_output(graphics::DisplayConfigurationOutputId, bool, geometry::Point, size_t, MirPowerMode)140 void configure_output(graphics::DisplayConfigurationOutputId, bool, geometry::Point, size_t, MirPixelFormat, MirPowerMode) override
140 {141 {
141 }142 }
142143
143144
=== modified file 'src/client/display_configuration.cpp'
--- src/client/display_configuration.cpp 2013-12-17 18:24:51 +0000
+++ src/client/display_configuration.cpp 2014-01-02 11:14:12 +0000
@@ -88,7 +88,7 @@
88 {88 {
89 output.output_formats[i] = static_cast<MirPixelFormat>(msg.pixel_format(i));89 output.output_formats[i] = static_cast<MirPixelFormat>(msg.pixel_format(i));
90 }90 }
91 output.current_output_format = msg.current_format();91 output.current_output_format = static_cast<MirPixelFormat>(msg.current_format());
9292
93 output.position_x = msg.position_x();93 output.position_x = msg.position_x();
94 output.position_y = msg.position_y();94 output.position_y = msg.position_y();
9595
=== modified file 'src/client/logging/input_receiver_report.cpp'
--- src/client/logging/input_receiver_report.cpp 2013-12-17 18:24:51 +0000
+++ src/client/logging/input_receiver_report.cpp 2014-01-02 11:14:12 +0000
@@ -19,6 +19,7 @@
19#include "input_receiver_report.h"19#include "input_receiver_report.h"
2020
21#include "mir/logging/logger.h"21#include "mir/logging/logger.h"
22#include "mir/logging/input_timestamp.h"
2223
23#include <boost/throw_exception.hpp>24#include <boost/throw_exception.hpp>
2425
@@ -53,7 +54,7 @@
53 ss << " scan_code: " << ev.scan_code << std::endl;54 ss << " scan_code: " << ev.scan_code << std::endl;
54 ss << " repeat_count: " << ev.repeat_count << std::endl;55 ss << " repeat_count: " << ev.repeat_count << std::endl;
55 ss << " down_time: " << ev.down_time << std::endl;56 ss << " down_time: " << ev.down_time << std::endl;
56 ss << " event_time: " << ev.event_time << std::endl;57 ss << " event_time: " << ml::input_timestamp(ev.event_time) << std::endl;
57 ss << " is_system_key: " << ev.is_system_key << std::endl;58 ss << " is_system_key: " << ev.is_system_key << std::endl;
58 ss << "}";59 ss << "}";
59}60}
@@ -73,7 +74,7 @@
73 ss << " x_precision: " << ev.x_precision << std::endl;74 ss << " x_precision: " << ev.x_precision << std::endl;
74 ss << " y_precision: " << ev.y_precision << std::endl;75 ss << " y_precision: " << ev.y_precision << std::endl;
75 ss << " down_time: " << ev.down_time << std::endl;76 ss << " down_time: " << ev.down_time << std::endl;
76 ss << " event_time: " << ev.event_time << std::endl;77 ss << " event_time: " << ml::input_timestamp(ev.event_time) << std::endl;
77 ss << " pointer_count: " << ev.pointer_count << std::endl;78 ss << " pointer_count: " << ev.pointer_count << std::endl;
78 for (unsigned int i = 0; i < ev.pointer_count; i++)79 for (unsigned int i = 0; i < ev.pointer_count; i++)
79 {80 {
8081
=== modified file 'src/platform/graphics/CMakeLists.txt'
--- src/platform/graphics/CMakeLists.txt 2013-12-17 18:24:51 +0000
+++ src/platform/graphics/CMakeLists.txt 2014-01-02 11:14:12 +0000
@@ -10,6 +10,7 @@
10 display_configuration.cpp10 display_configuration.cpp
11 null_display_report.cpp11 null_display_report.cpp
12 buffer_basic.cpp12 buffer_basic.cpp
13 pixel_format_utils.cpp
13)14)
1415
15add_library(16add_library(
1617
=== modified file 'src/platform/graphics/android/android_display_configuration.cpp'
--- src/platform/graphics/android/android_display_configuration.cpp 2013-12-17 18:24:51 +0000
+++ src/platform/graphics/android/android_display_configuration.cpp 2014-01-02 11:14:12 +0000
@@ -31,7 +31,9 @@
31 true,31 true,
32 true,32 true,
33 geom::Point{0,0},33 geom::Point{0,0},
34 0, 0, mir_power_mode_on},34 0,
35 mir_pixel_format_abgr_8888,
36 mir_power_mode_on},
35 card{mg::DisplayConfigurationCardId{0}, 1}37 card{mg::DisplayConfigurationCardId{0}, 1}
36{38{
37}39}
@@ -62,7 +64,7 @@
62 f(configuration);64 f(configuration);
63}65}
6466
65void mga::AndroidDisplayConfiguration::configure_output(mg::DisplayConfigurationOutputId, bool, geom::Point, size_t, MirPowerMode power_mode)67void mga::AndroidDisplayConfiguration::configure_output(mg::DisplayConfigurationOutputId, bool, geom::Point, size_t, MirPixelFormat, MirPowerMode power_mode)
66{68{
67 configuration.power_mode = power_mode;69 configuration.power_mode = power_mode;
68}70}
6971
=== modified file 'src/platform/graphics/android/android_display_configuration.h'
--- src/platform/graphics/android/android_display_configuration.h 2013-12-17 18:24:51 +0000
+++ src/platform/graphics/android/android_display_configuration.h 2014-01-02 11:14:12 +0000
@@ -37,7 +37,7 @@
3737
38 void for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const;38 void for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const;
39 void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const;39 void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const;
40 void configure_output(DisplayConfigurationOutputId, bool, geometry::Point, size_t, MirPowerMode power_mode);40 void configure_output(DisplayConfigurationOutputId, bool, geometry::Point, size_t, MirPixelFormat, MirPowerMode power_mode);
4141
42private:42private:
43 DisplayConfigurationOutput configuration;43 DisplayConfigurationOutput configuration;
4444
=== modified file 'src/platform/graphics/mesa/real_kms_display_configuration.cpp'
--- src/platform/graphics/mesa/real_kms_display_configuration.cpp 2013-12-17 18:24:51 +0000
+++ src/platform/graphics/mesa/real_kms_display_configuration.cpp 2014-01-02 11:14:12 +0000
@@ -18,6 +18,7 @@
1818
19#include "real_kms_display_configuration.h"19#include "real_kms_display_configuration.h"
20#include "drm_mode_resources.h"20#include "drm_mode_resources.h"
21#include "mir/graphics/pixel_format_utils.h"
2122
22#include <cmath>23#include <cmath>
23#include <limits>24#include <limits>
@@ -26,9 +27,15 @@
26#include <stdexcept>27#include <stdexcept>
27#include <algorithm>28#include <algorithm>
2829
29namespace mg = mir::graphics;30
30namespace mgm = mir::graphics::mesa;31namespace mir
31namespace geom = mir::geometry;32{
33namespace graphics
34{
35namespace mesa
36{
37
38namespace geom = geometry;
3239
33namespace40namespace
34{41{
@@ -59,28 +66,33 @@
59 return round(vrefresh_hz * 10.0) / 10.0;66 return round(vrefresh_hz * 10.0) / 10.0;
60}67}
6168
62mg::DisplayConfigurationOutputType69DisplayConfigurationOutputType
63kms_connector_type_to_output_type(uint32_t connector_type)70kms_connector_type_to_output_type(uint32_t connector_type)
64{71{
65 return static_cast<mg::DisplayConfigurationOutputType>(connector_type);72 return static_cast<DisplayConfigurationOutputType>(connector_type);
66}73}
6774
68}75bool format_available_in_pixel_formats(MirPixelFormat format, DisplayConfigurationOutput const& output)
6976{
70mgm::RealKMSDisplayConfiguration::RealKMSDisplayConfiguration(int drm_fd)77 return output.pixel_formats.end() != find(output.pixel_formats.begin(), output.pixel_formats.end(), format);
78}
79
80}
81
82RealKMSDisplayConfiguration::RealKMSDisplayConfiguration(int drm_fd)
71 : drm_fd{drm_fd}83 : drm_fd{drm_fd}
72{84{
73 update();85 update();
74}86}
7587
76mgm::RealKMSDisplayConfiguration::RealKMSDisplayConfiguration(88RealKMSDisplayConfiguration::RealKMSDisplayConfiguration(
77 RealKMSDisplayConfiguration const& conf)89 RealKMSDisplayConfiguration const& conf)
78 : KMSDisplayConfiguration(), drm_fd{conf.drm_fd},90 : KMSDisplayConfiguration(), drm_fd{conf.drm_fd},
79 card(conf.card), outputs{conf.outputs}91 card(conf.card), outputs{conf.outputs}
80{92{
81}93}
8294
83mgm::RealKMSDisplayConfiguration& mgm::RealKMSDisplayConfiguration::operator=(95RealKMSDisplayConfiguration& RealKMSDisplayConfiguration::operator=(
84 RealKMSDisplayConfiguration const& conf)96 RealKMSDisplayConfiguration const& conf)
85{97{
86 if (&conf != this)98 if (&conf != this)
@@ -93,23 +105,23 @@
93 return *this;105 return *this;
94}106}
95107
96void mgm::RealKMSDisplayConfiguration::for_each_card(108void RealKMSDisplayConfiguration::for_each_card(
97 std::function<void(DisplayConfigurationCard const&)> f) const109 std::function<void(DisplayConfigurationCard const&)> f) const
98{110{
99 f(card);111 f(card);
100}112}
101113
102void mgm::RealKMSDisplayConfiguration::for_each_output(114void RealKMSDisplayConfiguration::for_each_output(
103 std::function<void(DisplayConfigurationOutput const&)> f) const115 std::function<void(DisplayConfigurationOutput const&)> f) const
104{116{
105 for (auto const& output : outputs)117 for (auto const& output : outputs)
106 f(output);118 f(output);
107}119}
108120
109void mgm::RealKMSDisplayConfiguration::configure_output(121void RealKMSDisplayConfiguration::configure_output(
110 DisplayConfigurationOutputId id, bool used,122 DisplayConfigurationOutputId id, bool used,
111 geometry::Point top_left, size_t mode_index,123 geometry::Point top_left, size_t mode_index,
112 MirPowerMode power_mode)124 MirPixelFormat format, MirPowerMode power_mode)
113{125{
114 auto iter = find_output_with_id(id);126 auto iter = find_output_with_id(id);
115127
@@ -120,9 +132,15 @@
120 if (used && mode_index >= output.modes.size())132 if (used && mode_index >= output.modes.size())
121 BOOST_THROW_EXCEPTION(std::runtime_error("Invalid mode_index for used output"));133 BOOST_THROW_EXCEPTION(std::runtime_error("Invalid mode_index for used output"));
122134
135 if (used && !valid_mir_pixel_format(format))
136 BOOST_THROW_EXCEPTION(std::runtime_error("Invalid format for used output"));
137 if (used && !format_available_in_pixel_formats(format, output))
138 BOOST_THROW_EXCEPTION(std::runtime_error("Format not available for used output"));
139
123 output.used = used;140 output.used = used;
124 output.top_left = top_left;141 output.top_left = top_left;
125 output.current_mode_index = mode_index;142 output.current_mode_index = mode_index;
143 output.current_format = format;
126 output.power_mode = power_mode;144 output.power_mode = power_mode;
127 }145 }
128 else146 else
@@ -131,7 +149,7 @@
131 }149 }
132}150}
133151
134uint32_t mgm::RealKMSDisplayConfiguration::get_kms_connector_id(152uint32_t RealKMSDisplayConfiguration::get_kms_connector_id(
135 DisplayConfigurationOutputId id) const153 DisplayConfigurationOutputId id) const
136{154{
137 auto iter = find_output_with_id(id);155 auto iter = find_output_with_id(id);
@@ -145,7 +163,7 @@
145 return id.as_value();163 return id.as_value();
146}164}
147165
148size_t mgm::RealKMSDisplayConfiguration::get_kms_mode_index(166size_t RealKMSDisplayConfiguration::get_kms_mode_index(
149 DisplayConfigurationOutputId id,167 DisplayConfigurationOutputId id,
150 size_t conf_mode_index) const168 size_t conf_mode_index) const
151{169{
@@ -159,12 +177,12 @@
159177
160 return conf_mode_index;178 return conf_mode_index;
161}179}
162void mgm::RealKMSDisplayConfiguration::update()180void RealKMSDisplayConfiguration::update()
163{181{
164 DRMModeResources resources{drm_fd};182 DRMModeResources resources{drm_fd};
165183
166 size_t max_outputs = std::min(resources.num_crtcs(), resources.num_connectors());184 size_t max_outputs = std::min(resources.num_crtcs(), resources.num_connectors());
167 card = {mg::DisplayConfigurationCardId{0}, max_outputs};185 card = {DisplayConfigurationCardId{0}, max_outputs};
168186
169 resources.for_each_connector([&](DRMModeConnectorUPtr connector)187 resources.for_each_connector([&](DRMModeConnectorUPtr connector)
170 {188 {
@@ -172,7 +190,7 @@
172 });190 });
173}191}
174192
175void mgm::RealKMSDisplayConfiguration::add_or_update_output(193void RealKMSDisplayConfiguration::add_or_update_output(
176 DRMModeResources const& resources,194 DRMModeResources const& resources,
177 drmModeConnector const& connector)195 drmModeConnector const& connector)
178{196{
@@ -224,7 +242,8 @@
224 {242 {
225 outputs.push_back({id, card_id, type, formats, modes, preferred_mode_index,243 outputs.push_back({id, card_id, type, formats, modes, preferred_mode_index,
226 physical_size, connected, false, geom::Point(),244 physical_size, connected, false, geom::Point(),
227 current_mode_index, 0u, mir_power_mode_on});245 current_mode_index, mir_pixel_format_xrgb_8888,
246 mir_power_mode_on});
228 }247 }
229 else248 else
230 {249 {
@@ -235,25 +254,30 @@
235 output.physical_size_mm = physical_size;254 output.physical_size_mm = physical_size;
236 output.connected = connected;255 output.connected = connected;
237 output.current_mode_index = current_mode_index;256 output.current_mode_index = current_mode_index;
257 output.current_format = mir_pixel_format_xrgb_8888;
238 }258 }
239}259}
240260
241std::vector<mg::DisplayConfigurationOutput>::iterator261std::vector<DisplayConfigurationOutput>::iterator
242mgm::RealKMSDisplayConfiguration::find_output_with_id(DisplayConfigurationOutputId id)262RealKMSDisplayConfiguration::find_output_with_id(DisplayConfigurationOutputId id)
243{263{
244 return std::find_if(outputs.begin(), outputs.end(),264 return std::find_if(outputs.begin(), outputs.end(),
245 [id](DisplayConfigurationOutput const& output)265 [id](DisplayConfigurationOutput const& output)
246 {266 {
247 return output.id == id;267 return output.id == id;
248 });268 });
249}269}
250270
251std::vector<mg::DisplayConfigurationOutput>::const_iterator271std::vector<DisplayConfigurationOutput>::const_iterator
252mgm::RealKMSDisplayConfiguration::find_output_with_id(DisplayConfigurationOutputId id) const272RealKMSDisplayConfiguration::find_output_with_id(DisplayConfigurationOutputId id) const
253{273{
254 return std::find_if(outputs.begin(), outputs.end(),274 return std::find_if(outputs.begin(), outputs.end(),
255 [id](DisplayConfigurationOutput const& output)275 [id](DisplayConfigurationOutput const& output)
256 {276 {
257 return output.id == id;277 return output.id == id;
258 });278 });
279}
280
281}
282}
259}283}
260284
=== modified file 'src/platform/graphics/mesa/real_kms_display_configuration.h'
--- src/platform/graphics/mesa/real_kms_display_configuration.h 2013-12-17 18:24:51 +0000
+++ src/platform/graphics/mesa/real_kms_display_configuration.h 2014-01-02 11:14:12 +0000
@@ -39,8 +39,8 @@
3939
40 void for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const;40 void for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const;
41 void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const;41 void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const;
42 void configure_output(DisplayConfigurationOutputId id, bool used,42 void configure_output(DisplayConfigurationOutputId id, bool used, geometry::Point top_left,
43 geometry::Point top_left, size_t mode_index, MirPowerMode power_mode);43 size_t mode_index, MirPixelFormat format, MirPowerMode power_mode);
4444
45 uint32_t get_kms_connector_id(DisplayConfigurationOutputId id) const;45 uint32_t get_kms_connector_id(DisplayConfigurationOutputId id) const;
46 size_t get_kms_mode_index(DisplayConfigurationOutputId id, size_t conf_mode_index) const;46 size_t get_kms_mode_index(DisplayConfigurationOutputId id, size_t conf_mode_index) const;
4747
=== added file 'src/platform/graphics/pixel_format_utils.cpp'
--- src/platform/graphics/pixel_format_utils.cpp 1970-01-01 00:00:00 +0000
+++ src/platform/graphics/pixel_format_utils.cpp 2014-01-02 11:14:12 +0000
@@ -0,0 +1,71 @@
1/*
2 * Copyright © 2013 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Andreas Pokorny <andreas.pokorny@canonical.com>
17 */
18
19#include "mir/graphics/pixel_format_utils.h"
20
21namespace mir
22{
23namespace graphics
24{
25
26bool contains_alpha(MirPixelFormat format)
27{
28 return (format == mir_pixel_format_abgr_8888 ||
29 format == mir_pixel_format_argb_8888);
30}
31
32int red_channel_depth(MirPixelFormat format)
33{
34 if (mir_pixel_format_invalid < format &&
35 format < mir_pixel_formats)
36 return 8;
37 return 0;
38}
39
40int blue_channel_depth(MirPixelFormat format)
41{
42 if (mir_pixel_format_invalid < format &&
43 format < mir_pixel_formats)
44 return 8;
45 return 0;
46}
47
48int green_channel_depth(MirPixelFormat format)
49{
50 if (mir_pixel_format_invalid < format &&
51 format < mir_pixel_formats)
52 return 8;
53 return 0;
54}
55
56int alpha_channel_depth(MirPixelFormat format)
57{
58 if (format == mir_pixel_format_abgr_8888 ||
59 format == mir_pixel_format_argb_8888)
60 return 8;
61 return 0;
62}
63
64bool valid_mir_pixel_format(MirPixelFormat format)
65{
66 return (format > mir_pixel_format_invalid &&
67 format < mir_pixel_formats);
68}
69
70}
71}
072
=== modified file 'src/server/compositor/default_display_buffer_compositor.cpp'
--- src/server/compositor/default_display_buffer_compositor.cpp 2013-12-17 18:24:51 +0000
+++ src/server/compositor/default_display_buffer_compositor.cpp 2014-01-02 11:14:12 +0000
@@ -135,10 +135,11 @@
135 mc::OcclusionMatch occlusion_match;135 mc::OcclusionMatch occlusion_match;
136 scene->reverse_for_each_if(occlusion_search, occlusion_match);136 scene->reverse_for_each_if(occlusion_search, occlusion_match);
137137
138 renderer->clear();138 renderer->begin();
139 mc::RenderingOperator applicator(*renderer, save_resource, local_frameno);139 mc::RenderingOperator applicator(*renderer, save_resource, local_frameno);
140 FilterForVisibleSceneInRegion selector(view_area, occlusion_match);140 FilterForVisibleSceneInRegion selector(view_area, occlusion_match);
141 scene->for_each_if(selector, applicator);141 scene->for_each_if(selector, applicator);
142 renderer->end();
142143
143 display_buffer.post_update();144 display_buffer.post_update();
144 }145 }
145146
=== modified file 'src/server/compositor/gl_renderer.cpp'
--- src/server/compositor/gl_renderer.cpp 2013-12-17 18:24:51 +0000
+++ src/server/compositor/gl_renderer.cpp 2014-01-02 11:14:12 +0000
@@ -117,7 +117,7 @@
117117
118}118}
119119
120mc::GLRenderer::Resources::Resources() :120mc::GLRenderer::GLRenderer(geom::Rectangle const& display_area) :
121 vertex_shader(0),121 vertex_shader(0),
122 fragment_shader(0),122 fragment_shader(0),
123 program(0),123 program(0),
@@ -128,24 +128,6 @@
128 vertex_attribs_vbo(0),128 vertex_attribs_vbo(0),
129 texture(0)129 texture(0)
130{130{
131}
132
133mc::GLRenderer::Resources::~Resources()
134{
135 if (vertex_shader)
136 glDeleteShader(vertex_shader);
137 if (fragment_shader)
138 glDeleteShader(fragment_shader);
139 if (program)
140 glDeleteProgram(program);
141 if (vertex_attribs_vbo)
142 glDeleteBuffers(1, &vertex_attribs_vbo);
143 if (texture)
144 glDeleteTextures(1, &texture);
145}
146
147void mc::GLRenderer::Resources::setup(geometry::Rectangle const& display_area)
148{
149 GLint param = 0;131 GLint param = 0;
150132
151 /* Create shaders and program */133 /* Create shaders and program */
@@ -235,14 +217,23 @@
235 glUseProgram(0);217 glUseProgram(0);
236}218}
237219
238mc::GLRenderer::GLRenderer(geom::Rectangle const& display_area)220mc::GLRenderer::~GLRenderer() noexcept
239{221{
240 resources.setup(display_area);222 if (vertex_shader)
223 glDeleteShader(vertex_shader);
224 if (fragment_shader)
225 glDeleteShader(fragment_shader);
226 if (program)
227 glDeleteProgram(program);
228 if (vertex_attribs_vbo)
229 glDeleteBuffers(1, &vertex_attribs_vbo);
230 if (texture)
231 glDeleteTextures(1, &texture);
241}232}
242233
243void mc::GLRenderer::render(CompositingCriteria const& criteria, mg::Buffer& buffer) const234void mc::GLRenderer::render(CompositingCriteria const& criteria, mg::Buffer& buffer) const
244{235{
245 glUseProgram(resources.program);236 glUseProgram(program);
246237
247 if (criteria.shaped() || criteria.alpha() < 1.0f)238 if (criteria.shaped() || criteria.alpha() < 1.0f)
248 {239 {
@@ -255,32 +246,36 @@
255 }246 }
256 glActiveTexture(GL_TEXTURE0);247 glActiveTexture(GL_TEXTURE0);
257248
258 glUniformMatrix4fv(resources.transform_uniform_loc, 1, GL_FALSE,249 glUniformMatrix4fv(transform_uniform_loc, 1, GL_FALSE,
259 glm::value_ptr(criteria.transformation()));250 glm::value_ptr(criteria.transformation()));
260 glUniform1f(resources.alpha_uniform_loc, criteria.alpha());251 glUniform1f(alpha_uniform_loc, criteria.alpha());
261252
262 /* Set up vertex attribute data */253 /* Set up vertex attribute data */
263 glBindBuffer(GL_ARRAY_BUFFER, resources.vertex_attribs_vbo);254 glBindBuffer(GL_ARRAY_BUFFER, vertex_attribs_vbo);
264 glVertexAttribPointer(resources.position_attr_loc, 3, GL_FLOAT,255 glVertexAttribPointer(position_attr_loc, 3, GL_FLOAT,
265 GL_FALSE, sizeof(VertexAttributes), 0);256 GL_FALSE, sizeof(VertexAttributes), 0);
266 glVertexAttribPointer(resources.texcoord_attr_loc, 2, GL_FLOAT,257 glVertexAttribPointer(texcoord_attr_loc, 2, GL_FLOAT,
267 GL_FALSE, sizeof(VertexAttributes),258 GL_FALSE, sizeof(VertexAttributes),
268 reinterpret_cast<void*>(sizeof(glm::vec3)));259 reinterpret_cast<void*>(sizeof(glm::vec3)));
269260
270 /* Use the renderable's texture */261 /* Use the renderable's texture */
271 glBindTexture(GL_TEXTURE_2D, resources.texture);262 glBindTexture(GL_TEXTURE_2D, texture);
272263
273 buffer.bind_to_texture();264 buffer.bind_to_texture();
274265
275 /* Draw */266 /* Draw */
276 glEnableVertexAttribArray(resources.position_attr_loc);267 glEnableVertexAttribArray(position_attr_loc);
277 glEnableVertexAttribArray(resources.texcoord_attr_loc);268 glEnableVertexAttribArray(texcoord_attr_loc);
278 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);269 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
279 glDisableVertexAttribArray(resources.texcoord_attr_loc);270 glDisableVertexAttribArray(texcoord_attr_loc);
280 glDisableVertexAttribArray(resources.position_attr_loc);271 glDisableVertexAttribArray(position_attr_loc);
281}272}
282273
283void mc::GLRenderer::clear() const274void mc::GLRenderer::begin() const
284{275{
285 glClear(GL_COLOR_BUFFER_BIT);276 glClear(GL_COLOR_BUFFER_BIT);
286}277}
278
279void mc::GLRenderer::end() const
280{
281}
287282
=== modified file 'src/server/compositor/gl_renderer.h'
--- src/server/compositor/gl_renderer.h 2013-12-17 18:24:51 +0000
+++ src/server/compositor/gl_renderer.h 2014-01-02 11:14:12 +0000
@@ -32,32 +32,22 @@
32{32{
33public:33public:
34 GLRenderer(geometry::Rectangle const& display_area);34 GLRenderer(geometry::Rectangle const& display_area);
35 virtual ~GLRenderer() noexcept;
3536
37 void begin() const override;
36 void render(CompositingCriteria const& info, graphics::Buffer& buffer) const override;38 void render(CompositingCriteria const& info, graphics::Buffer& buffer) const override;
37 void clear() const override;39 void end() const override;
38
39 ~GLRenderer() noexcept {}
4040
41private:41private:
42 class Resources42 GLuint vertex_shader;
43 {43 GLuint fragment_shader;
44 public:44 GLuint program;
45 Resources();45 GLuint position_attr_loc;
46 ~Resources();46 GLuint texcoord_attr_loc;
47 void setup(geometry::Rectangle const& display_area);47 GLuint transform_uniform_loc;
4848 GLuint alpha_uniform_loc;
49 GLuint vertex_shader;49 GLuint vertex_attribs_vbo;
50 GLuint fragment_shader;50 GLuint texture;
51 GLuint program;
52 GLuint position_attr_loc;
53 GLuint texcoord_attr_loc;
54 GLuint transform_uniform_loc;
55 GLuint alpha_uniform_loc;
56 GLuint vertex_attribs_vbo;
57 GLuint texture;
58 };
59
60 Resources resources;
61};51};
6252
63}53}
6454
=== modified file 'src/server/compositor/renderer.h'
--- src/server/compositor/renderer.h 2013-12-17 18:24:51 +0000
+++ src/server/compositor/renderer.h 2014-01-02 11:14:12 +0000
@@ -34,8 +34,9 @@
34public:34public:
35 virtual ~Renderer() = default;35 virtual ~Renderer() = default;
3636
37 virtual void clear() const = 0;37 virtual void begin() const = 0;
38 virtual void render(CompositingCriteria const& info, graphics::Buffer& buffer) const = 0;38 virtual void render(CompositingCriteria const& info, graphics::Buffer& buffer) const = 0;
39 virtual void end() const = 0;
3940
40protected:41protected:
41 Renderer() = default;42 Renderer() = default;
4243
=== modified file 'src/server/frontend/protobuf_buffer_packer.cpp'
--- src/server/frontend/protobuf_buffer_packer.cpp 2013-12-17 18:24:51 +0000
+++ src/server/frontend/protobuf_buffer_packer.cpp 2014-01-02 11:14:12 +0000
@@ -64,7 +64,7 @@
64 protobuf_output.set_position_x(display_output.top_left.x.as_uint32_t());64 protobuf_output.set_position_x(display_output.top_left.x.as_uint32_t());
65 protobuf_output.set_position_y(display_output.top_left.y.as_uint32_t());65 protobuf_output.set_position_y(display_output.top_left.y.as_uint32_t());
66 protobuf_output.set_current_mode(display_output.current_mode_index);66 protobuf_output.set_current_mode(display_output.current_mode_index);
67 protobuf_output.set_current_format(display_output.current_format_index);67 protobuf_output.set_current_format(static_cast<uint32_t>(display_output.current_format));
68 protobuf_output.set_power_mode(static_cast<uint32_t>(display_output.power_mode));68 protobuf_output.set_power_mode(static_cast<uint32_t>(display_output.power_mode));
69}69}
7070
7171
=== modified file 'src/server/frontend/session_mediator.cpp'
--- src/server/frontend/session_mediator.cpp 2013-12-17 18:24:51 +0000
+++ src/server/frontend/session_mediator.cpp 2014-01-02 11:14:12 +0000
@@ -321,7 +321,9 @@
321 mg::DisplayConfigurationOutputId output_id{static_cast<int>(output.output_id())};321 mg::DisplayConfigurationOutputId output_id{static_cast<int>(output.output_id())};
322 config->configure_output(output_id, output.used(),322 config->configure_output(output_id, output.used(),
323 geom::Point{output.position_x(), output.position_y()},323 geom::Point{output.position_x(), output.position_y()},
324 output.current_mode(), static_cast<MirPowerMode>(output.power_mode()));324 output.current_mode(),
325 static_cast<MirPixelFormat>(output.current_format()),
326 static_cast<MirPowerMode>(output.power_mode()));
325 }327 }
326328
327 display_changer->configure(session, config);329 display_changer->configure(session, config);
328330
=== modified file 'src/server/graphics/default_display_configuration_policy.cpp'
--- src/server/graphics/default_display_configuration_policy.cpp 2013-12-17 18:24:51 +0000
+++ src/server/graphics/default_display_configuration_policy.cpp 2014-01-02 11:14:12 +0000
@@ -18,13 +18,47 @@
1818
19#include "default_display_configuration_policy.h"19#include "default_display_configuration_policy.h"
20#include "mir/graphics/display_configuration.h"20#include "mir/graphics/display_configuration.h"
21#include "mir/graphics/pixel_format_utils.h"
2122
22#include <unordered_map>23#include <unordered_map>
2324#include <algorithm>
24namespace mg = mir::graphics;25
25namespace geom = mir::geometry;26namespace mir
2627{
27void mg::DefaultDisplayConfigurationPolicy::apply_to(DisplayConfiguration& conf)28namespace geom = geometry;
29namespace graphics
30{
31
32namespace
33{
34inline size_t select_mode_index(size_t mode_index, std::vector<DisplayConfigurationMode> const & modes)
35{
36 if (modes.empty())
37 return std::numeric_limits<size_t>::max();
38 if (mode_index > modes.size())
39 return 0;
40 return mode_index;
41}
42
43inline MirPixelFormat select_format(MirPixelFormat format, std::vector<MirPixelFormat> const& formats)
44{
45 if (formats.empty())
46 return mir_pixel_format_invalid;
47
48 if (!contains_alpha(format))
49 return format;
50
51 auto opaque_pos = std::find_if_not(formats.begin(), formats.end(), contains_alpha);
52
53 if (opaque_pos == formats.end())
54 return format;
55
56 return *opaque_pos;
57}
58
59}
60
61void DefaultDisplayConfigurationPolicy::apply_to(DisplayConfiguration& conf)
28{62{
29 static MirPowerMode const default_power_state = mir_power_mode_on;63 static MirPowerMode const default_power_state = mir_power_mode_on;
30 std::unordered_map<DisplayConfigurationCardId, size_t> available_outputs_for_card;64 std::unordered_map<DisplayConfigurationCardId, size_t> available_outputs_for_card;
@@ -38,23 +72,24 @@
38 conf.for_each_output(72 conf.for_each_output(
39 [&](DisplayConfigurationOutput const& conf_output)73 [&](DisplayConfigurationOutput const& conf_output)
40 {74 {
41 if (conf_output.connected && conf_output.modes.size() > 0 &&75 if (!conf_output.connected || conf_output.modes.empty() ||
42 available_outputs_for_card[conf_output.card_id] > 0)76 available_outputs_for_card[conf_output.card_id] == 0)
43 {
44 size_t preferred_mode_index{conf_output.preferred_mode_index};
45 if (preferred_mode_index > conf_output.modes.size())
46 preferred_mode_index = 0;
47
48 conf.configure_output(conf_output.id, true, geom::Point(),
49 preferred_mode_index, default_power_state);
50
51 --available_outputs_for_card[conf_output.card_id];
52 }
53 else
54 {77 {
55 conf.configure_output(conf_output.id, false, conf_output.top_left,78 conf.configure_output(conf_output.id, false, conf_output.top_left,
56 conf_output.current_mode_index, default_power_state);79 conf_output.current_mode_index, conf_output.current_format,
80 default_power_state);
81 return;
57 }82 }
83
84 size_t preferred_mode_index{select_mode_index(conf_output.preferred_mode_index, conf_output.modes)};
85 MirPixelFormat format{select_format(conf_output.current_format, conf_output.pixel_formats)};
86
87 conf.configure_output(conf_output.id, true, geom::Point(), preferred_mode_index,
88 format, default_power_state);
89
90 --available_outputs_for_card[conf_output.card_id];
58 });91 });
59}92}
6093
94} // graphics
95} // mir
6196
=== modified file 'src/server/graphics/nested/nested_display.cpp'
--- src/server/graphics/nested/nested_display.cpp 2013-12-19 19:05:57 +0000
+++ src/server/graphics/nested/nested_display.cpp 2014-01-02 11:14:12 +0000
@@ -22,8 +22,10 @@
22#include "mir_api_wrappers.h"22#include "mir_api_wrappers.h"
2323
24#include "mir/geometry/rectangle.h"24#include "mir/geometry/rectangle.h"
25#include "mir/graphics/pixel_format_utils.h"
25#include "mir/graphics/gl_context.h"26#include "mir/graphics/gl_context.h"
26#include "mir/graphics/surfaceless_egl_context.h"27#include "mir/graphics/surfaceless_egl_context.h"
28#include "mir/graphics/display_configuration_policy.h"
27#include "host_connection.h"29#include "host_connection.h"
2830
29#include <boost/throw_exception.hpp>31#include <boost/throw_exception.hpp>
@@ -34,45 +36,8 @@
34namespace mgnw = mir::graphics::nested::mir_api_wrappers;36namespace mgnw = mir::graphics::nested::mir_api_wrappers;
35namespace geom = mir::geometry;37namespace geom = mir::geometry;
3638
37namespace39EGLint const mgn::detail::nested_egl_context_attribs[] =
38{40{
39
40MirPixelFormat find_opaque_surface_format(MirConnection* connection)
41{
42 static unsigned const max_formats = 32;
43 MirPixelFormat formats[max_formats];
44 unsigned int valid_formats;
45
46 mir_connection_get_available_surface_formats(connection, formats,
47 max_formats, &valid_formats);
48
49 // Find an opaque surface format
50 for (auto f = formats; f != formats+valid_formats; ++f)
51 {
52 if (*f == mir_pixel_format_xbgr_8888 ||
53 *f == mir_pixel_format_xrgb_8888)
54 {
55 return *f;
56 }
57 }
58
59 BOOST_THROW_EXCEPTION(
60 std::runtime_error("Nested Mir failed to find an opaque surface format"));
61}
62
63}
64
65EGLint const mgn::detail::nested_egl_config_attribs[] = {
66 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
67 EGL_RED_SIZE, 8,
68 EGL_GREEN_SIZE, 8,
69 EGL_BLUE_SIZE, 8,
70 EGL_ALPHA_SIZE, 0,
71 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
72 EGL_NONE
73};
74
75EGLint const mgn::detail::nested_egl_context_attribs[] = {
76 EGL_CONTEXT_CLIENT_VERSION, 2,41 EGL_CONTEXT_CLIENT_VERSION, 2,
77 EGL_NONE42 EGL_NONE
78};43};
@@ -93,6 +58,8 @@
93}58}
9459
95mgn::detail::EGLDisplayHandle::EGLDisplayHandle(MirConnection* connection)60mgn::detail::EGLDisplayHandle::EGLDisplayHandle(MirConnection* connection)
61 : egl_display(EGL_NO_DISPLAY),
62 egl_context_(EGL_NO_CONTEXT)
96{63{
97 auto const native_display = (EGLNativeDisplayType) mir_connection_get_egl_native_display(connection);64 auto const native_display = (EGLNativeDisplayType) mir_connection_get_egl_native_display(connection);
98 egl_display = eglGetDisplay(native_display);65 egl_display = eglGetDisplay(native_display);
@@ -100,7 +67,7 @@
100 BOOST_THROW_EXCEPTION(std::runtime_error("Nested Mir Display Error: Failed to fetch EGL display."));67 BOOST_THROW_EXCEPTION(std::runtime_error("Nested Mir Display Error: Failed to fetch EGL display."));
101}68}
10269
103void mgn::detail::EGLDisplayHandle::initialize()70void mgn::detail::EGLDisplayHandle::initialize(MirPixelFormat format)
104{71{
105 int major;72 int major;
106 int minor;73 int minor;
@@ -110,17 +77,28 @@
110 BOOST_THROW_EXCEPTION(std::runtime_error("Nested Mir Display Error: Failed to initialize EGL."));77 BOOST_THROW_EXCEPTION(std::runtime_error("Nested Mir Display Error: Failed to initialize EGL."));
111 }78 }
11279
113 egl_context_ = eglCreateContext(egl_display, choose_config(detail::nested_egl_config_attribs), EGL_NO_CONTEXT, detail::nested_egl_context_attribs);80 egl_context_ = eglCreateContext(egl_display, choose_windowed_es_config(format), EGL_NO_CONTEXT, detail::nested_egl_context_attribs);
81
114 if (egl_context_ == EGL_NO_CONTEXT)82 if (egl_context_ == EGL_NO_CONTEXT)
115 BOOST_THROW_EXCEPTION(std::runtime_error("Failed to create shared EGL context"));83 BOOST_THROW_EXCEPTION(std::runtime_error("Failed to create shared EGL context"));
116}84}
11785
118EGLConfig mgn::detail::EGLDisplayHandle::choose_config(const EGLint attrib_list[]) const86EGLConfig mgn::detail::EGLDisplayHandle::choose_windowed_es_config(MirPixelFormat format) const
119{87{
88 EGLint const nested_egl_config_attribs[] =
89 {
90 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
91 EGL_RED_SIZE, mg::red_channel_depth(format),
92 EGL_GREEN_SIZE, mg::green_channel_depth(format),
93 EGL_BLUE_SIZE, mg::blue_channel_depth(format),
94 EGL_ALPHA_SIZE, mg::alpha_channel_depth(format),
95 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
96 EGL_NONE
97 };
120 EGLConfig result;98 EGLConfig result;
121 int n;99 int n;
122100
123 int res = eglChooseConfig(egl_display, attrib_list, &result, 1, &n);101 int res = eglChooseConfig(egl_display, nested_egl_config_attribs, &result, 1, &n);
124 if ((res != EGL_TRUE) || (n != 1))102 if ((res != EGL_TRUE) || (n != 1))
125 BOOST_THROW_EXCEPTION(std::runtime_error("Nested Mir Display Error: Failed to choose EGL configuration."));103 BOOST_THROW_EXCEPTION(std::runtime_error("Nested Mir Display Error: Failed to choose EGL configuration."));
126104
@@ -149,17 +127,18 @@
149mgn::NestedDisplay::NestedDisplay(127mgn::NestedDisplay::NestedDisplay(
150 std::shared_ptr<HostConnection> const& connection,128 std::shared_ptr<HostConnection> const& connection,
151 std::shared_ptr<input::EventFilter> const& event_handler,129 std::shared_ptr<input::EventFilter> const& event_handler,
152 std::shared_ptr<mg::DisplayReport> const& display_report) :130 std::shared_ptr<mg::DisplayReport> const& display_report,
131 std::shared_ptr<mg::DisplayConfigurationPolicy> const& initial_conf_policy) :
153 connection{connection},132 connection{connection},
154 event_handler{event_handler},133 event_handler{event_handler},
155 display_report{display_report},134 display_report{display_report},
156 egl_display{*connection},135 egl_display{*connection},
157 egl_pixel_format{find_opaque_surface_format(*connection)},
158 outputs{}136 outputs{}
159{137{
160 egl_display.initialize();138
161 eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, egl_display.egl_context());139 std::shared_ptr<DisplayConfiguration> conf(configuration());
162 configure(*configuration());140 initial_conf_policy->apply_to(*conf);
141 configure(*conf);
163}142}
164143
165mgn::NestedDisplay::~NestedDisplay() noexcept144mgn::NestedDisplay::~NestedDisplay() noexcept
@@ -178,6 +157,14 @@
178 return std::make_shared<NestedDisplayConfiguration>(mir_connection_create_display_config(*connection));157 return std::make_shared<NestedDisplayConfiguration>(mir_connection_create_display_config(*connection));
179}158}
180159
160void mgn::NestedDisplay::complete_display_initialization(MirPixelFormat format)
161{
162 if (egl_display.egl_context() != EGL_NO_CONTEXT) return;
163
164 egl_display.initialize(format);
165 eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, egl_display.egl_context());
166}
167
181void mgn::NestedDisplay::configure(mg::DisplayConfiguration const& configuration)168void mgn::NestedDisplay::configure(mg::DisplayConfiguration const& configuration)
182{169{
183 decltype(outputs) result;170 decltype(outputs) result;
@@ -193,13 +180,16 @@
193 geometry::Rectangle const area{output.top_left, output.modes[output.current_mode_index].size};180 geometry::Rectangle const area{output.top_left, output.modes[output.current_mode_index].size};
194181
195 auto const& egl_display_mode = output.modes[output.current_mode_index];182 auto const& egl_display_mode = output.modes[output.current_mode_index];
183 auto const& egl_config_format = output.current_format;
184
185 complete_display_initialization(egl_config_format);
196186
197 MirSurfaceParameters const request_params =187 MirSurfaceParameters const request_params =
198 {188 {
199 "Mir nested display",189 "Mir nested display",
200 egl_display_mode.size.width.as_int(),190 egl_display_mode.size.width.as_int(),
201 egl_display_mode.size.height.as_int(),191 egl_display_mode.size.height.as_int(),
202 egl_pixel_format,192 egl_config_format,
203 mir_buffer_usage_hardware,193 mir_buffer_usage_hardware,
204 static_cast<uint32_t>(output.id.as_value())194 static_cast<uint32_t>(output.id.as_value())
205 };195 };
@@ -213,7 +203,8 @@
213 egl_display,203 egl_display,
214 mir_surface,204 mir_surface,
215 area,205 area,
216 event_handler);206 event_handler,
207 output.current_format);
217 }208 }
218 });209 });
219210
@@ -274,13 +265,7 @@
274 return std::weak_ptr<Cursor>();265 return std::weak_ptr<Cursor>();
275}266}
276267
277namespace
278{
279}
280
281std::unique_ptr<mg::GLContext> mgn::NestedDisplay::create_gl_context()268std::unique_ptr<mg::GLContext> mgn::NestedDisplay::create_gl_context()
282{269{
283 return std::unique_ptr<mg::GLContext>{new SurfacelessEGLContext(egl_display,270 return std::unique_ptr<mg::GLContext>{new SurfacelessEGLContext(egl_display, EGL_NO_CONTEXT)};
284 detail::nested_egl_config_attribs,
285 EGL_NO_CONTEXT)};
286}271}
287272
=== modified file 'src/server/graphics/nested/nested_display.h'
--- src/server/graphics/nested/nested_display.h 2013-12-17 18:24:51 +0000
+++ src/server/graphics/nested/nested_display.h 2014-01-02 11:14:12 +0000
@@ -42,6 +42,7 @@
42{42{
43class DisplayReport;43class DisplayReport;
44class DisplayBuffer;44class DisplayBuffer;
45class DisplayConfigurationPolicy;
4546
46namespace nested47namespace nested
47{48{
@@ -67,8 +68,8 @@
67 explicit EGLDisplayHandle(MirConnection* connection);68 explicit EGLDisplayHandle(MirConnection* connection);
68 ~EGLDisplayHandle() noexcept;69 ~EGLDisplayHandle() noexcept;
6970
70 void initialize();71 void initialize(MirPixelFormat format);
71 EGLConfig choose_config(const EGLint attrib_list[]) const;72 EGLConfig choose_windowed_es_config (MirPixelFormat format) const;
72 EGLNativeWindowType native_window(EGLConfig egl_config, MirSurface* mir_surface) const;73 EGLNativeWindowType native_window(EGLConfig egl_config, MirSurface* mir_surface) const;
73 EGLContext egl_context() const;74 EGLContext egl_context() const;
74 operator EGLDisplay() const { return egl_display; }75 operator EGLDisplay() const { return egl_display; }
@@ -83,7 +84,6 @@
8384
84class NestedOutput;85class NestedOutput;
8586
86extern EGLint const nested_egl_config_attribs[];
87extern EGLint const nested_egl_context_attribs[];87extern EGLint const nested_egl_context_attribs[];
88}88}
8989
@@ -95,7 +95,8 @@
95 NestedDisplay(95 NestedDisplay(
96 std::shared_ptr<HostConnection> const& connection,96 std::shared_ptr<HostConnection> const& connection,
97 std::shared_ptr<input::EventFilter> const& event_handler,97 std::shared_ptr<input::EventFilter> const& event_handler,
98 std::shared_ptr<DisplayReport> const& display_report);98 std::shared_ptr<DisplayReport> const& display_report,
99 std::shared_ptr<DisplayConfigurationPolicy> const& conf_policy);
99100
100 ~NestedDisplay() noexcept;101 ~NestedDisplay() noexcept;
101102
@@ -124,11 +125,11 @@
124 std::shared_ptr<input::EventFilter> const event_handler;125 std::shared_ptr<input::EventFilter> const event_handler;
125 std::shared_ptr<DisplayReport> const display_report;126 std::shared_ptr<DisplayReport> const display_report;
126 detail::EGLDisplayHandle egl_display;127 detail::EGLDisplayHandle egl_display;
127 MirPixelFormat const egl_pixel_format;
128128
129 std::mutex outputs_mutex;129 std::mutex outputs_mutex;
130 std::unordered_map<DisplayConfigurationOutputId, std::shared_ptr<detail::NestedOutput>> outputs;130 std::unordered_map<DisplayConfigurationOutputId, std::shared_ptr<detail::NestedOutput>> outputs;
131 DisplayConfigurationChangeHandler my_conf_change_handler;131 DisplayConfigurationChangeHandler my_conf_change_handler;
132 void complete_display_initialization(MirPixelFormat format);
132};133};
133134
134}135}
135136
=== modified file 'src/server/graphics/nested/nested_display_configuration.cpp'
--- src/server/graphics/nested/nested_display_configuration.cpp 2013-12-17 18:24:51 +0000
+++ src/server/graphics/nested/nested_display_configuration.cpp 2014-01-02 11:14:12 +0000
@@ -18,26 +18,40 @@
1818
19#include "nested_display_configuration.h"19#include "nested_display_configuration.h"
2020
21namespace mg = mir::graphics;21#include "mir/graphics/pixel_format_utils.h"
22namespace mgn = mg::nested;
2322
24#include <boost/throw_exception.hpp>23#include <boost/throw_exception.hpp>
2524
26#include <stdexcept>25#include <stdexcept>
27#include <algorithm>26#include <algorithm>
2827
29namespace mgn = mir::graphics::nested;28namespace mir
3029{
31mgn::NestedDisplayConfiguration::NestedDisplayConfiguration(MirDisplayConfiguration* connection) :30namespace graphics
31{
32namespace nested
33{
34
35namespace
36{
37bool format_valid_for_output(MirDisplayOutput const& output, MirPixelFormat format)
38{
39 MirPixelFormat * end = output.output_formats + output.num_output_formats;
40 return end != std::find(output.output_formats, end, format);
41}
42
43}
44
45NestedDisplayConfiguration::NestedDisplayConfiguration(MirDisplayConfiguration* connection) :
32display_config{connection}46display_config{connection}
33{47{
34}48}
3549
36mgn::NestedDisplayConfiguration::~NestedDisplayConfiguration() noexcept50NestedDisplayConfiguration::~NestedDisplayConfiguration() noexcept
37{51{
38}52}
3953
40void mgn::NestedDisplayConfiguration::for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const54void NestedDisplayConfiguration::for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const
41{55{
42 std::for_each(56 std::for_each(
43 display_config->cards,57 display_config->cards,
@@ -48,7 +62,7 @@
48 });62 });
49}63}
5064
51void mgn::NestedDisplayConfiguration::for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const65void NestedDisplayConfiguration::for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const
52{66{
53 std::for_each(67 std::for_each(
54 display_config->outputs,68 display_config->outputs,
@@ -85,8 +99,8 @@
85 });99 });
86}100}
87101
88void mgn::NestedDisplayConfiguration::configure_output(DisplayConfigurationOutputId id, bool used,102void NestedDisplayConfiguration::configure_output(DisplayConfigurationOutputId id, bool used,
89 geometry::Point top_left, size_t mode_index, MirPowerMode power_mode)103 geometry::Point top_left, size_t mode_index, MirPixelFormat format, MirPowerMode power_mode)
90{104{
91 for (auto mir_output = display_config->outputs;105 for (auto mir_output = display_config->outputs;
92 mir_output != display_config->outputs+display_config->num_outputs;106 mir_output != display_config->outputs+display_config->num_outputs;
@@ -97,13 +111,24 @@
97 if (used && mode_index >= mir_output->num_modes)111 if (used && mode_index >= mir_output->num_modes)
98 BOOST_THROW_EXCEPTION(std::runtime_error("Invalid mode_index for used output"));112 BOOST_THROW_EXCEPTION(std::runtime_error("Invalid mode_index for used output"));
99113
114 if (used && !valid_mir_pixel_format(format))
115 BOOST_THROW_EXCEPTION(std::runtime_error("Invalid format for used output"));
116
117 if (used && !format_valid_for_output(*mir_output, format))
118 BOOST_THROW_EXCEPTION(std::runtime_error("Format not available for used output"));
119
100 mir_output->used = used;120 mir_output->used = used;
101 mir_output->position_x = top_left.x.as_uint32_t();121 mir_output->position_x = top_left.x.as_uint32_t();
102 mir_output->position_y = top_left.y.as_uint32_t();122 mir_output->position_y = top_left.y.as_uint32_t();
103 mir_output->current_mode = mode_index;123 mir_output->current_mode = mode_index;
124 mir_output->current_output_format = format;
104 mir_output->power_mode = static_cast<MirPowerMode>(power_mode);125 mir_output->power_mode = static_cast<MirPowerMode>(power_mode);
105 return;126 return;
106 }127 }
107 }128 }
108 BOOST_THROW_EXCEPTION(std::runtime_error("Trying to configure invalid output"));129 BOOST_THROW_EXCEPTION(std::runtime_error("Trying to configure invalid output"));
109}130}
131
132} // nested
133} // graphics
134} // mir
110135
=== modified file 'src/server/graphics/nested/nested_display_configuration.h'
--- src/server/graphics/nested/nested_display_configuration.h 2013-09-12 21:36:55 +0000
+++ src/server/graphics/nested/nested_display_configuration.h 2014-01-02 11:14:12 +0000
@@ -38,7 +38,7 @@
38 void for_each_output(std::function<void(DisplayConfigurationOutput const&)>) const;38 void for_each_output(std::function<void(DisplayConfigurationOutput const&)>) const;
3939
40 void configure_output(DisplayConfigurationOutputId id, bool used, geometry::Point top_left, size_t mode_index,40 void configure_output(DisplayConfigurationOutputId id, bool used, geometry::Point top_left, size_t mode_index,
41 MirPowerMode power_mode);41 MirPixelFormat format, MirPowerMode power_mode);
4242
43 operator MirDisplayConfiguration*() const { return display_config; }43 operator MirDisplayConfiguration*() const { return display_config; }
44private:44private:
4545
=== modified file 'src/server/graphics/nested/nested_output.cpp'
--- src/server/graphics/nested/nested_output.cpp 2013-09-23 13:37:44 +0000
+++ src/server/graphics/nested/nested_output.cpp 2014-01-02 11:14:12 +0000
@@ -41,10 +41,11 @@
41 EGLDisplayHandle const& egl_display,41 EGLDisplayHandle const& egl_display,
42 MirSurface* mir_surface,42 MirSurface* mir_surface,
43 geometry::Rectangle const& area,43 geometry::Rectangle const& area,
44 std::shared_ptr<input::EventFilter> const& event_handler) :44 std::shared_ptr<input::EventFilter> const& event_handler,
45 MirPixelFormat preferred_format) :
45 egl_display(egl_display),46 egl_display(egl_display),
46 mir_surface{mir_surface},47 mir_surface{mir_surface},
47 egl_config{egl_display.choose_config(nested_egl_config_attribs)},48 egl_config{egl_display.choose_windowed_es_config(preferred_format)},
48 egl_context{egl_display, eglCreateContext(egl_display, egl_config, egl_display.egl_context(), nested_egl_context_attribs)},49 egl_context{egl_display, eglCreateContext(egl_display, egl_config, egl_display.egl_context(), nested_egl_context_attribs)},
49 area{area.top_left, area.size},50 area{area.top_left, area.size},
50 event_handler{event_handler},51 event_handler{event_handler},
5152
=== modified file 'src/server/graphics/nested/nested_output.h'
--- src/server/graphics/nested/nested_output.h 2013-09-23 13:37:44 +0000
+++ src/server/graphics/nested/nested_output.h 2014-01-02 11:14:12 +0000
@@ -54,7 +54,8 @@
54 EGLDisplayHandle const& egl_display,54 EGLDisplayHandle const& egl_display,
55 MirSurface* mir_surface,55 MirSurface* mir_surface,
56 geometry::Rectangle const& area,56 geometry::Rectangle const& area,
57 std::shared_ptr<input::EventFilter> const& event_handler);57 std::shared_ptr<input::EventFilter> const& event_handler,
58 MirPixelFormat preferred_format);
5859
59 ~NestedOutput() noexcept;60 ~NestedOutput() noexcept;
6061
6162
=== modified file 'src/server/graphics/nested/nested_platform.cpp'
--- src/server/graphics/nested/nested_platform.cpp 2013-12-17 18:24:51 +0000
+++ src/server/graphics/nested/nested_platform.cpp 2014-01-02 11:14:12 +0000
@@ -113,9 +113,9 @@
113 return native_platform->create_buffer_allocator(buffer_initializer);113 return native_platform->create_buffer_allocator(buffer_initializer);
114}114}
115115
116std::shared_ptr<mg::Display> mgn::NestedPlatform::create_display(std::shared_ptr<mg::DisplayConfigurationPolicy> const& /*initial_conf_policy*/)116std::shared_ptr<mg::Display> mgn::NestedPlatform::create_display(std::shared_ptr<mg::DisplayConfigurationPolicy> const& conf_policy)
117{117{
118 return std::make_shared<mgn::NestedDisplay>(connection, event_handler, display_report);118 return std::make_shared<mgn::NestedDisplay>(connection, event_handler, display_report, conf_policy);
119}119}
120120
121std::shared_ptr<mg::PlatformIPCPackage> mgn::NestedPlatform::get_ipc_package()121std::shared_ptr<mg::PlatformIPCPackage> mgn::NestedPlatform::get_ipc_package()
122122
=== modified file 'src/server/graphics/nested/nested_platform.h'
--- src/server/graphics/nested/nested_platform.h 2013-12-17 18:24:51 +0000
+++ src/server/graphics/nested/nested_platform.h 2014-01-02 11:14:12 +0000
@@ -42,12 +42,12 @@
4242
43 ~NestedPlatform() noexcept;43 ~NestedPlatform() noexcept;
44 std::shared_ptr<GraphicBufferAllocator> create_buffer_allocator(44 std::shared_ptr<GraphicBufferAllocator> create_buffer_allocator(
45 std::shared_ptr<BufferInitializer> const& buffer_initializer);45 std::shared_ptr<BufferInitializer> const& buffer_initializer) override;
46 std::shared_ptr<Display> create_display(46 std::shared_ptr<Display> create_display(
47 std::shared_ptr<DisplayConfigurationPolicy> const& initial_conf_policy);47 std::shared_ptr<DisplayConfigurationPolicy> const& initial_conf_policy) override;
48 std::shared_ptr<PlatformIPCPackage> get_ipc_package();48 std::shared_ptr<PlatformIPCPackage> get_ipc_package() override;
49 std::shared_ptr<InternalClient> create_internal_client();49 std::shared_ptr<InternalClient> create_internal_client() override;
50 void fill_ipc_package(BufferIPCPacker* packer, Buffer const* Buffer) const;50 void fill_ipc_package(BufferIPCPacker* packer, Buffer const* Buffer) const override;
51 EGLNativeDisplayType egl_native_display() const;51 EGLNativeDisplayType egl_native_display() const;
5252
53private:53private:
5454
=== modified file 'src/server/graphics/offscreen/display_configuration.cpp'
--- src/server/graphics/offscreen/display_configuration.cpp 2013-12-17 18:24:51 +0000
+++ src/server/graphics/offscreen/display_configuration.cpp 2014-01-02 11:14:12 +0000
@@ -31,7 +31,9 @@
31 true,31 true,
32 true,32 true,
33 geom::Point{0,0},33 geom::Point{0,0},
34 0, 0, mir_power_mode_on},34 0,
35 mir_pixel_format_xrgb_8888,
36 mir_power_mode_on},
35 card{mg::DisplayConfigurationCardId{0}, 1}37 card{mg::DisplayConfigurationCardId{0}, 1}
36{38{
37}39}
@@ -67,6 +69,6 @@
67}69}
6870
69void mgo::DisplayConfiguration::configure_output(71void mgo::DisplayConfiguration::configure_output(
70 mg::DisplayConfigurationOutputId, bool, geom::Point, size_t, MirPowerMode)72 mg::DisplayConfigurationOutputId, bool, geom::Point, size_t, MirPixelFormat, MirPowerMode)
71{73{
72}74}
7375
=== modified file 'src/server/graphics/offscreen/display_configuration.h'
--- src/server/graphics/offscreen/display_configuration.h 2013-11-12 17:23:53 +0000
+++ src/server/graphics/offscreen/display_configuration.h 2014-01-02 11:14:12 +0000
@@ -33,10 +33,10 @@
33 DisplayConfiguration(DisplayConfiguration const& other);33 DisplayConfiguration(DisplayConfiguration const& other);
34 DisplayConfiguration& operator=(DisplayConfiguration const& other);34 DisplayConfiguration& operator=(DisplayConfiguration const& other);
3535
36 void for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const;36 void for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const override;
37 void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const;37 void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const override;
38 void configure_output(DisplayConfigurationOutputId, bool, geometry::Point,38 virtual void configure_output(DisplayConfigurationOutputId id, bool used, geometry::Point top_left,
39 size_t, MirPowerMode power_mode);39 size_t mode_index, MirPixelFormat format, MirPowerMode power_mode) override;
4040
41private:41private:
42 DisplayConfigurationOutput output;42 DisplayConfigurationOutput output;
4343
=== modified file 'src/server/logging/input_report.cpp'
--- src/server/logging/input_report.cpp 2013-12-19 16:33:56 +0000
+++ src/server/logging/input_report.cpp 2014-01-02 11:14:12 +0000
@@ -18,6 +18,7 @@
1818
19#include "mir/logging/input_report.h"19#include "mir/logging/input_report.h"
20#include "mir/logging/logger.h"20#include "mir/logging/logger.h"
21#include "mir/logging/input_timestamp.h"
2122
22#include "std/MirLog.h"23#include "std/MirLog.h"
23#include <std/Log.h>24#include <std/Log.h>
@@ -108,7 +109,7 @@
108 std::stringstream ss;109 std::stringstream ss;
109110
110 ss << "Received event"111 ss << "Received event"
111 << " time=" << when112 << " time=" << ml::input_timestamp(when)
112 << " type=" << type113 << " type=" << type
113 << " code=" << code114 << " code=" << code
114 << " value=" << value;115 << " value=" << value;
@@ -122,7 +123,7 @@
122123
123 ss << "Published key event"124 ss << "Published key event"
124 << " seq_id=" << seq_id125 << " seq_id=" << seq_id
125 << " time=" << event_time126 << " time=" << ml::input_timestamp(event_time)
126 << " dest_fd=" << dest_fd;127 << " dest_fd=" << dest_fd;
127128
128 logger->log(Logger::informational, ss.str(), component());129 logger->log(Logger::informational, ss.str(), component());
@@ -134,7 +135,7 @@
134135
135 ss << "Published motion event"136 ss << "Published motion event"
136 << " seq_id=" << seq_id137 << " seq_id=" << seq_id
137 << " time=" << event_time138 << " time=" << ml::input_timestamp(event_time)
138 << " dest_fd=" << dest_fd;139 << " dest_fd=" << dest_fd;
139140
140 logger->log(Logger::informational, ss.str(), component());141 logger->log(Logger::informational, ss.str(), component());
141142
=== modified file 'src/server/scene/mediating_display_changer.cpp'
--- src/server/scene/mediating_display_changer.cpp 2013-12-17 18:24:51 +0000
+++ src/server/scene/mediating_display_changer.cpp 2014-01-02 11:14:12 +0000
@@ -136,6 +136,7 @@
136 conf->configure_output(output.id, output.used,136 conf->configure_output(output.id, output.used,
137 output.top_left,137 output.top_left,
138 output.current_mode_index,138 output.current_mode_index,
139 output.current_format,
139 mir_power_mode_on);140 mir_power_mode_on);
140 }141 }
141 });142 });
142143
=== modified file 'src/shared/logging/CMakeLists.txt'
--- src/shared/logging/CMakeLists.txt 2013-12-12 07:51:12 +0000
+++ src/shared/logging/CMakeLists.txt 2014-01-02 11:14:12 +0000
@@ -16,4 +16,5 @@
1616
17add_library(mirsharedlogging STATIC17add_library(mirsharedlogging STATIC
18 dumb_console_logger.cpp18 dumb_console_logger.cpp
19 input_timestamp.cpp
19)20)
2021
=== added file 'src/shared/logging/input_timestamp.cpp'
--- src/shared/logging/input_timestamp.cpp 1970-01-01 00:00:00 +0000
+++ src/shared/logging/input_timestamp.cpp 2014-01-02 11:14:12 +0000
@@ -0,0 +1,41 @@
1/*
2 * Copyright © 2013 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Daniel van Vugt <daniel.van.vugt@canonical.com>
17 */
18
19#include "mir/logging/input_timestamp.h"
20#include <ctime>
21#include <cstdio>
22#include <string>
23
24std::string mir::logging::input_timestamp(nsecs_t when)
25{
26 // Input events use CLOCK_REALTIME, and so we must...
27 struct timespec ts;
28 clock_gettime(CLOCK_REALTIME, &ts);
29
30 nsecs_t now = ts.tv_sec * 1000000000LL + ts.tv_nsec;
31 nsecs_t age = now - when;
32
33 char str[64];
34 snprintf(str, sizeof str, "%lld (%ld.%06ld ms ago)",
35 static_cast<long long>(when),
36 static_cast<long>(age / 1000000LL),
37 static_cast<long>(age % 1000000LL));
38
39 return std::string(str);
40}
41
042
=== modified file 'tests/acceptance-tests/test_server_shutdown.cpp'
--- tests/acceptance-tests/test_server_shutdown.cpp 2013-12-17 18:24:51 +0000
+++ tests/acceptance-tests/test_server_shutdown.cpp 2014-01-02 11:14:12 +0000
@@ -48,6 +48,10 @@
48class NullRenderer : public mc::Renderer48class NullRenderer : public mc::Renderer
49{49{
50public:50public:
51 void begin() const override
52 {
53 }
54
51 void render(mc::CompositingCriteria const&, mg::Buffer&) const override55 void render(mc::CompositingCriteria const&, mg::Buffer&) const override
52 {56 {
53 /*57 /*
@@ -58,7 +62,7 @@
58 std::this_thread::yield();62 std::this_thread::yield();
59 }63 }
6064
61 void clear() const override65 void end() const override
62 {66 {
63 }67 }
64};68};
6569
=== modified file 'tests/integration-tests/test_session.cpp'
--- tests/integration-tests/test_session.cpp 2013-12-17 18:24:51 +0000
+++ tests/integration-tests/test_session.cpp 2014-01-02 11:14:12 +0000
@@ -87,12 +87,15 @@
87 {87 {
88 struct StubRenderer : public mc::Renderer88 struct StubRenderer : public mc::Renderer
89 {89 {
90 void clear() const override90 void begin() const override
91 {91 {
92 }92 }
93 void render(mc::CompositingCriteria const&, mg::Buffer&) const override93 void render(mc::CompositingCriteria const&, mg::Buffer&) const override
94 {94 {
95 }95 }
96 void end() const override
97 {
98 }
96 };99 };
97100
98 struct StubRendererFactory : public mc::RendererFactory101 struct StubRendererFactory : public mc::RendererFactory
99102
=== modified file 'tests/integration-tests/test_surface_first_frame_sync.cpp'
--- tests/integration-tests/test_surface_first_frame_sync.cpp 2013-12-17 18:24:51 +0000
+++ tests/integration-tests/test_surface_first_frame_sync.cpp 2014-01-02 11:14:12 +0000
@@ -96,7 +96,7 @@
96 {96 {
97 }97 }
9898
99 void clear() const override99 void begin() const override
100 {100 {
101 }101 }
102102
@@ -105,6 +105,10 @@
105 while (write(render_operations_fd, "a", 1) != 1) continue;105 while (write(render_operations_fd, "a", 1) != 1) continue;
106 }106 }
107107
108 void end() const override
109 {
110 }
111
108private:112private:
109 int render_operations_fd;113 int render_operations_fd;
110};114};
111115
=== modified file 'tests/mir_test/display_config_matchers.cpp'
--- tests/mir_test/display_config_matchers.cpp 2013-12-17 18:24:51 +0000
+++ tests/mir_test/display_config_matchers.cpp 2014-01-02 11:14:12 +0000
@@ -67,7 +67,7 @@
67 geom::Point{protobuf_output.position_x(),67 geom::Point{protobuf_output.position_x(),
68 protobuf_output.position_y()},68 protobuf_output.position_y()},
69 protobuf_output.current_mode(),69 protobuf_output.current_mode(),
70 protobuf_output.current_format(),70 static_cast<MirPixelFormat>(protobuf_output.current_format()),
71 static_cast<MirPowerMode>(protobuf_output.power_mode())71 static_cast<MirPowerMode>(protobuf_output.power_mode())
72 };72 };
7373
@@ -175,7 +175,7 @@
175 }175 }
176176
177 void configure_output(mg::DisplayConfigurationOutputId, bool,177 void configure_output(mg::DisplayConfigurationOutputId, bool,
178 geom::Point, size_t, MirPowerMode)178 geom::Point, size_t, MirPixelFormat, MirPowerMode)
179 {179 {
180 }180 }
181181
182182
=== modified file 'tests/mir_test_framework/stubbed_server_configuration.cpp'
--- tests/mir_test_framework/stubbed_server_configuration.cpp 2013-12-19 16:34:53 +0000
+++ tests/mir_test_framework/stubbed_server_configuration.cpp 2014-01-02 11:14:12 +0000
@@ -132,7 +132,7 @@
132 mg::DisplayConfigurationCardId{0},132 mg::DisplayConfigurationCardId{0},
133 mg::DisplayConfigurationOutputType::vga,133 mg::DisplayConfigurationOutputType::vga,
134 std::vector<MirPixelFormat>{mir_pixel_format_abgr_8888},134 std::vector<MirPixelFormat>{mir_pixel_format_abgr_8888},
135 modes, 0, geom::Size{}, true, true, geom::Point{0,0}, 0, 0, mir_power_mode_on};135 modes, 0, geom::Size{}, true, true, geom::Point{0,0}, 0, mir_pixel_format_abgr_8888, mir_power_mode_on};
136136
137 f(dummy_output_config);137 f(dummy_output_config);
138 }138 }
@@ -201,11 +201,15 @@
201class StubRenderer : public mc::Renderer201class StubRenderer : public mc::Renderer
202{202{
203public:203public:
204 void begin() const override
205 {
206 }
207
204 void render(mc::CompositingCriteria const&, mg::Buffer&) const override208 void render(mc::CompositingCriteria const&, mg::Buffer&) const override
205 {209 {
206 }210 }
207211
208 void clear() const override212 void end() const override
209 {213 {
210 }214 }
211};215};
212216
=== modified file 'tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp'
--- tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp 2013-12-17 18:24:51 +0000
+++ tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp 2014-01-02 11:14:12 +0000
@@ -106,9 +106,9 @@
106 {106 {
107 }107 }
108108
109 void clear() const override109 void begin() const override
110 {110 {
111 renderer->clear();111 renderer->begin();
112 }112 }
113113
114 void render(mc::CompositingCriteria const& criteria, mg::Buffer& buffer) const override114 void render(mc::CompositingCriteria const& criteria, mg::Buffer& buffer) const override
@@ -116,6 +116,11 @@
116 renderer->render(criteria, buffer);116 renderer->render(criteria, buffer);
117 }117 }
118118
119 void end() const override
120 {
121 renderer->end();
122 }
123
119 mc::Renderer* const renderer;124 mc::Renderer* const renderer;
120};125};
121126
@@ -241,10 +246,14 @@
241 renderable_vec.push_back(&small);246 renderable_vec.push_back(&small);
242 renderable_vec.push_back(&fullscreen);247 renderable_vec.push_back(&fullscreen);
243248
249 EXPECT_CALL(renderer_factory.mock_renderer, begin())
250 .Times(0);
244 EXPECT_CALL(renderer_factory.mock_renderer, render(Ref(small),_))251 EXPECT_CALL(renderer_factory.mock_renderer, render(Ref(small),_))
245 .Times(0);252 .Times(0);
246 EXPECT_CALL(renderer_factory.mock_renderer, render(Ref(fullscreen),_))253 EXPECT_CALL(renderer_factory.mock_renderer, render(Ref(fullscreen),_))
247 .Times(0);254 .Times(0);
255 EXPECT_CALL(renderer_factory.mock_renderer, end())
256 .Times(0);
248257
249 FakeScene scene(renderable_vec);258 FakeScene scene(renderable_vec);
250259
@@ -263,6 +272,58 @@
263 comp->composite();272 comp->composite();
264}273}
265274
275TEST(DefaultDisplayBufferCompositor, calls_renderer_in_sequence)
276{
277 using namespace testing;
278
279 StubRendererFactory renderer_factory;
280
281 geom::Rectangle screen{{0, 0}, {1366, 768}};
282
283 mtd::MockDisplayBuffer display_buffer;
284
285 EXPECT_CALL(display_buffer, view_area())
286 .WillRepeatedly(Return(screen));
287 EXPECT_CALL(display_buffer, can_bypass())
288 .WillRepeatedly(Return(false));
289
290 mtd::StubCompositingCriteria big(5, 10, 100, 200);
291 mtd::StubCompositingCriteria small(10, 20, 30, 40);
292
293 std::vector<mc::CompositingCriteria*> renderable_vec;
294 renderable_vec.push_back(&big);
295 renderable_vec.push_back(&small);
296
297 Sequence render_seq;
298
299 EXPECT_CALL(display_buffer, make_current())
300 .InSequence(render_seq);
301 EXPECT_CALL(renderer_factory.mock_renderer, begin())
302 .InSequence(render_seq);
303 EXPECT_CALL(renderer_factory.mock_renderer, render(Ref(big),_))
304 .InSequence(render_seq);
305 EXPECT_CALL(renderer_factory.mock_renderer, render(Ref(small),_))
306 .InSequence(render_seq);
307 EXPECT_CALL(renderer_factory.mock_renderer, end())
308 .InSequence(render_seq);
309 EXPECT_CALL(display_buffer, post_update())
310 .InSequence(render_seq);
311
312 FakeScene scene(renderable_vec);
313
314 auto compositor_buffer = std::make_shared<mtd::MockBuffer>();
315 EXPECT_CALL(*compositor_buffer, can_bypass())
316 .Times(0);
317
318 mc::DefaultDisplayBufferCompositorFactory factory(
319 mt::fake_shared(scene),
320 mt::fake_shared(renderer_factory));
321
322 auto comp = factory.create_compositor_for(display_buffer);
323
324 comp->composite();
325}
326
266TEST(DefaultDisplayBufferCompositor, obscured_fullscreen_does_not_bypass)327TEST(DefaultDisplayBufferCompositor, obscured_fullscreen_does_not_bypass)
267{328{
268 using namespace testing;329 using namespace testing;
269330
=== modified file 'tests/unit-tests/frontend/test_session_mediator.cpp'
--- tests/unit-tests/frontend/test_session_mediator.cpp 2013-12-17 18:24:51 +0000
+++ tests/unit-tests/frontend/test_session_mediator.cpp 2014-01-02 11:14:12 +0000
@@ -83,7 +83,7 @@
83{83{
84 MOCK_CONST_METHOD1(for_each_card, void(std::function<void(mg::DisplayConfigurationCard const&)>));84 MOCK_CONST_METHOD1(for_each_card, void(std::function<void(mg::DisplayConfigurationCard const&)>));
85 MOCK_CONST_METHOD1(for_each_output, void(std::function<void(mg::DisplayConfigurationOutput const&)>));85 MOCK_CONST_METHOD1(for_each_output, void(std::function<void(mg::DisplayConfigurationOutput const&)>));
86 MOCK_METHOD5(configure_output, void(mg::DisplayConfigurationOutputId, bool, geom::Point, size_t, MirPowerMode));86 MOCK_METHOD6(configure_output, void(mg::DisplayConfigurationOutputId, bool, geom::Point, size_t, MirPixelFormat, MirPowerMode));
87};87};
8888
89}89}
@@ -555,6 +555,8 @@
555 bool used0 = false, used1 = true;555 bool used0 = false, used1 = true;
556 geom::Point pt0{44,22}, pt1{3,2};556 geom::Point pt0{44,22}, pt1{3,2};
557 size_t mode_index0 = 1, mode_index1 = 3;557 size_t mode_index0 = 1, mode_index1 = 3;
558 MirPixelFormat format0 = mir_pixel_format_invalid;
559 MirPixelFormat format1 = mir_pixel_format_argb_8888;
558 mg::DisplayConfigurationOutputId id0{6}, id1{3};560 mg::DisplayConfigurationOutputId id0{6}, id1{3};
559561
560 NiceMock<MockConfig> mock_display_config;562 NiceMock<MockConfig> mock_display_config;
@@ -568,9 +570,9 @@
568 EXPECT_CALL(*mock_display_selector, active_configuration())570 EXPECT_CALL(*mock_display_selector, active_configuration())
569 .InSequence(seq)571 .InSequence(seq)
570 .WillOnce(Return(mt::fake_shared(mock_display_config)));572 .WillOnce(Return(mt::fake_shared(mock_display_config)));
571 EXPECT_CALL(mock_display_config, configure_output(id0, used0, pt0, mode_index0, mir_power_mode_on))573 EXPECT_CALL(mock_display_config, configure_output(id0, used0, pt0, mode_index0, format0, mir_power_mode_on))
572 .InSequence(seq);574 .InSequence(seq);
573 EXPECT_CALL(mock_display_config, configure_output(id1, used1, pt1, mode_index1, mir_power_mode_off))575 EXPECT_CALL(mock_display_config, configure_output(id1, used1, pt1, mode_index1, format1, mir_power_mode_off))
574 .InSequence(seq);576 .InSequence(seq);
575 EXPECT_CALL(*mock_display_selector, configure(_,_))577 EXPECT_CALL(*mock_display_selector, configure(_,_))
576 .InSequence(seq);578 .InSequence(seq);
@@ -593,6 +595,7 @@
593 disp0->set_position_x(pt0.x.as_uint32_t());595 disp0->set_position_x(pt0.x.as_uint32_t());
594 disp0->set_position_y(pt0.y.as_uint32_t());596 disp0->set_position_y(pt0.y.as_uint32_t());
595 disp0->set_current_mode(mode_index0);597 disp0->set_current_mode(mode_index0);
598 disp0->set_current_format(format0);
596 disp0->set_power_mode(static_cast<uint32_t>(mir_power_mode_on));599 disp0->set_power_mode(static_cast<uint32_t>(mir_power_mode_on));
597600
598 auto disp1 = configuration.add_display_output();601 auto disp1 = configuration.add_display_output();
@@ -601,6 +604,7 @@
601 disp1->set_position_x(pt1.x.as_uint32_t());604 disp1->set_position_x(pt1.x.as_uint32_t());
602 disp1->set_position_y(pt1.y.as_uint32_t());605 disp1->set_position_y(pt1.y.as_uint32_t());
603 disp1->set_current_mode(mode_index1);606 disp1->set_current_mode(mode_index1);
607 disp1->set_current_format(format1);
604 disp1->set_power_mode(static_cast<uint32_t>(mir_power_mode_off));608 disp1->set_power_mode(static_cast<uint32_t>(mir_power_mode_off));
605609
606 session_mediator.configure_display(nullptr, &configuration,610 session_mediator.configure_display(nullptr, &configuration,
607611
=== modified file 'tests/unit-tests/graphics/CMakeLists.txt'
--- tests/unit-tests/graphics/CMakeLists.txt 2013-12-19 19:05:57 +0000
+++ tests/unit-tests/graphics/CMakeLists.txt 2014-01-02 11:14:12 +0000
@@ -6,6 +6,7 @@
6 ${CMAKE_CURRENT_SOURCE_DIR}/test_default_display_configuration_policy.cpp6 ${CMAKE_CURRENT_SOURCE_DIR}/test_default_display_configuration_policy.cpp
7 ${CMAKE_CURRENT_SOURCE_DIR}/test_buffer_id.cpp7 ${CMAKE_CURRENT_SOURCE_DIR}/test_buffer_id.cpp
8 ${CMAKE_CURRENT_SOURCE_DIR}/test_buffer_properties.cpp8 ${CMAKE_CURRENT_SOURCE_DIR}/test_buffer_properties.cpp
9 ${CMAKE_CURRENT_SOURCE_DIR}/test_pixel_format_utils.cpp
9 ${CMAKE_CURRENT_SOURCE_DIR}/test_surfaceless_egl_context.cpp10 ${CMAKE_CURRENT_SOURCE_DIR}/test_surfaceless_egl_context.cpp
10)11)
1112
1213
=== modified file 'tests/unit-tests/graphics/android/test_android_fb.cpp'
--- tests/unit-tests/graphics/android/test_android_fb.cpp 2013-12-17 18:24:51 +0000
+++ tests/unit-tests/graphics/android/test_android_fb.cpp 2014-01-02 11:14:12 +0000
@@ -256,28 +256,28 @@
256 configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)256 configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)
257 {257 {
258 configuration->configure_output(258 configuration->configure_output(
259 output.id, output.used, output.top_left, output.current_mode_index, mir_power_mode_on);259 output.id, output.used, output.top_left, output.current_mode_index, output.current_format, mir_power_mode_on);
260 });260 });
261 display.configure(*configuration);261 display.configure(*configuration);
262262
263 configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)263 configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)
264 {264 {
265 configuration->configure_output(265 configuration->configure_output(
266 output.id, output.used, output.top_left, output.current_mode_index, mir_power_mode_standby);266 output.id, output.used, output.top_left, output.current_mode_index, output.current_format, mir_power_mode_standby);
267 });267 });
268 display.configure(*configuration);268 display.configure(*configuration);
269269
270 configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)270 configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)
271 {271 {
272 configuration->configure_output(272 configuration->configure_output(
273 output.id, output.used, output.top_left, output.current_mode_index, mir_power_mode_off);273 output.id, output.used, output.top_left, output.current_mode_index, output.current_format, mir_power_mode_off);
274 });274 });
275 display.configure(*configuration);275 display.configure(*configuration);
276276
277 configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)277 configuration->for_each_output([&](mg::DisplayConfigurationOutput const& output)
278 {278 {
279 configuration->configure_output(279 configuration->configure_output(
280 output.id, output.used, output.top_left, output.current_mode_index, mir_power_mode_suspend);280 output.id, output.used, output.top_left, output.current_mode_index, output.current_format, mir_power_mode_suspend);
281 });281 });
282 display.configure(*configuration);282 display.configure(*configuration);
283}283}
284284
=== modified file 'tests/unit-tests/graphics/mesa/test_cursor.cpp'
--- tests/unit-tests/graphics/mesa/test_cursor.cpp 2013-12-17 18:24:51 +0000
+++ tests/unit-tests/graphics/mesa/test_cursor.cpp 2014-01-02 11:14:12 +0000
@@ -105,7 +105,7 @@
105 true,105 true,
106 geom::Point{0, 0},106 geom::Point{0, 0},
107 1,107 1,
108 0,108 mir_pixel_format_invalid,
109 mir_power_mode_on109 mir_power_mode_on
110 });110 });
111 outputs.push_back(111 outputs.push_back(
@@ -124,33 +124,33 @@
124 true,124 true,
125 geom::Point{100, 50},125 geom::Point{100, 50},
126 0,126 0,
127 0,127 mir_pixel_format_invalid,
128 mir_power_mode_on128 mir_power_mode_on
129 });129 });
130 }130 }
131131
132 void for_each_card(std::function<void(mg::DisplayConfigurationCard const&)> f) const132 void for_each_card(std::function<void(mg::DisplayConfigurationCard const&)> f) const override
133 {133 {
134 f({card_id, outputs.size()});134 f({card_id, outputs.size()});
135 }135 }
136136
137 void for_each_output(std::function<void(mg::DisplayConfigurationOutput const&)> f) const137 void for_each_output(std::function<void(mg::DisplayConfigurationOutput const&)> f) const override
138 {138 {
139 for (auto const& output : outputs)139 for (auto const& output : outputs)
140 f(output);140 f(output);
141 }141 }
142142
143 void configure_output(mg::DisplayConfigurationOutputId, bool,143 void configure_output(mg::DisplayConfigurationOutputId, bool,
144 geom::Point, size_t, MirPowerMode)144 geom::Point, size_t, MirPixelFormat, MirPowerMode) override
145 {145 {
146 }146 }
147147
148 uint32_t get_kms_connector_id(mg::DisplayConfigurationOutputId id) const148 uint32_t get_kms_connector_id(mg::DisplayConfigurationOutputId id) const override
149 {149 {
150 return id.as_value();150 return id.as_value();
151 }151 }
152152
153 size_t get_kms_mode_index(mg::DisplayConfigurationOutputId, size_t conf_mode_index) const153 size_t get_kms_mode_index(mg::DisplayConfigurationOutputId, size_t conf_mode_index) const override
154 {154 {
155 return conf_mode_index;155 return conf_mode_index;
156 }156 }
157157
=== modified file 'tests/unit-tests/graphics/mesa/test_display_configuration.cpp'
--- tests/unit-tests/graphics/mesa/test_display_configuration.cpp 2013-12-17 18:24:51 +0000
+++ tests/unit-tests/graphics/mesa/test_display_configuration.cpp 2014-01-02 11:14:12 +0000
@@ -197,7 +197,7 @@
197 true,197 true,
198 geom::Point(),198 geom::Point(),
199 1,199 1,
200 0,200 mir_pixel_format_invalid,
201 mir_power_mode_on201 mir_power_mode_on
202 },202 },
203 {203 {
@@ -212,7 +212,7 @@
212 false,212 false,
213 geom::Point(),213 geom::Point(),
214 std::numeric_limits<size_t>::max(),214 std::numeric_limits<size_t>::max(),
215 std::numeric_limits<size_t>::max(),215 mir_pixel_format_invalid,
216 mir_power_mode_on216 mir_power_mode_on
217 },217 },
218 {218 {
@@ -227,7 +227,7 @@
227 false,227 false,
228 geom::Point(),228 geom::Point(),
229 std::numeric_limits<size_t>::max(),229 std::numeric_limits<size_t>::max(),
230 std::numeric_limits<size_t>::max(),230 mir_pixel_format_invalid,
231 mir_power_mode_on231 mir_power_mode_on
232 }232 }
233 };233 };
@@ -381,7 +381,7 @@
381 true,381 true,
382 geom::Point(),382 geom::Point(),
383 1,383 1,
384 0,384 mir_pixel_format_invalid,
385 mir_power_mode_on385 mir_power_mode_on
386 },386 },
387 {387 {
@@ -396,7 +396,7 @@
396 false,396 false,
397 geom::Point(),397 geom::Point(),
398 std::numeric_limits<size_t>::max(),398 std::numeric_limits<size_t>::max(),
399 std::numeric_limits<size_t>::max(),399 mir_pixel_format_invalid,
400 mir_power_mode_on400 mir_power_mode_on
401 },401 },
402 };402 };
@@ -415,7 +415,7 @@
415 true,415 true,
416 geom::Point(),416 geom::Point(),
417 std::numeric_limits<size_t>::max(),417 std::numeric_limits<size_t>::max(),
418 std::numeric_limits<size_t>::max(),418 mir_pixel_format_invalid,
419 mir_power_mode_on419 mir_power_mode_on
420 },420 },
421 {421 {
@@ -430,7 +430,7 @@
430 false,430 false,
431 geom::Point(),431 geom::Point(),
432 1,432 1,
433 0,433 mir_pixel_format_invalid,
434 mir_power_mode_on434 mir_power_mode_on
435 },435 },
436 };436 };
437437
=== modified file 'tests/unit-tests/graphics/mesa/test_display_multi_monitor.cpp'
--- tests/unit-tests/graphics/mesa/test_display_multi_monitor.cpp 2013-12-17 18:24:51 +0000
+++ tests/unit-tests/graphics/mesa/test_display_multi_monitor.cpp 2014-01-02 11:14:12 +0000
@@ -57,12 +57,16 @@
57 if (conf_output.connected && conf_output.modes.size() > 0)57 if (conf_output.connected && conf_output.modes.size() > 0)
58 {58 {
59 conf.configure_output(conf_output.id, true, geom::Point{0, 0},59 conf.configure_output(conf_output.id, true, geom::Point{0, 0},
60 conf_output.preferred_mode_index, mir_power_mode_on);60 conf_output.preferred_mode_index,
61 conf_output.current_format,
62 mir_power_mode_on);
61 }63 }
62 else64 else
63 {65 {
64 conf.configure_output(conf_output.id, false, conf_output.top_left,66 conf.configure_output(conf_output.id, false, conf_output.top_left,
65 conf_output.current_mode_index, mir_power_mode_on);67 conf_output.current_mode_index,
68 conf_output.current_format,
69 mir_power_mode_on);
66 }70 }
67 });71 });
68 }72 }
@@ -81,13 +85,17 @@
81 if (conf_output.connected && conf_output.modes.size() > 0)85 if (conf_output.connected && conf_output.modes.size() > 0)
82 {86 {
83 conf.configure_output(conf_output.id, true, geom::Point{max_x, 0},87 conf.configure_output(conf_output.id, true, geom::Point{max_x, 0},
84 conf_output.preferred_mode_index, mir_power_mode_on);88 conf_output.preferred_mode_index,
89 conf_output.current_format,
90 mir_power_mode_on);
85 max_x += conf_output.modes[conf_output.preferred_mode_index].size.width.as_int();91 max_x += conf_output.modes[conf_output.preferred_mode_index].size.width.as_int();
86 }92 }
87 else93 else
88 {94 {
89 conf.configure_output(conf_output.id, false, conf_output.top_left,95 conf.configure_output(conf_output.id, false, conf_output.top_left,
90 conf_output.current_mode_index, mir_power_mode_on);96 conf_output.current_mode_index,
97 conf_output.current_format,
98 mir_power_mode_on);
91 }99 }
92 });100 });
93 }101 }
@@ -472,7 +480,8 @@
472 [&](mg::DisplayConfigurationOutput const& conf_output)480 [&](mg::DisplayConfigurationOutput const& conf_output)
473 {481 {
474 conf->configure_output(conf_output.id, false, conf_output.top_left,482 conf->configure_output(conf_output.id, false, conf_output.top_left,
475 conf_output.preferred_mode_index, mir_power_mode_on);483 conf_output.preferred_mode_index, mir_pixel_format_xrgb_8888,
484 mir_power_mode_on);
476 });485 });
477486
478 display->configure(*conf);487 display->configure(*conf);
@@ -508,7 +517,8 @@
508 [&](mg::DisplayConfigurationOutput const& conf_output)517 [&](mg::DisplayConfigurationOutput const& conf_output)
509 {518 {
510 conf->configure_output(conf_output.id, false, conf_output.top_left,519 conf->configure_output(conf_output.id, false, conf_output.top_left,
511 conf_output.preferred_mode_index, mir_power_mode_on);520 conf_output.preferred_mode_index, mir_pixel_format_xrgb_8888,
521 mir_power_mode_on);
512 });522 });
513523
514 display->configure(*conf);524 display->configure(*conf);
515525
=== modified file 'tests/unit-tests/graphics/mesa/test_overlapping_output_grouping.cpp'
--- tests/unit-tests/graphics/mesa/test_overlapping_output_grouping.cpp 2013-12-17 18:24:51 +0000
+++ tests/unit-tests/graphics/mesa/test_overlapping_output_grouping.cpp 2014-01-02 11:14:12 +0000
@@ -79,7 +79,7 @@
79 used,79 used,
80 rect.top_left,80 rect.top_left,
81 i - 1,81 i - 1,
82 0,82 mir_pixel_format_invalid,
83 mir_power_mode_on83 mir_power_mode_on
84 };84 };
8585
@@ -89,7 +89,7 @@
89 }89 }
9090
91 void configure_output(mg::DisplayConfigurationOutputId, bool,91 void configure_output(mg::DisplayConfigurationOutputId, bool,
92 geom::Point, size_t, MirPowerMode)92 geom::Point, size_t, MirPixelFormat, MirPowerMode)
93 {93 {
94 }94 }
9595
9696
=== modified file 'tests/unit-tests/graphics/nested/test_nested_display_configuration.cpp'
--- tests/unit-tests/graphics/nested/test_nested_display_configuration.cpp 2013-09-12 21:36:55 +0000
+++ tests/unit-tests/graphics/nested/test_nested_display_configuration.cpp 2014-01-02 11:14:12 +0000
@@ -36,7 +36,7 @@
36uint32_t const default_current_mode = 0;36uint32_t const default_current_mode = 0;
37uint32_t const default_num_output_formats = 0;37uint32_t const default_num_output_formats = 0;
38MirPixelFormat* const default_output_formats = nullptr;38MirPixelFormat* const default_output_formats = nullptr;
39uint32_t const default_current_output_format = 0;39MirPixelFormat const default_current_output_format = mir_pixel_format_abgr_8888;
40uint32_t const default_card_id = 1;40uint32_t const default_card_id = 1;
41uint32_t const second_card_id = 2;41uint32_t const second_card_id = 2;
42uint32_t const default_output_id = 0;42uint32_t const default_output_id = 0;
@@ -84,7 +84,7 @@
84 output->current_mode = 0;84 output->current_mode = 0;
85 output->num_output_formats = NoOfFormats;85 output->num_output_formats = NoOfFormats;
86 output->output_formats = format_tmp;86 output->output_formats = format_tmp;
87 output->current_output_format = 0;87 output->current_output_format = NoOfFormats > 0 ? formats[0] : mir_pixel_format_invalid;
88 }88 }
8989
90 template<int NoOfOutputs, int NoOfModes, int NoOfFormats>90 template<int NoOfOutputs, int NoOfModes, int NoOfFormats>
@@ -257,7 +257,7 @@
257 mgn::NestedDisplayConfiguration config(build_trivial_configuration());257 mgn::NestedDisplayConfiguration config(build_trivial_configuration());
258258
259 config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true,259 config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true,
260 top_left, default_current_mode, mir_power_mode_on);260 top_left, default_current_mode, default_current_output_format, mir_power_mode_on);
261261
262 MockOutputVisitor ov;262 MockOutputVisitor ov;
263 EXPECT_CALL(ov, f(_)).Times(Exactly(1));263 EXPECT_CALL(ov, f(_)).Times(Exactly(1));
@@ -268,6 +268,7 @@
268 EXPECT_EQ(true, output.used);268 EXPECT_EQ(true, output.used);
269 EXPECT_EQ(top_left, output.top_left);269 EXPECT_EQ(top_left, output.top_left);
270 EXPECT_EQ(0, output.current_mode_index);270 EXPECT_EQ(0, output.current_mode_index);
271 EXPECT_EQ(default_current_output_format, output.current_format);
271 });272 });
272}273}
273274
@@ -278,11 +279,25 @@
278 mgn::NestedDisplayConfiguration config(build_trivial_configuration());279 mgn::NestedDisplayConfiguration config(build_trivial_configuration());
279280
280 EXPECT_THROW(281 EXPECT_THROW(
281 {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true, top_left, -1, mir_power_mode_on);},282 {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true, top_left, -1, default_current_output_format, mir_power_mode_on);},
282 std::runtime_error);283 std::runtime_error);
283284
284 EXPECT_THROW(285 EXPECT_THROW(
285 {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true, top_left, too_big_mode_index, mir_power_mode_on);},286 {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true, top_left, too_big_mode_index, default_current_output_format, mir_power_mode_on);},
287 std::runtime_error);
288}
289
290TEST_F(NestedDisplayConfiguration, configure_output_rejects_invalid_format)
291{
292 geom::Point const top_left{10,20};
293 mgn::NestedDisplayConfiguration config(build_trivial_configuration());
294
295 EXPECT_THROW(
296 {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true, top_left, default_current_mode, mir_pixel_format_invalid, mir_power_mode_on);},
297 std::runtime_error);
298
299 EXPECT_THROW(
300 {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id), true, top_left, default_current_mode, mir_pixel_formats, mir_power_mode_on);},
286 std::runtime_error);301 std::runtime_error);
287}302}
288303
@@ -292,11 +307,11 @@
292 mgn::NestedDisplayConfiguration config(build_trivial_configuration());307 mgn::NestedDisplayConfiguration config(build_trivial_configuration());
293308
294 EXPECT_THROW(309 EXPECT_THROW(
295 {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id+1), true, top_left, default_current_mode, mir_power_mode_on);},310 {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id+1), true, top_left, default_current_mode, default_current_output_format, mir_power_mode_on);},
296 std::runtime_error);311 std::runtime_error);
297312
298 EXPECT_THROW(313 EXPECT_THROW(
299 {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id-1), true, top_left, default_current_mode, mir_power_mode_on);},314 {config.configure_output(mg::DisplayConfigurationOutputId(default_output_id-1), true, top_left, default_current_mode, default_current_output_format, mir_power_mode_on);},
300 std::runtime_error);315 std::runtime_error);
301}316}
302317
@@ -326,7 +341,7 @@
326 geom::Point const top_left{100,200};341 geom::Point const top_left{100,200};
327 mgn::NestedDisplayConfiguration config(build_non_trivial_configuration());342 mgn::NestedDisplayConfiguration config(build_non_trivial_configuration());
328343
329 config.configure_output(id, true, top_left, 1, mir_power_mode_on);344 config.configure_output(id, true, top_left, 1, mir_pixel_format_argb_8888, mir_power_mode_on);
330345
331 MockOutputVisitor ov;346 MockOutputVisitor ov;
332 EXPECT_CALL(ov, f(_)).Times(Exactly(3));347 EXPECT_CALL(ov, f(_)).Times(Exactly(3));
@@ -338,6 +353,7 @@
338 EXPECT_EQ(true, output.used);353 EXPECT_EQ(true, output.used);
339 EXPECT_EQ(top_left, output.top_left);354 EXPECT_EQ(top_left, output.top_left);
340 EXPECT_EQ(1, output.current_mode_index);355 EXPECT_EQ(1, output.current_mode_index);
356 EXPECT_EQ(mir_pixel_format_argb_8888, output.current_format);
341 }357 }
342 });358 });
343}359}
344360
=== modified file 'tests/unit-tests/graphics/test_default_display_configuration_policy.cpp'
--- tests/unit-tests/graphics/test_default_display_configuration_policy.cpp 2013-12-17 18:24:51 +0000
+++ tests/unit-tests/graphics/test_default_display_configuration_policy.cpp 2014-01-02 11:14:12 +0000
@@ -22,149 +22,158 @@
22#include <gtest/gtest.h>22#include <gtest/gtest.h>
23#include <gmock/gmock.h>23#include <gmock/gmock.h>
2424
25namespace mg = mir::graphics;25using namespace mir::graphics;
26namespace geom = mir::geometry;26using namespace mir::geometry;
2727
28namespace28namespace
29{29{
3030
31class MockDisplayConfiguration : public mg::DisplayConfiguration31class MockDisplayConfiguration : public DisplayConfiguration
32{32{
33public:33public:
34 MockDisplayConfiguration(size_t max_simultaneous_outputs)34 MockDisplayConfiguration(MockDisplayConfiguration && m)
35 : card_id{1}, max_simultaneous_outputs{max_simultaneous_outputs}35 : max_simultaneous_outputs{m.max_simultaneous_outputs},
36 outputs{std::move(m.outputs)}
36 {37 {
37 /* Connected with modes */38 }
38 outputs.push_back(
39 {
40 mg::DisplayConfigurationOutputId{10},
41 card_id,
42 mg::DisplayConfigurationOutputType::vga,
43 {
44 mir_pixel_format_abgr_8888
45 },
46 {
47 {geom::Size{123, 111}, 59.9},
48 {geom::Size{123, 111}, 59.9},
49 {geom::Size{123, 111}, 59.9}
50 },
51 2,
52 geom::Size{324, 642},
53 true,
54 false,
55 geom::Point{geom::X{123}, geom::Y{343}},
56 1,
57 0,
58 mir_power_mode_on
59 });
60 /* Connected without modes */
61 outputs.push_back(
62 {
63 mg::DisplayConfigurationOutputId{11},
64 card_id,
65 mg::DisplayConfigurationOutputType::vga,
66 {},
67 {},
68 std::numeric_limits<size_t>::max(),
69 geom::Size{566, 111},
70 true,
71 false,
72 geom::Point(),
73 std::numeric_limits<size_t>::max(),
74 std::numeric_limits<size_t>::max(),
75 mir_power_mode_on
76 });
77 /* Connected with a single mode */
78 outputs.push_back(
79 {
80 mg::DisplayConfigurationOutputId{12},
81 card_id,
82 mg::DisplayConfigurationOutputType::vga,
83 {
84 mir_pixel_format_abgr_8888
85 },
86 {
87 {geom::Size{523, 555}, 60.0},
88 },
89 0,
90 geom::Size{324, 642},
91 true,
92 false,
93 geom::Point(),
94 0,
95 0,
96 mir_power_mode_on
97 });
98 /* Not connected */
99 outputs.push_back(
100 {
101 mg::DisplayConfigurationOutputId{13},
102 card_id,
103 mg::DisplayConfigurationOutputType::vga,
104 {
105 mir_pixel_format_abgr_8888
106 },
107 {},
108 0,
109 geom::Size{324, 642},
110 false,
111 false,
112 geom::Point(),
113 1,
114 0,
115 mir_power_mode_on
116 });
11739
40 MockDisplayConfiguration(size_t max_simultaneous_outputs, std::vector<DisplayConfigurationOutput> && config)
41 : max_simultaneous_outputs{max_simultaneous_outputs},
42 outputs{config}
43 {
118 if (max_simultaneous_outputs == max_simultaneous_outputs_all)44 if (max_simultaneous_outputs == max_simultaneous_outputs_all)
119 max_simultaneous_outputs = outputs.size();45 max_simultaneous_outputs = outputs.size();
120 }46 }
12147
122 MockDisplayConfiguration()48 MockDisplayConfiguration(std::vector<DisplayConfigurationOutput> && config)
123 : MockDisplayConfiguration{max_simultaneous_outputs_all}49 : MockDisplayConfiguration(max_simultaneous_outputs_all, std::move(config))
124 {50 {
125 }51 }
12652
127 void for_each_card(std::function<void(mg::DisplayConfigurationCard const&)> f) const53 void for_each_card(std::function<void(DisplayConfigurationCard const&)> f) const
128 {54 {
129 f({card_id, max_simultaneous_outputs});55 f({DisplayConfigurationCardId{1}, max_simultaneous_outputs});
130 }56 }
13157
132 void for_each_output(std::function<void(mg::DisplayConfigurationOutput const&)> f) const58 void for_each_output(std::function<void(DisplayConfigurationOutput const&)> f) const
133 {59 {
134 for (auto const& output : outputs)60 for (auto const& output : outputs)
135 f(output);61 f(output);
136 }62 }
13763
138 MOCK_METHOD5(configure_output, void(mg::DisplayConfigurationOutputId, bool,64 MOCK_METHOD6(configure_output, void(DisplayConfigurationOutputId, bool,
139 geom::Point, size_t, MirPowerMode));65 Point, size_t, MirPixelFormat, MirPowerMode));
14066
67 static const size_t max_simultaneous_outputs_all{std::numeric_limits<size_t>::max()};
141private:68private:
142 static const size_t max_simultaneous_outputs_all{std::numeric_limits<size_t>::max()};
143 mg::DisplayConfigurationCardId const card_id;
144 size_t max_simultaneous_outputs;69 size_t max_simultaneous_outputs;
145 std::vector<mg::DisplayConfigurationOutput> outputs;70 std::vector<DisplayConfigurationOutput> outputs;
146};71};
14772
148}73}
14974
75DisplayConfigurationOutput default_output(DisplayConfigurationOutputId id)
76{
77 return { id, DisplayConfigurationCardId{1},
78 DisplayConfigurationOutputType::vga,
79 {mir_pixel_format_abgr_8888},
80 { {Size{523, 555}, 60.0} },
81 0,
82 Size{324, 642},
83 true,
84 false,
85 Point{X{123}, Y{343}},
86 0,
87 mir_pixel_format_abgr_8888,
88 mir_power_mode_on
89 };
90}
91
92DisplayConfigurationOutput connected_with_modes()
93{
94 DisplayConfigurationOutput output = default_output(DisplayConfigurationOutputId{10}) ;
95 output.modes =
96 {
97 {Size{123, 111}, 59.9},
98 {Size{123, 111}, 59.9},
99 {Size{123, 111}, 59.9}
100 };
101 output.preferred_mode_index = 2;
102 output.current_mode_index = 1;
103 return output;
104}
105DisplayConfigurationOutput connected_without_modes()
106{
107 DisplayConfigurationOutput output = default_output(DisplayConfigurationOutputId{11});
108 output.pixel_formats = {};
109 output.modes = {};
110 output.current_format = mir_pixel_format_invalid;
111 output.current_mode_index = std::numeric_limits<size_t>::max();
112 return output;
113}
114
115DisplayConfigurationOutput connected_with_single_mode()
116{
117 return default_output(DisplayConfigurationOutputId{12});
118}
119
120DisplayConfigurationOutput not_connected()
121{
122 DisplayConfigurationOutput output = default_output(DisplayConfigurationOutputId{13});
123 output.connected = false;
124 output.current_mode_index = 1;
125 return output;
126}
127
128DisplayConfigurationOutput connected_with_rgba_and_xrgb()
129{
130 DisplayConfigurationOutput output = default_output(DisplayConfigurationOutputId{14});
131 output.pixel_formats = {mir_pixel_format_argb_8888, mir_pixel_format_xrgb_8888};
132 return output;
133}
134
135DisplayConfigurationOutput connected_with_xrgb_bgr()
136{
137 DisplayConfigurationOutput output = default_output(DisplayConfigurationOutputId{15});
138 output.pixel_formats = {mir_pixel_format_xrgb_8888, mir_pixel_format_bgr_888};
139 output.current_format = mir_pixel_format_bgr_888;
140 return output;
141}
142
143MockDisplayConfiguration create_default_configuration(size_t max_outputs = MockDisplayConfiguration::max_simultaneous_outputs_all)
144{
145 return MockDisplayConfiguration
146 {
147 max_outputs,
148 {
149 connected_with_modes(),
150 connected_without_modes(),
151 connected_with_single_mode(),
152 not_connected(),
153 }
154 };
155}
156
150TEST(DefaultDisplayConfigurationPolicyTest, uses_all_connected_valid_outputs)157TEST(DefaultDisplayConfigurationPolicyTest, uses_all_connected_valid_outputs)
151{158{
152 using namespace ::testing;159 using namespace ::testing;
153160
154 mg::DefaultDisplayConfigurationPolicy policy;161 DefaultDisplayConfigurationPolicy policy;
155 MockDisplayConfiguration conf;162 MockDisplayConfiguration conf{create_default_configuration()};
156163
157 conf.for_each_output([&conf](mg::DisplayConfigurationOutput const& output)164 conf.for_each_output([&conf](DisplayConfigurationOutput const& output)
158 {165 {
159 if (output.connected && output.modes.size() > 0)166 if (output.connected && output.modes.size() > 0)
160 {167 {
161 EXPECT_CALL(conf, configure_output(output.id, true, geom::Point(),168 EXPECT_CALL(conf, configure_output(output.id, true, Point(),
162 output.preferred_mode_index, _));169 output.preferred_mode_index,
170 _, _));
163 }171 }
164 else172 else
165 {173 {
166 EXPECT_CALL(conf, configure_output(output.id, false, output.top_left,174 EXPECT_CALL(conf, configure_output(output.id, false, output.top_left,
167 output.current_mode_index, _));175 output.current_mode_index,
176 _, _));
168 }177 }
169 });178 });
170179
@@ -175,12 +184,12 @@
175{184{
176 using namespace ::testing;185 using namespace ::testing;
177186
178 mg::DefaultDisplayConfigurationPolicy policy;187 DefaultDisplayConfigurationPolicy policy;
179 MockDisplayConfiguration conf;188 MockDisplayConfiguration conf{create_default_configuration()};
180189
181 conf.for_each_output([&conf](mg::DisplayConfigurationOutput const& output)190 conf.for_each_output([&conf](DisplayConfigurationOutput const& output)
182 {191 {
183 EXPECT_CALL(conf, configure_output(output.id, _, _, _, mir_power_mode_on));192 EXPECT_CALL(conf, configure_output(output.id, _, _, _, _, mir_power_mode_on));
184 });193 });
185194
186 policy.apply_to(conf);195 policy.apply_to(conf);
@@ -191,20 +200,54 @@
191 using namespace ::testing;200 using namespace ::testing;
192201
193 size_t const max_simultaneous_outputs{1};202 size_t const max_simultaneous_outputs{1};
194 mg::DefaultDisplayConfigurationPolicy policy;203 DefaultDisplayConfigurationPolicy policy;
195 MockDisplayConfiguration conf{max_simultaneous_outputs};204 MockDisplayConfiguration conf{create_default_configuration(max_simultaneous_outputs)};
196205
197 size_t output_count{0};206 size_t output_count{0};
198 conf.for_each_output([&output_count](mg::DisplayConfigurationOutput const&)207 conf.for_each_output([&output_count](DisplayConfigurationOutput const&)
199 {208 {
200 ++output_count;209 ++output_count;
201 });210 });
202211
203 EXPECT_CALL(conf, configure_output(_, true, _, _, _))212 EXPECT_CALL(conf, configure_output(_, true, _, _, _, _))
204 .Times(AtMost(max_simultaneous_outputs));213 .Times(AtMost(max_simultaneous_outputs));
205214
206 EXPECT_CALL(conf, configure_output(_, false, _, _, _))215 EXPECT_CALL(conf, configure_output(_, false, _, _, _, _))
207 .Times(AtLeast(output_count - max_simultaneous_outputs));216 .Times(AtLeast(output_count - max_simultaneous_outputs));
208217
209 policy.apply_to(conf);218 policy.apply_to(conf);
210}219}
220
221TEST(DefaultDisplayConfigurationPolicyTest, prefer_opaque_over_alpha)
222{
223 using namespace ::testing;
224
225 DefaultDisplayConfigurationPolicy policy;
226 MockDisplayConfiguration pick_xrgb{ { connected_with_rgba_and_xrgb() } };
227
228 EXPECT_CALL(pick_xrgb, configure_output(_, true, _, _, mir_pixel_format_xrgb_8888, _));
229 policy.apply_to(pick_xrgb);
230}
231
232TEST(DefaultDisplayConfigurationPolicyTest, preserve_opaque_selection)
233{
234 using namespace ::testing;
235
236 DefaultDisplayConfigurationPolicy policy;
237 MockDisplayConfiguration keep_bgr{ { connected_with_xrgb_bgr() } };
238
239 EXPECT_CALL(keep_bgr, configure_output(_, true, _, _, mir_pixel_format_bgr_888, _));
240 policy.apply_to(keep_bgr);
241}
242
243TEST(DefaultDisplayConfigurationPolicyTest, accept_transparency_when_only_option)
244{
245 using namespace ::testing;
246
247 DefaultDisplayConfigurationPolicy policy;
248 MockDisplayConfiguration pick_rgba{ { default_output(DisplayConfigurationOutputId{15}) } };
249
250 EXPECT_CALL(pick_rgba, configure_output(_, true, _, _, mir_pixel_format_abgr_8888, _));
251 policy.apply_to(pick_rgba);
252}
253
211254
=== modified file 'tests/unit-tests/graphics/test_display_configuration.cpp'
--- tests/unit-tests/graphics/test_display_configuration.cpp 2013-12-17 18:24:51 +0000
+++ tests/unit-tests/graphics/test_display_configuration.cpp 2014-01-02 11:14:12 +0000
@@ -45,7 +45,7 @@
45 true,45 true,
46 geom::Point(),46 geom::Point(),
47 2,47 2,
48 0,48 mir_pixel_format_abgr_8888,
49 mir_power_mode_on49 mir_power_mode_on
50};50};
5151
5252
=== added file 'tests/unit-tests/graphics/test_pixel_format_utils.cpp'
--- tests/unit-tests/graphics/test_pixel_format_utils.cpp 1970-01-01 00:00:00 +0000
+++ tests/unit-tests/graphics/test_pixel_format_utils.cpp 2014-01-02 11:14:12 +0000
@@ -0,0 +1,90 @@
1/*
2 * Copyright © 2013 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Andreas Pokorny <andreas.pokorny@canonical.com>
17 */
18
19#include "mir_toolkit/common.h"
20#include "mir/graphics/pixel_format_utils.h"
21#include <gmock/gmock.h>
22#include <gtest/gtest.h>
23
24using namespace mir::graphics;
25TEST(MirPixelFormatUtils, contains_alpha)
26{
27 EXPECT_FALSE(contains_alpha(mir_pixel_format_xbgr_8888));
28 EXPECT_FALSE(contains_alpha(mir_pixel_format_bgr_888));
29 EXPECT_FALSE(contains_alpha(mir_pixel_format_xrgb_8888));
30 EXPECT_FALSE(contains_alpha(mir_pixel_format_xbgr_8888));
31 EXPECT_TRUE(contains_alpha(mir_pixel_format_argb_8888));
32 EXPECT_TRUE(contains_alpha(mir_pixel_format_abgr_8888));
33 EXPECT_FALSE(contains_alpha(mir_pixel_format_invalid));
34}
35
36TEST(MirPixelFormatUtils, red_channel_depths)
37{
38 EXPECT_EQ(8, red_channel_depth(mir_pixel_format_xbgr_8888));
39 EXPECT_EQ(8, red_channel_depth(mir_pixel_format_bgr_888));
40 EXPECT_EQ(8, red_channel_depth(mir_pixel_format_xrgb_8888));
41 EXPECT_EQ(8, red_channel_depth(mir_pixel_format_xbgr_8888));
42 EXPECT_EQ(8, red_channel_depth(mir_pixel_format_argb_8888));
43 EXPECT_EQ(8, red_channel_depth(mir_pixel_format_abgr_8888));
44 EXPECT_EQ(0, red_channel_depth(mir_pixel_format_invalid));
45}
46
47TEST(MirPixelFormatUtils, blue_channel_depths)
48{
49 EXPECT_EQ(8, blue_channel_depth(mir_pixel_format_xbgr_8888));
50 EXPECT_EQ(8, blue_channel_depth(mir_pixel_format_bgr_888));
51 EXPECT_EQ(8, blue_channel_depth(mir_pixel_format_xrgb_8888));
52 EXPECT_EQ(8, blue_channel_depth(mir_pixel_format_xbgr_8888));
53 EXPECT_EQ(8, blue_channel_depth(mir_pixel_format_argb_8888));
54 EXPECT_EQ(8, blue_channel_depth(mir_pixel_format_abgr_8888));
55 EXPECT_EQ(0, blue_channel_depth(mir_pixel_format_invalid));
56}
57
58TEST(MirPixelFormatUtils, green_channel_depths)
59{
60 EXPECT_EQ(8, green_channel_depth(mir_pixel_format_xbgr_8888));
61 EXPECT_EQ(8, green_channel_depth(mir_pixel_format_bgr_888));
62 EXPECT_EQ(8, green_channel_depth(mir_pixel_format_xrgb_8888));
63 EXPECT_EQ(8, green_channel_depth(mir_pixel_format_xbgr_8888));
64 EXPECT_EQ(8, green_channel_depth(mir_pixel_format_argb_8888));
65 EXPECT_EQ(8, green_channel_depth(mir_pixel_format_abgr_8888));
66 EXPECT_EQ(0, green_channel_depth(mir_pixel_format_invalid));
67}
68
69
70TEST(MirPixelFormatUtils, alpha_channel_depths)
71{
72 EXPECT_EQ(0, alpha_channel_depth(mir_pixel_format_xbgr_8888));
73 EXPECT_EQ(0, alpha_channel_depth(mir_pixel_format_bgr_888));
74 EXPECT_EQ(0, alpha_channel_depth(mir_pixel_format_xrgb_8888));
75 EXPECT_EQ(0, alpha_channel_depth(mir_pixel_format_xbgr_8888));
76 EXPECT_EQ(8, alpha_channel_depth(mir_pixel_format_argb_8888));
77 EXPECT_EQ(8, alpha_channel_depth(mir_pixel_format_abgr_8888));
78 EXPECT_EQ(0, alpha_channel_depth(mir_pixel_format_invalid));
79}
80
81TEST(MirPixelFormatUtils, valid_mir_pixel_format)
82{
83 EXPECT_TRUE(valid_mir_pixel_format(mir_pixel_format_xbgr_8888));
84 EXPECT_TRUE(valid_mir_pixel_format(mir_pixel_format_bgr_888));
85 EXPECT_TRUE(valid_mir_pixel_format(mir_pixel_format_xrgb_8888));
86 EXPECT_TRUE(valid_mir_pixel_format(mir_pixel_format_xbgr_8888));
87 EXPECT_TRUE(valid_mir_pixel_format(mir_pixel_format_argb_8888));
88 EXPECT_TRUE(valid_mir_pixel_format(mir_pixel_format_abgr_8888));
89 EXPECT_FALSE(valid_mir_pixel_format(mir_pixel_format_invalid));
90}

Subscribers

People subscribed via source and target branches