Mir

Merge lp:~kdub/mir/no-display-attribs into lp:mir

Proposed by Kevin DuBois
Status: Merged
Approved by: Alan Griffiths
Approved revision: no longer in the source branch.
Merged at revision: 2446
Proposed branch: lp:~kdub/mir/no-display-attribs
Merge into: lp:mir
Diff against target: 979 lines (+239/-201)
18 files modified
src/platforms/android/server/display.cpp (+12/-14)
src/platforms/android/server/display.h (+0/-2)
src/platforms/android/server/display_component_factory.h (+2/-2)
src/platforms/android/server/display_configuration.cpp (+8/-54)
src/platforms/android/server/display_configuration.h (+2/-2)
src/platforms/android/server/fb_device.cpp (+19/-11)
src/platforms/android/server/fb_device.h (+1/-1)
src/platforms/android/server/hal_component_factory.cpp (+8/-5)
src/platforms/android/server/hal_component_factory.h (+4/-1)
src/platforms/android/server/hwc_blanking_control.cpp (+49/-10)
src/platforms/android/server/hwc_configuration.h (+2/-13)
tests/include/mir_test_doubles/stub_display_builder.h (+13/-14)
tests/include/mir_test_doubles/stub_display_configuration.h (+32/-0)
tests/unit-tests/graphics/android/test_display.cpp (+38/-36)
tests/unit-tests/graphics/android/test_display_hotplug.cpp (+6/-5)
tests/unit-tests/graphics/android/test_fb_device.cpp (+3/-13)
tests/unit-tests/graphics/android/test_hwc_configuration.cpp (+20/-18)
tests/unit-tests/graphics/android/test_output_builder.cpp (+20/-0)
To merge this branch: bzr merge lp:~kdub/mir/no-display-attribs
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Alexandros Frantzis (community) Approve
Alan Griffiths Approve
Review via email: mp+253853@code.launchpad.net

Commit message

android: remove the DisplayAttribs struct, which was just a subset of the information contained in DisplayConfigurationOutput, and required additional conversion steps that aren't needed if we just use DisplayConfigurationOutput in the first place.

Description of the change

android: remove the DisplayAttribs struct, which was just a subset of the information contained in DisplayConfigurationOutput, and required additional conversion steps that aren't needed if we just use DisplayConfigurationOutput in the first place. (nb: I think I promised to remove this back when I was landing some of the MM stuff a month ago or so)

To post a comment you must log in.
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

646 - EXPECT_FALSE(outputs[1].used);
647 + EXPECT_TRUE(outputs[1].used);

Why? It isn't clear to me why this expectation changes as a result of changing the way data is held.

review: Needs Information
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Kevin DuBois (kdub) wrote :

> 646 - EXPECT_FALSE(outputs[1].used);
> 647 + EXPECT_TRUE(outputs[1].used);
>
> Why? It isn't clear to me why this expectation changes as a result of changing
> the way data is held.

Launchpad lost my comment yesterday...
It is a correction of incorrect behavior. The external monitor was always reported as not used (even when on and used), which I noticed while going through and fixing things up to remove the DisplayAttribs struct.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

> > 646 - EXPECT_FALSE(outputs[1].used);
> > 647 + EXPECT_TRUE(outputs[1].used);
> >
> > Why? It isn't clear to me why this expectation changes as a result of
> changing
> > the way data is held.
>
> Launchpad lost my comment yesterday...
> It is a correction of incorrect behavior. The external monitor was always
> reported as not used (even when on and used), which I noticed while going
> through and fixing things up to remove the DisplayAttribs struct.

OK

review: Approve
Revision history for this message
Kevin DuBois (kdub) wrote :

failure was in nested server+clang, not related

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

lp:1430000 strikes again.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Alexandros Frantzis (afrantzis) wrote :

Looks good.

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Kevin DuBois (kdub) wrote :

mako failed to restart:
subprocess.CalledProcessError: Command 'phablet-network --skip-setup' returned non-zero exit status 124

run 1280 seemed to pass, retriggering

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :
Revision history for this message
PS Jenkins bot (ps-jenkins) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/platforms/android/server/display.cpp'
--- src/platforms/android/server/display.cpp 2015-03-24 16:02:48 +0000
+++ src/platforms/android/server/display.cpp 2015-03-24 19:59:11 +0000
@@ -107,14 +107,14 @@
107 std::shared_ptr<mga::DisplayDevice> const& display_device,107 std::shared_ptr<mga::DisplayDevice> const& display_device,
108 mga::DisplayName name,108 mga::DisplayName name,
109 mga::DisplayComponentFactory& display_buffer_builder,109 mga::DisplayComponentFactory& display_buffer_builder,
110 mga::DisplayAttribs const& attribs,110 mg::DisplayConfigurationOutput const& config,
111 std::shared_ptr<mg::GLProgramFactory> const& gl_program_factory,111 std::shared_ptr<mg::GLProgramFactory> const& gl_program_factory,
112 mga::PbufferGLContext const& gl_context,112 mga::PbufferGLContext const& gl_context,
113 mga::OverlayOptimization overlay_option)113 mga::OverlayOptimization overlay_option)
114{114{
115 std::shared_ptr<mga::FramebufferBundle> fbs{display_buffer_builder.create_framebuffers(attribs)};115 std::shared_ptr<mga::FramebufferBundle> fbs{display_buffer_builder.create_framebuffers(config)};
116 auto cache = std::make_shared<mga::InterpreterCache>();116 auto cache = std::make_shared<mga::InterpreterCache>();
117 auto interpreter = std::make_shared<mga::ServerRenderWindow>(fbs, attribs.display_format, cache);117 auto interpreter = std::make_shared<mga::ServerRenderWindow>(fbs, config.current_format, cache);
118 auto native_window = std::make_shared<mga::MirNativeWindow>(interpreter);118 auto native_window = std::make_shared<mga::MirNativeWindow>(interpreter);
119 return std::unique_ptr<mga::ConfigurableDisplayBuffer>(new mga::DisplayBuffer(119 return std::unique_ptr<mga::ConfigurableDisplayBuffer>(new mga::DisplayBuffer(
120 name,120 name,
@@ -141,12 +141,10 @@
141 hotplug_subscription{hwc_config->subscribe_to_config_changes(141 hotplug_subscription{hwc_config->subscribe_to_config_changes(
142 std::bind(&mga::Display::on_hotplug, this),142 std::bind(&mga::Display::on_hotplug, this),
143 std::bind(&mga::Display::on_vsync, this, std::placeholders::_1))},143 std::bind(&mga::Display::on_vsync, this, std::placeholders::_1))},
144 primary_attribs(hwc_config->active_attribs_for(mga::DisplayName::primary)),
145 external_attribs(hwc_config->active_attribs_for(mga::DisplayName::external)),
146 config(144 config(
147 primary_attribs,145 hwc_config->active_config_for(mga::DisplayName::primary),
148 mir_power_mode_off,146 mir_power_mode_off,
149 external_attribs,147 hwc_config->active_config_for(mga::DisplayName::external),
150 mir_power_mode_off),148 mir_power_mode_off),
151 gl_context{config.primary().current_format, *gl_config, *display_report},149 gl_context{config.primary().current_format, *gl_config, *display_report},
152 display_device(display_buffer_builder->create_display_device()),150 display_device(display_buffer_builder->create_display_device()),
@@ -158,7 +156,7 @@
158 display_device,156 display_device,
159 mga::DisplayName::primary,157 mga::DisplayName::primary,
160 *display_buffer_builder,158 *display_buffer_builder,
161 primary_attribs,159 config.primary(),
162 gl_program_factory,160 gl_program_factory,
163 gl_context,161 gl_context,
164 overlay_option))162 overlay_option))
@@ -173,7 +171,7 @@
173 display_device,171 display_device,
174 mga::DisplayName::external,172 mga::DisplayName::external,
175 *display_buffer_builder,173 *display_buffer_builder,
176 external_attribs,174 config.external(),
177 gl_program_factory,175 gl_program_factory,
178 gl_context,176 gl_context,
179 mga::OverlayOptimization::disabled));177 mga::OverlayOptimization::disabled));
@@ -196,16 +194,16 @@
196{194{
197 if (configuration_dirty)195 if (configuration_dirty)
198 {196 {
199 external_attribs = hwc_config->active_attribs_for(mga::DisplayName::external);197 auto external_config = hwc_config->active_config_for(mga::DisplayName::external);
200 if (external_attribs.connected)198 if (external_config.connected)
201 power_mode(mga::DisplayName::external, *hwc_config, config.external(), mir_power_mode_on);199 power_mode(mga::DisplayName::external, *hwc_config, config.external(), mir_power_mode_on);
202 else200 else
203 config.external().power_mode = mir_power_mode_off;201 config.external().power_mode = mir_power_mode_off;
204202
205 config = mga::DisplayConfiguration(203 config = mga::DisplayConfiguration(
206 hwc_config->active_attribs_for(mga::DisplayName::primary),204 hwc_config->active_config_for(mga::DisplayName::primary),
207 config.primary().power_mode,205 config.primary().power_mode,
208 external_attribs,206 std::move(external_config),
209 config.external().power_mode);207 config.external().power_mode);
210 configuration_dirty = false;208 configuration_dirty = false;
211 }209 }
@@ -221,7 +219,7 @@
221 display_device,219 display_device,
222 mga::DisplayName::external,220 mga::DisplayName::external,
223 *display_buffer_builder,221 *display_buffer_builder,
224 external_attribs,222 config.external(),
225 gl_program_factory,223 gl_program_factory,
226 gl_context,224 gl_context,
227 mga::OverlayOptimization::disabled));225 mga::OverlayOptimization::disabled));
228226
=== modified file 'src/platforms/android/server/display.h'
--- src/platforms/android/server/display.h 2015-03-24 16:02:48 +0000
+++ src/platforms/android/server/display.h 2015-03-24 19:59:11 +0000
@@ -88,8 +88,6 @@
88 bool mutable configuration_dirty{false};88 bool mutable configuration_dirty{false};
89 std::unique_ptr<HwcConfiguration> const hwc_config;89 std::unique_ptr<HwcConfiguration> const hwc_config;
90 ConfigChangeSubscription const hotplug_subscription;90 ConfigChangeSubscription const hotplug_subscription;
91 DisplayAttribs const primary_attribs; //TODO: could be removed, really only useful in construction
92 DisplayAttribs mutable external_attribs; //TODO: could be removed, really only useful in construction
93 DisplayConfiguration mutable config;91 DisplayConfiguration mutable config;
94 PbufferGLContext gl_context;92 PbufferGLContext gl_context;
95 std::shared_ptr<DisplayDevice> display_device;93 std::shared_ptr<DisplayDevice> display_device;
9694
=== modified file 'src/platforms/android/server/display_component_factory.h'
--- src/platforms/android/server/display_component_factory.h 2015-02-02 12:18:18 +0000
+++ src/platforms/android/server/display_component_factory.h 2015-03-24 19:59:11 +0000
@@ -27,10 +27,10 @@
27{27{
28namespace graphics28namespace graphics
29{29{
30class DisplayConfigurationOutput;
30namespace android31namespace android
31{32{
32class HwcConfiguration;33class HwcConfiguration;
33class DisplayAttribs;
3434
35//TODO: this name needs improvement.35//TODO: this name needs improvement.
36class DisplayComponentFactory36class DisplayComponentFactory
@@ -38,7 +38,7 @@
38public:38public:
39 virtual ~DisplayComponentFactory() = default;39 virtual ~DisplayComponentFactory() = default;
4040
41 virtual std::unique_ptr<FramebufferBundle> create_framebuffers(DisplayAttribs const&) = 0;41 virtual std::unique_ptr<FramebufferBundle> create_framebuffers(DisplayConfigurationOutput const&) = 0;
42 virtual std::unique_ptr<DisplayDevice> create_display_device() = 0;42 virtual std::unique_ptr<DisplayDevice> create_display_device() = 0;
43 virtual std::unique_ptr<HwcConfiguration> create_hwc_configuration() = 0;43 virtual std::unique_ptr<HwcConfiguration> create_hwc_configuration() = 0;
44 virtual std::unique_ptr<LayerList> create_layer_list() = 0;44 virtual std::unique_ptr<LayerList> create_layer_list() = 0;
4545
=== modified file 'src/platforms/android/server/display_configuration.cpp'
--- src/platforms/android/server/display_configuration.cpp 2015-03-24 16:02:48 +0000
+++ src/platforms/android/server/display_configuration.cpp 2015-03-24 19:59:11 +0000
@@ -25,67 +25,21 @@
25{25{
26int const primary_id{0};26int const primary_id{0};
27int const external_id{1};27int const external_id{1};
28geom::Point const origin{0,0};
29size_t const preferred_format_index{0};
30size_t const preferred_mode_index{0};
31
32mg::DisplayConfigurationOutput external_output(
33 mga::DisplayAttribs const& external_attribs,
34 MirPowerMode external_mode)
35{
36 std::vector<mg::DisplayConfigurationMode> external_modes;
37 if (external_attribs.connected)
38 {
39 external_modes.emplace_back(
40 mg::DisplayConfigurationMode{external_attribs.pixel_size, external_attribs.vrefresh_hz});
41 }
42
43 bool used{false};
44 return {
45 mg::DisplayConfigurationOutputId{external_id},
46 mg::DisplayConfigurationCardId{0},
47 mg::DisplayConfigurationOutputType::displayport,
48 {external_attribs.display_format},
49 external_modes,
50 preferred_mode_index,
51 external_attribs.mm_size,
52 external_attribs.connected,
53 used,
54 origin,
55 preferred_format_index,
56 external_attribs.display_format,
57 external_mode,
58 mir_orientation_normal
59 };
60}
61}28}
6229
63mga::DisplayConfiguration::DisplayConfiguration(30mga::DisplayConfiguration::DisplayConfiguration(
64 mga::DisplayAttribs const& primary_attribs,31 mg::DisplayConfigurationOutput primary_config,
65 MirPowerMode primary_mode,32 MirPowerMode primary_mode,
66 mga::DisplayAttribs const& external_attribs,33 mg::DisplayConfigurationOutput external_config,
67 MirPowerMode external_mode) :34 MirPowerMode external_mode) :
68 configurations{{35 configurations{
69 mg::DisplayConfigurationOutput{36 {std::move(primary_config),
70 mg::DisplayConfigurationOutputId{primary_id},37 std::move(external_config)}
71 mg::DisplayConfigurationCardId{0},38 },
72 mg::DisplayConfigurationOutputType::lvds,
73 {primary_attribs.display_format},
74 {mg::DisplayConfigurationMode{primary_attribs.pixel_size, primary_attribs.vrefresh_hz}},
75 preferred_mode_index,
76 primary_attribs.mm_size,
77 primary_attribs.connected,
78 true,
79 origin,
80 preferred_format_index,
81 primary_attribs.display_format,
82 primary_mode,
83 mir_orientation_normal
84 },
85 external_output(external_attribs, external_mode)
86 }},
87 card{mg::DisplayConfigurationCardId{0}, 1}39 card{mg::DisplayConfigurationCardId{0}, 1}
88{40{
41 primary().power_mode = primary_mode;
42 external().power_mode = external_mode;
89}43}
9044
91mga::DisplayConfiguration::DisplayConfiguration(DisplayConfiguration const& other) :45mga::DisplayConfiguration::DisplayConfiguration(DisplayConfiguration const& other) :
9246
=== modified file 'src/platforms/android/server/display_configuration.h'
--- src/platforms/android/server/display_configuration.h 2015-03-24 16:02:48 +0000
+++ src/platforms/android/server/display_configuration.h 2015-03-24 19:59:11 +0000
@@ -31,9 +31,9 @@
31class DisplayConfiguration : public graphics::DisplayConfiguration31class DisplayConfiguration : public graphics::DisplayConfiguration
32{32{
33public:33public:
34 DisplayConfiguration(DisplayAttribs const& primary,34 DisplayConfiguration(DisplayConfigurationOutput primary,
35 MirPowerMode primary_mode,35 MirPowerMode primary_mode,
36 DisplayAttribs const& external,36 DisplayConfigurationOutput external,
37 MirPowerMode external_mode);37 MirPowerMode external_mode);
3838
39 DisplayConfiguration(DisplayConfiguration const& other);39 DisplayConfiguration(DisplayConfiguration const& other);
4040
=== modified file 'src/platforms/android/server/fb_device.cpp'
--- src/platforms/android/server/fb_device.cpp 2015-03-24 16:02:48 +0000
+++ src/platforms/android/server/fb_device.cpp 2015-03-24 19:59:11 +0000
@@ -54,18 +54,26 @@
54 fb_device->enableScreen(fb_device.get(), enable);54 fb_device->enableScreen(fb_device.get(), enable);
55}55}
5656
57mga::DisplayAttribs mga::FbControl::active_attribs_for(DisplayName)57mg::DisplayConfigurationOutput mga::FbControl::active_config_for(DisplayName)
58{58{
59 //guarantee always 2 fb's allocated59 return {
60 auto fb_num = static_cast<unsigned int>(fb_device->numFramebuffers);60 mg::DisplayConfigurationOutputId{0},
61 fb_num = std::max(2u, fb_num);61 mg::DisplayConfigurationCardId{0},
62 return mga::DisplayAttribs{62 mg::DisplayConfigurationOutputType::lvds,
63 {fb_device->width, fb_device->height},63 std::vector<MirPixelFormat>{mga::to_mir_format(fb_device->format)},
64 {0,0},64 std::vector<mg::DisplayConfigurationMode>{
65 fb_device->fps,65 mg::DisplayConfigurationMode{{fb_device->width, fb_device->height}, fb_device->fps}
66 true,66 },
67 mga::to_mir_format(fb_device->format),67 0,
68 fb_num};68 {0,0},
69 true,
70 false,
71 {0,0},
72 0,
73 mir_pixel_format_abgr_8888,
74 mir_power_mode_on,
75 mir_orientation_normal
76 };
69}77}
7078
71mga::ConfigChangeSubscription mga::FbControl::subscribe_to_config_changes(79mga::ConfigChangeSubscription mga::FbControl::subscribe_to_config_changes(
7280
=== modified file 'src/platforms/android/server/fb_device.h'
--- src/platforms/android/server/fb_device.h 2015-03-24 16:02:48 +0000
+++ src/platforms/android/server/fb_device.h 2015-03-24 19:59:11 +0000
@@ -36,7 +36,7 @@
36public:36public:
37 FbControl(std::shared_ptr<framebuffer_device_t> const& fbdev);37 FbControl(std::shared_ptr<framebuffer_device_t> const& fbdev);
38 void power_mode(DisplayName, MirPowerMode) override;38 void power_mode(DisplayName, MirPowerMode) override;
39 DisplayAttribs active_attribs_for(DisplayName) override;39 DisplayConfigurationOutput active_config_for(DisplayName) override;
40 ConfigChangeSubscription subscribe_to_config_changes(40 ConfigChangeSubscription subscribe_to_config_changes(
41 std::function<void()> const& hotplug_cb,41 std::function<void()> const& hotplug_cb,
42 std::function<void(DisplayName)> const& vsync_cb) override;42 std::function<void(DisplayName)> const& vsync_cb) override;
4343
=== modified file 'src/platforms/android/server/hal_component_factory.cpp'
--- src/platforms/android/server/hal_component_factory.cpp 2015-03-18 19:38:43 +0000
+++ src/platforms/android/server/hal_component_factory.cpp 2015-03-24 19:59:11 +0000
@@ -47,7 +47,8 @@
47 : buffer_allocator(buffer_allocator),47 : buffer_allocator(buffer_allocator),
48 res_factory(res_factory),48 res_factory(res_factory),
49 hwc_report(hwc_report),49 hwc_report(hwc_report),
50 force_backup_display(false)50 force_backup_display(false),
51 num_framebuffers{quirks.num_framebuffers()}
51{52{
52 try53 try
53 {54 {
@@ -60,16 +61,18 @@
60 if (force_backup_display || hwc_version == mga::HwcVersion::hwc10)61 if (force_backup_display || hwc_version == mga::HwcVersion::hwc10)
61 {62 {
62 fb_native = res_factory->create_fb_native_device();63 fb_native = res_factory->create_fb_native_device();
64 //guarantee always 2 fb's allocated
65 num_framebuffers = std::max(2u, static_cast<unsigned int>(fb_native->numFramebuffers));
63 }66 }
64}67}
6568
66std::unique_ptr<mga::FramebufferBundle> mga::HalComponentFactory::create_framebuffers(mga::DisplayAttribs const& attribs)69std::unique_ptr<mga::FramebufferBundle> mga::HalComponentFactory::create_framebuffers(mg::DisplayConfigurationOutput const& config)
67{70{
68 return std::unique_ptr<mga::FramebufferBundle>(new mga::Framebuffers(71 return std::unique_ptr<mga::FramebufferBundle>(new mga::Framebuffers(
69 *buffer_allocator,72 *buffer_allocator,
70 attribs.pixel_size,73 config.modes[config.current_mode_index].size,
71 attribs.display_format,74 config.current_format,
72 attribs.num_framebuffers));75 num_framebuffers));
73}76}
7477
75std::unique_ptr<mga::LayerList> mga::HalComponentFactory::create_layer_list()78std::unique_ptr<mga::LayerList> mga::HalComponentFactory::create_layer_list()
7679
=== modified file 'src/platforms/android/server/hal_component_factory.h'
--- src/platforms/android/server/hal_component_factory.h 2015-02-02 12:18:18 +0000
+++ src/platforms/android/server/hal_component_factory.h 2015-03-24 19:59:11 +0000
@@ -21,6 +21,7 @@
2121
22#include "display_component_factory.h"22#include "display_component_factory.h"
23#include "display_resource_factory.h"23#include "display_resource_factory.h"
24#include "device_quirks.h"
2425
25namespace mir26namespace mir
26{27{
@@ -46,18 +47,20 @@
46 std::shared_ptr<DisplayResourceFactory> const& res_factory,47 std::shared_ptr<DisplayResourceFactory> const& res_factory,
47 std::shared_ptr<HwcReport> const& hwc_report);48 std::shared_ptr<HwcReport> const& hwc_report);
4849
49 std::unique_ptr<FramebufferBundle> create_framebuffers(DisplayAttribs const&) override;50 std::unique_ptr<FramebufferBundle> create_framebuffers(DisplayConfigurationOutput const&) override;
50 std::unique_ptr<DisplayDevice> create_display_device() override;51 std::unique_ptr<DisplayDevice> create_display_device() override;
51 std::unique_ptr<HwcConfiguration> create_hwc_configuration() override;52 std::unique_ptr<HwcConfiguration> create_hwc_configuration() override;
52 std::unique_ptr<LayerList> create_layer_list() override;53 std::unique_ptr<LayerList> create_layer_list() override;
5354
54private:55private:
56 DeviceQuirks quirks{PropertiesOps{}};
55 std::shared_ptr<GraphicBufferAllocator> const buffer_allocator;57 std::shared_ptr<GraphicBufferAllocator> const buffer_allocator;
56 std::shared_ptr<DisplayResourceFactory> const res_factory;58 std::shared_ptr<DisplayResourceFactory> const res_factory;
57 std::shared_ptr<HwcReport> const hwc_report;59 std::shared_ptr<HwcReport> const hwc_report;
5860
59 std::shared_ptr<FramebufferBundle> framebuffers;61 std::shared_ptr<FramebufferBundle> framebuffers;
60 bool force_backup_display;62 bool force_backup_display;
63 size_t num_framebuffers;
6164
62 std::shared_ptr<HwcWrapper> hwc_wrapper;65 std::shared_ptr<HwcWrapper> hwc_wrapper;
63 std::shared_ptr<framebuffer_device_t> fb_native;66 std::shared_ptr<framebuffer_device_t> fb_native;
6467
=== modified file 'src/platforms/android/server/hwc_blanking_control.cpp'
--- src/platforms/android/server/hwc_blanking_control.cpp 2015-03-24 16:02:48 +0000
+++ src/platforms/android/server/hwc_blanking_control.cpp 2015-03-24 19:59:11 +0000
@@ -27,6 +27,7 @@
27#include <stdexcept>27#include <stdexcept>
28#include <chrono>28#include <chrono>
2929
30namespace mg = mir::graphics;
30namespace mga = mir::graphics::android;31namespace mga = mir::graphics::android;
31namespace geom = mir::geometry;32namespace geom = mir::geometry;
3233
@@ -111,9 +112,47 @@
111 geom::Length length(pixel_num / dpi_inches, geom::Length::Units::inches);112 geom::Length length(pixel_num / dpi_inches, geom::Length::Units::inches);
112 return length.as(geom::Length::Units::millimetres);113 return length.as(geom::Length::Units::millimetres);
113}114}
114}115
115116mg::DisplayConfigurationOutput populate_config(
116mga::DisplayAttribs mga::HwcBlankingControl::active_attribs_for(DisplayName display_name)117 mga::DisplayName name,
118 geom::Size pixel_size,
119 double vrefresh_hz,
120 geom::Size mm_size,
121 MirPowerMode external_mode,
122 MirPixelFormat display_format,
123 bool connected)
124{
125 geom::Point const origin{0,0};
126 size_t const preferred_format_index{0};
127 size_t const preferred_mode_index{0};
128 std::vector<mg::DisplayConfigurationMode> external_modes;
129 if (connected)
130 external_modes.emplace_back(mg::DisplayConfigurationMode{pixel_size, vrefresh_hz});
131
132 auto type = mg::DisplayConfigurationOutputType::lvds;
133 if (name == mga::DisplayName::external)
134 type = mg::DisplayConfigurationOutputType::displayport;
135
136 return {
137 static_cast<mg::DisplayConfigurationOutputId>(name),
138 mg::DisplayConfigurationCardId{0},
139 type,
140 {display_format},
141 external_modes,
142 preferred_mode_index,
143 mm_size,
144 connected,
145 connected,
146 origin,
147 preferred_format_index,
148 display_format,
149 external_mode,
150 mir_orientation_normal
151 };
152}
153}
154
155mg::DisplayConfigurationOutput mga::HwcBlankingControl::active_config_for(DisplayName display_name)
117{156{
118 auto configs = hwc_device->display_configs(display_name);157 auto configs = hwc_device->display_configs(display_name);
119 if (configs.empty())158 if (configs.empty())
@@ -121,7 +160,7 @@
121 if (display_name == mga::DisplayName::primary)160 if (display_name == mga::DisplayName::primary)
122 BOOST_THROW_EXCEPTION(std::runtime_error("primary display disconnected"));161 BOOST_THROW_EXCEPTION(std::runtime_error("primary display disconnected"));
123 else 162 else
124 return {{}, {}, 0.0, false, format, quirks.num_framebuffers()};163 return populate_config(display_name, {0,0}, 0.0f, {0,0}, mir_power_mode_off, mir_pixel_format_invalid, false);
125 }164 }
126165
127 /* note: some drivers (qcom msm8960) choke if this is not the same size array166 /* note: some drivers (qcom msm8960) choke if this is not the same size array
@@ -145,17 +184,17 @@
145 if (display_name == mga::DisplayName::primary)184 if (display_name == mga::DisplayName::primary)
146 BOOST_THROW_EXCEPTION(std::runtime_error("primary display disconnected"));185 BOOST_THROW_EXCEPTION(std::runtime_error("primary display disconnected"));
147 else 186 else
148 return {{}, {}, 0.0, false, format, quirks.num_framebuffers()};187 return populate_config(display_name, {0,0}, 0.0f, {0,0}, mir_power_mode_off, mir_pixel_format_invalid, false);
149 }188 }
150189
151 return {190 return populate_config(
191 display_name,
152 {values[0], values[1]},192 {values[0], values[1]},
193 period_to_hz(std::chrono::nanoseconds{values[2]}),
153 {dpi_to_mm(values[3], values[0]), dpi_to_mm(values[4], values[1])},194 {dpi_to_mm(values[3], values[0]), dpi_to_mm(values[4], values[1])},
154 period_to_hz(std::chrono::nanoseconds{values[2]}),195 mir_power_mode_off,
155 true,
156 format,196 format,
157 quirks.num_framebuffers()197 true);
158 };
159}198}
160199
161mga::ConfigChangeSubscription mga::HwcBlankingControl::subscribe_to_config_changes(200mga::ConfigChangeSubscription mga::HwcBlankingControl::subscribe_to_config_changes(
162201
=== modified file 'src/platforms/android/server/hwc_configuration.h'
--- src/platforms/android/server/hwc_configuration.h 2015-03-24 16:02:48 +0000
+++ src/platforms/android/server/hwc_configuration.h 2015-03-24 19:59:11 +0000
@@ -22,7 +22,6 @@
22#include "mir/graphics/display_configuration.h"22#include "mir/graphics/display_configuration.h"
23#include "mir/geometry/size.h"23#include "mir/geometry/size.h"
24#include "display_name.h"24#include "display_name.h"
25#include "device_quirks.h"
26#include <memory>25#include <memory>
27#include <functional>26#include <functional>
2827
@@ -32,15 +31,6 @@
32{31{
33namespace android32namespace android
34{33{
35struct DisplayAttribs
36{
37 geometry::Size pixel_size;
38 geometry::Size mm_size;
39 double vrefresh_hz;
40 bool connected;
41 MirPixelFormat display_format;
42 size_t num_framebuffers;
43};
4434
45using ConfigChangeSubscription = std::shared_ptr<void>;35using ConfigChangeSubscription = std::shared_ptr<void>;
46//interface adapting for the blanking interface differences between fb, HWC 1.0-1.3, and HWC 1.4+36//interface adapting for the blanking interface differences between fb, HWC 1.0-1.3, and HWC 1.4+
@@ -49,7 +39,7 @@
49public:39public:
50 virtual ~HwcConfiguration() = default;40 virtual ~HwcConfiguration() = default;
51 virtual void power_mode(DisplayName, MirPowerMode) = 0;41 virtual void power_mode(DisplayName, MirPowerMode) = 0;
52 virtual DisplayAttribs active_attribs_for(DisplayName) = 0; 42 virtual DisplayConfigurationOutput active_config_for(DisplayName) = 0;
53 virtual ConfigChangeSubscription subscribe_to_config_changes(43 virtual ConfigChangeSubscription subscribe_to_config_changes(
54 std::function<void()> const& hotplug_cb,44 std::function<void()> const& hotplug_cb,
55 std::function<void(DisplayName)> const& vsync_cb) = 0;45 std::function<void(DisplayName)> const& vsync_cb) = 0;
@@ -66,13 +56,12 @@
66public:56public:
67 HwcBlankingControl(std::shared_ptr<HwcWrapper> const&);57 HwcBlankingControl(std::shared_ptr<HwcWrapper> const&);
68 void power_mode(DisplayName, MirPowerMode) override;58 void power_mode(DisplayName, MirPowerMode) override;
69 DisplayAttribs active_attribs_for(DisplayName) override;59 DisplayConfigurationOutput active_config_for(DisplayName) override;
70 ConfigChangeSubscription subscribe_to_config_changes(60 ConfigChangeSubscription subscribe_to_config_changes(
71 std::function<void()> const& hotplug_cb,61 std::function<void()> const& hotplug_cb,
72 std::function<void(DisplayName)> const& vsync_cb) override;62 std::function<void(DisplayName)> const& vsync_cb) override;
7363
74private:64private:
75 DeviceQuirks quirks{PropertiesOps{}};
76 std::shared_ptr<HwcWrapper> const hwc_device;65 std::shared_ptr<HwcWrapper> const hwc_device;
77 bool off;66 bool off;
78 MirPixelFormat format;67 MirPixelFormat format;
7968
=== modified file 'tests/include/mir_test_doubles/stub_display_builder.h'
--- tests/include/mir_test_doubles/stub_display_builder.h 2015-03-24 16:02:48 +0000
+++ tests/include/mir_test_doubles/stub_display_builder.h 2015-03-24 19:59:11 +0000
@@ -23,6 +23,7 @@
23#include "src/platforms/android/server/display_component_factory.h"23#include "src/platforms/android/server/display_component_factory.h"
24#include "src/platforms/android/server/configurable_display_buffer.h"24#include "src/platforms/android/server/configurable_display_buffer.h"
25#include "src/platforms/android/server/hwc_configuration.h"25#include "src/platforms/android/server/hwc_configuration.h"
26#include "stub_display_configuration.h"
26#include "mock_display_device.h"27#include "mock_display_device.h"
27#include <gmock/gmock.h>28#include <gmock/gmock.h>
2829
@@ -45,16 +46,15 @@
45 MockHwcConfiguration()46 MockHwcConfiguration()
46 {47 {
47 using namespace testing;48 using namespace testing;
49 StubDisplayConfig config({{true, true}, {false, false}});
48 ON_CALL(*this, subscribe_to_config_changes(_,_)).WillByDefault(Return(nullptr));50 ON_CALL(*this, subscribe_to_config_changes(_,_)).WillByDefault(Return(nullptr));
49 ON_CALL(*this, active_attribs_for(graphics::android::DisplayName::primary))51 ON_CALL(*this, active_config_for(graphics::android::DisplayName::primary))
50 .WillByDefault(testing::Return(graphics::android::DisplayAttribs{52 .WillByDefault(testing::Return(config.outputs[0]));
51 {0,0},{0,0}, 0.0, true, mir_pixel_format_abgr_8888, 2}));53 ON_CALL(*this, active_config_for(graphics::android::DisplayName::external))
52 ON_CALL(*this, active_attribs_for(graphics::android::DisplayName::external))54 .WillByDefault(testing::Return(config.outputs[1]));
53 .WillByDefault(testing::Return(graphics::android::DisplayAttribs{
54 {0,0},{0,0}, 0.0, false, mir_pixel_format_abgr_8888, 2}));
55 }55 }
56 MOCK_METHOD2(power_mode, void(graphics::android::DisplayName, MirPowerMode));56 MOCK_METHOD2(power_mode, void(graphics::android::DisplayName, MirPowerMode));
57 MOCK_METHOD1(active_attribs_for, graphics::android::DisplayAttribs(graphics::android::DisplayName));57 MOCK_METHOD1(active_config_for, graphics::DisplayConfigurationOutput(graphics::android::DisplayName));
58 MOCK_METHOD2(subscribe_to_config_changes,58 MOCK_METHOD2(subscribe_to_config_changes,
59 graphics::android::ConfigChangeSubscription(59 graphics::android::ConfigChangeSubscription(
60 std::function<void()> const&, std::function<void(graphics::android::DisplayName)> const&));60 std::function<void()> const&, std::function<void(graphics::android::DisplayName)> const&));
@@ -66,14 +66,13 @@
66 {66 {
67 }67 }
6868
69 graphics::android::DisplayAttribs active_attribs_for(graphics::android::DisplayName name) override69 graphics::DisplayConfigurationOutput active_config_for(graphics::android::DisplayName name) override
70 {70 {
71 if (name == graphics::android::DisplayName::external)71 bool connected{name == graphics::android::DisplayName::primary};
72 return graphics::android::DisplayAttribs{{20,20}, {4,4}, 50.0f, false, mir_pixel_format_abgr_8888, 2};72 auto config = StubDisplayConfig({{connected, connected}}).outputs[0];
73 else73 config.id = static_cast<graphics::DisplayConfigurationOutputId>(name);
74 return graphics::android::DisplayAttribs{{20,20}, {4,4}, 350.0f, true, mir_pixel_format_abgr_8888, 2};74 return config;
75 }75 }
76
77 76
78 graphics::android::ConfigChangeSubscription subscribe_to_config_changes(77 graphics::android::ConfigChangeSubscription subscribe_to_config_changes(
79 std::function<void()> const&, std::function<void(graphics::android::DisplayName)> const&) override78 std::function<void()> const&, std::function<void(graphics::android::DisplayName)> const&) override
@@ -101,7 +100,7 @@
101 new graphics::android::LayerList(std::make_shared<graphics::android::IntegerSourceCrop>(), {}));100 new graphics::android::LayerList(std::make_shared<graphics::android::IntegerSourceCrop>(), {}));
102 }101 }
103102
104 std::unique_ptr<graphics::android::FramebufferBundle> create_framebuffers(graphics::android::DisplayAttribs const&) override103 std::unique_ptr<graphics::android::FramebufferBundle> create_framebuffers(graphics::DisplayConfigurationOutput const&) override
105 {104 {
106 return std::unique_ptr<graphics::android::FramebufferBundle>(new StubFramebufferBundle());105 return std::unique_ptr<graphics::android::FramebufferBundle>(new StubFramebufferBundle());
107 }106 }
108107
=== modified file 'tests/include/mir_test_doubles/stub_display_configuration.h'
--- tests/include/mir_test_doubles/stub_display_configuration.h 2015-03-24 16:02:48 +0000
+++ tests/include/mir_test_doubles/stub_display_configuration.h 2015-03-24 19:59:11 +0000
@@ -32,6 +32,36 @@
32namespace doubles32namespace doubles
33{33{
3434
35struct StubDisplayConfigurationOutput : public graphics::DisplayConfigurationOutput
36{
37 StubDisplayConfigurationOutput(
38 geometry::Size px_size, geometry::Size mm_size, MirPixelFormat format, double vrefresh, bool connected) :
39 StubDisplayConfigurationOutput(graphics::DisplayConfigurationOutputId{0}, px_size, mm_size, format, vrefresh, connected)
40 {
41 }
42
43 StubDisplayConfigurationOutput(graphics::DisplayConfigurationOutputId id,
44 geometry::Size px_size, geometry::Size mm_size, MirPixelFormat format, double vrefresh, bool connected) :
45 DisplayConfigurationOutput{
46 id,
47 graphics::DisplayConfigurationCardId{0},
48 graphics::DisplayConfigurationOutputType::lvds,
49 {format},
50 {{px_size, vrefresh}},
51 0,
52 mm_size,
53 connected,
54 connected,
55 {0,0},
56 0,
57 format,
58 mir_power_mode_on,
59 mir_orientation_normal
60 }
61 {
62 }
63};
64
35class StubDisplayConfig : public graphics::DisplayConfiguration65class StubDisplayConfig : public graphics::DisplayConfiguration
36{66{
37public:67public:
@@ -64,6 +94,8 @@
64 {94 {
65 outputs[i].connected = connected_used[i].first;95 outputs[i].connected = connected_used[i].first;
66 outputs[i].used = connected_used[i].second;96 outputs[i].used = connected_used[i].second;
97 outputs[i].current_format = mir_pixel_format_abgr_8888;
98 outputs[i].id = graphics::DisplayConfigurationOutputId{static_cast<int>(i)};
67 }99 }
68 }100 }
69101
70102
=== modified file 'tests/unit-tests/graphics/android/test_display.cpp'
--- tests/unit-tests/graphics/android/test_display.cpp 2015-03-24 16:02:48 +0000
+++ tests/unit-tests/graphics/android/test_display.cpp 2015-03-24 19:59:11 +0000
@@ -30,6 +30,7 @@
30#include "mir_test_doubles/stub_gl_config.h"30#include "mir_test_doubles/stub_gl_config.h"
31#include "mir_test_doubles/mock_gl_config.h"31#include "mir_test_doubles/mock_gl_config.h"
32#include "mir_test_doubles/stub_gl_program_factory.h"32#include "mir_test_doubles/stub_gl_program_factory.h"
33#include "mir_test_doubles/stub_display_configuration.h"
33#include "mir/graphics/android/mir_native_window.h"34#include "mir/graphics/android/mir_native_window.h"
34#include "mir_test_doubles/stub_driver_interpreter.h"35#include "mir_test_doubles/stub_driver_interpreter.h"
3536
@@ -401,10 +402,12 @@
401402
402 stub_db_factory->with_next_config([&](mtd::MockHwcConfiguration& mock_config)403 stub_db_factory->with_next_config([&](mtd::MockHwcConfiguration& mock_config)
403 {404 {
404 ON_CALL(mock_config, active_attribs_for(mga::DisplayName::primary))405 ON_CALL(mock_config, active_config_for(mga::DisplayName::primary))
405 .WillByDefault(Return(mga::DisplayAttribs{pixel_size, physical_size, vrefresh, true, format, true}));406 .WillByDefault(Return(mtd::StubDisplayConfigurationOutput{
406 ON_CALL(mock_config, active_attribs_for(mga::DisplayName::external))407 pixel_size, physical_size, format, vrefresh, true}));
407 .WillByDefault(Return(mga::DisplayAttribs{pixel_size, physical_size, vrefresh, false, format, true}));408 ON_CALL(mock_config, active_config_for(mga::DisplayName::external))
409 .WillByDefault(Return(mtd::StubDisplayConfigurationOutput{
410 pixel_size, physical_size, format, vrefresh, false}));
408 });411 });
409412
410 mga::Display display(413 mga::Display display(
@@ -448,12 +451,12 @@
448451
449 stub_db_factory->with_next_config([&](mtd::MockHwcConfiguration& mock_config)452 stub_db_factory->with_next_config([&](mtd::MockHwcConfiguration& mock_config)
450 {453 {
451 ON_CALL(mock_config, active_attribs_for(mga::DisplayName::primary))454 ON_CALL(mock_config, active_config_for(mga::DisplayName::primary))
452 .WillByDefault(Return(455 .WillByDefault(Return(mtd::StubDisplayConfigurationOutput{
453 mga::DisplayAttribs{primary_pixel_size, primary_physical_size, primary_vrefresh, true, format, 2}));456 primary_pixel_size, primary_physical_size, format, primary_vrefresh, true}));
454 ON_CALL(mock_config, active_attribs_for(mga::DisplayName::external))457 ON_CALL(mock_config, active_config_for(mga::DisplayName::external))
455 .WillByDefault(Return(458 .WillByDefault(Return(mtd::StubDisplayConfigurationOutput{mg::DisplayConfigurationOutputId{1},
456 mga::DisplayAttribs{external_pixel_size, external_physical_size, external_vrefresh, true, format, 2}));459 external_pixel_size, external_physical_size, format, external_vrefresh, true}));
457 });460 });
458461
459 mga::Display display(462 mga::Display display(
@@ -491,7 +494,7 @@
491 EXPECT_EQ(mg::DisplayConfigurationOutputId{1}, outputs[1].id);494 EXPECT_EQ(mg::DisplayConfigurationOutputId{1}, outputs[1].id);
492 EXPECT_EQ(mg::DisplayConfigurationCardId{0}, outputs[1].card_id);495 EXPECT_EQ(mg::DisplayConfigurationCardId{0}, outputs[1].card_id);
493 EXPECT_TRUE(outputs[1].connected);496 EXPECT_TRUE(outputs[1].connected);
494 EXPECT_FALSE(outputs[1].used);497 EXPECT_TRUE(outputs[1].used);
495 EXPECT_EQ(origin, outputs[1].top_left);498 EXPECT_EQ(origin, outputs[1].top_left);
496 EXPECT_EQ(0, outputs[1].current_mode_index);499 EXPECT_EQ(0, outputs[1].current_mode_index);
497 EXPECT_EQ(external_physical_size, outputs[1].physical_size_mm);500 EXPECT_EQ(external_physical_size, outputs[1].physical_size_mm);
@@ -575,34 +578,33 @@
575 std::shared_ptr<void> subscription = std::make_shared<int>(3433);578 std::shared_ptr<void> subscription = std::make_shared<int>(3433);
576 std::function<void()> hotplug_fn = []{};579 std::function<void()> hotplug_fn = []{};
577580
578 mga::DisplayAttribs attribs1581 mtd::StubDisplayConfigurationOutput attribs1
579 {582 {
580 {33, 32},583 {33, 32},
581 {31, 35},584 {31, 35},
585 mir_pixel_format_abgr_8888,
582 0.44,586 0.44,
583 true,587 true,
584 mir_pixel_format_abgr_8888,
585 2
586 };588 };
587 mga::DisplayAttribs attribs2589 mtd::StubDisplayConfigurationOutput attribs2
588 {590 {
589 {3, 3},591 {3, 3},
590 {1, 5},592 {1, 5},
593 mir_pixel_format_abgr_8888,
591 0.5544,594 0.5544,
592 true,595 true,
593 mir_pixel_format_abgr_8888,
594 2
595 };596 };
596597
597 stub_db_factory->with_next_config([&](mtd::MockHwcConfiguration& mock_config)598 stub_db_factory->with_next_config([&](mtd::MockHwcConfiguration& mock_config)
598 {599 {
599 EXPECT_CALL(mock_config, subscribe_to_config_changes(_,_))600 EXPECT_CALL(mock_config, subscribe_to_config_changes(_,_))
600 .WillOnce(DoAll(SaveArg<0>(&hotplug_fn), Return(subscription)));601 .WillOnce(DoAll(SaveArg<0>(&hotplug_fn), Return(subscription)));
601 EXPECT_CALL(mock_config, active_attribs_for(mga::DisplayName::primary))602
603 EXPECT_CALL(mock_config, active_config_for(mga::DisplayName::primary))
602 .Times(2)604 .Times(2)
603 .WillOnce(testing::Return(attribs1))605 .WillOnce(testing::Return(attribs1))
604 .WillOnce(testing::Return(attribs2));606 .WillOnce(testing::Return(attribs2));
605 EXPECT_CALL(mock_config, active_attribs_for(mga::DisplayName::external))607 EXPECT_CALL(mock_config, active_config_for(mga::DisplayName::external))
606 .Times(2)608 .Times(2)
607 .WillOnce(testing::Return(attribs1))609 .WillOnce(testing::Return(attribs1))
608 .WillOnce(testing::Return(attribs2));610 .WillOnce(testing::Return(attribs2));
@@ -617,14 +619,14 @@
617619
618 auto config = display.configuration();620 auto config = display.configuration();
619 config->for_each_output([&](mg::UserDisplayConfigurationOutput const& c){621 config->for_each_output([&](mg::UserDisplayConfigurationOutput const& c){
620 EXPECT_THAT(c.modes[c.current_mode_index].size, Eq(attribs1.pixel_size));622 EXPECT_THAT(c.modes[c.current_mode_index].size, Eq(attribs1.modes[attribs1.current_mode_index].size));
621 });623 });
622624
623 hotplug_fn();625 hotplug_fn();
624 config = display.configuration();626 config = display.configuration();
625 config = display.configuration();627 config = display.configuration();
626 config->for_each_output([&](mg::UserDisplayConfigurationOutput const& c){628 config->for_each_output([&](mg::UserDisplayConfigurationOutput const& c){
627 EXPECT_THAT(c.modes[c.current_mode_index].size, Eq(attribs2.pixel_size));629 EXPECT_THAT(c.modes[c.current_mode_index].size, Eq(attribs2.modes[attribs2.current_mode_index].size));
628 });630 });
629}631}
630632
@@ -635,15 +637,15 @@
635 bool external_connected = true;637 bool external_connected = true;
636 stub_db_factory->with_next_config([&](mtd::MockHwcConfiguration& mock_config)638 stub_db_factory->with_next_config([&](mtd::MockHwcConfiguration& mock_config)
637 {639 {
638 ON_CALL(mock_config, active_attribs_for(mga::DisplayName::primary))640 ON_CALL(mock_config, active_config_for(mga::DisplayName::primary))
639 .WillByDefault(Return(641 .WillByDefault(Return(mtd::StubDisplayConfigurationOutput{
640 mga::DisplayAttribs{{20,20}, {4,4}, 50.0f, true, mir_pixel_format_abgr_8888, 2}));642 mg::DisplayConfigurationOutputId{0}, {20,20}, {4,4}, mir_pixel_format_abgr_8888, 50.0f, true}));
641643
642 ON_CALL(mock_config, active_attribs_for(mga::DisplayName::external))644 ON_CALL(mock_config, active_config_for(mga::DisplayName::external))
643 .WillByDefault(Invoke([&](mga::DisplayName)645 .WillByDefault(Invoke([&](mga::DisplayName)
644 {646 {
645 return mga::DisplayAttribs{647 return mtd::StubDisplayConfigurationOutput{mg::DisplayConfigurationOutputId{1},
646 {20,20}, {4,4}, 50.0f, external_connected, mir_pixel_format_abgr_8888, 2};648 {20,20}, {4,4}, mir_pixel_format_abgr_8888, 50.0f, external_connected};
647 }));649 }));
648 EXPECT_CALL(mock_config, subscribe_to_config_changes(_,_))650 EXPECT_CALL(mock_config, subscribe_to_config_changes(_,_))
649 .WillOnce(DoAll(SaveArg<0>(&hotplug_fn), Return(std::make_shared<char>('2'))));651 .WillOnce(DoAll(SaveArg<0>(&hotplug_fn), Return(std::make_shared<char>('2'))));
@@ -696,14 +698,14 @@
696 {698 {
697 EXPECT_CALL(mock_config, subscribe_to_config_changes(_,_))699 EXPECT_CALL(mock_config, subscribe_to_config_changes(_,_))
698 .WillOnce(DoAll(SaveArg<0>(&hotplug_fn), Return(std::make_shared<char>('2'))));700 .WillOnce(DoAll(SaveArg<0>(&hotplug_fn), Return(std::make_shared<char>('2'))));
699 ON_CALL(mock_config, active_attribs_for(mga::DisplayName::primary))701 ON_CALL(mock_config, active_config_for(mga::DisplayName::primary))
700 .WillByDefault(Return(702 .WillByDefault(Return(mtd::StubDisplayConfigurationOutput{
701 mga::DisplayAttribs{{20,20}, {4,4}, 50.0f, true, mir_pixel_format_abgr_8888, 2}));703 {20,20}, {4,4}, mir_pixel_format_abgr_8888, 50.0f, true}));
702 ON_CALL(mock_config, active_attribs_for(mga::DisplayName::external))704 ON_CALL(mock_config, active_config_for(mga::DisplayName::external))
703 .WillByDefault(Invoke([&](mga::DisplayName)705 .WillByDefault(Invoke([&](mga::DisplayName)
704 {706 {
705 return mga::DisplayAttribs{707 return mtd::StubDisplayConfigurationOutput{
706 {20,20}, {4,4}, 50.0f, external_connected, mir_pixel_format_abgr_8888, 2};708 {20,20}, {4,4}, mir_pixel_format_abgr_8888, 50.0f, external_connected};
707 }));709 }));
708710
709711
@@ -738,9 +740,9 @@
738 using namespace testing;740 using namespace testing;
739 stub_db_factory->with_next_config([&](mtd::MockHwcConfiguration& mock_config)741 stub_db_factory->with_next_config([&](mtd::MockHwcConfiguration& mock_config)
740 {742 {
741 ON_CALL(mock_config, active_attribs_for(mga::DisplayName::external))743 ON_CALL(mock_config, active_config_for(mga::DisplayName::external))
742 .WillByDefault(Return(mga::DisplayAttribs{744 .WillByDefault(Return(mtd::StubDisplayConfigurationOutput{
743 {0,0},{0,0}, 0.0, true, mir_pixel_format_abgr_8888, 2}));745 mg::DisplayConfigurationOutputId{1}, {0,0}, {0,0}, mir_pixel_format_abgr_8888, 0.0, true}));
744 EXPECT_CALL(mock_config, power_mode(mga::DisplayName::primary, _))746 EXPECT_CALL(mock_config, power_mode(mga::DisplayName::primary, _))
745 .Times(AnyNumber());747 .Times(AnyNumber());
746 InSequence seq;748 InSequence seq;
747749
=== modified file 'tests/unit-tests/graphics/android/test_display_hotplug.cpp'
--- tests/unit-tests/graphics/android/test_display_hotplug.cpp 2015-03-24 16:02:48 +0000
+++ tests/unit-tests/graphics/android/test_display_hotplug.cpp 2015-03-24 19:59:11 +0000
@@ -26,6 +26,7 @@
26#include "mir_test_doubles/mock_display_device.h"26#include "mir_test_doubles/mock_display_device.h"
27#include "mir_test_doubles/mock_framebuffer_bundle.h"27#include "mir_test_doubles/mock_framebuffer_bundle.h"
28#include "mir_test_doubles/stub_gl_config.h"28#include "mir_test_doubles/stub_gl_config.h"
29#include "mir_test_doubles/stub_display_configuration.h"
29#include "mir_test_doubles/mock_egl.h"30#include "mir_test_doubles/mock_egl.h"
30#include "mir_test_doubles/mock_gl.h"31#include "mir_test_doubles/mock_gl.h"
31#include "mir_test/auto_unblock_thread.h"32#include "mir_test/auto_unblock_thread.h"
@@ -42,9 +43,9 @@
42 struct StubHwcConfig : public mga::HwcConfiguration43 struct StubHwcConfig : public mga::HwcConfiguration
43 {44 {
44 void power_mode(mga::DisplayName, MirPowerMode) override {}45 void power_mode(mga::DisplayName, MirPowerMode) override {}
45 mga::DisplayAttribs active_attribs_for(mga::DisplayName) override46 mg::DisplayConfigurationOutput active_config_for(mga::DisplayName) override
46 {47 {
47 return mga::DisplayAttribs{{0,0}, {0,0}, 0.0, true, mir_pixel_format_abgr_8888, 2};48 return mtd::StubDisplayConfig({{true,true}}).outputs[0];
48 } 49 }
49 mga::ConfigChangeSubscription subscribe_to_config_changes(50 mga::ConfigChangeSubscription subscribe_to_config_changes(
50 std::function<void()> const& cb, std::function<void(mga::DisplayName)> const&) override51 std::function<void()> const& cb, std::function<void(mga::DisplayName)> const&) override
@@ -67,9 +68,9 @@
67 {68 {
68 wrapped.power_mode(d, m);69 wrapped.power_mode(d, m);
69 }70 }
70 mga::DisplayAttribs active_attribs_for(mga::DisplayName d) override71 mg::DisplayConfigurationOutput active_config_for(mga::DisplayName d) override
71 {72 {
72 return wrapped.active_attribs_for(d);73 return wrapped.active_config_for(d);
73 } 74 }
74 mga::ConfigChangeSubscription subscribe_to_config_changes(75 mga::ConfigChangeSubscription subscribe_to_config_changes(
75 std::function<void()> const& hotplug, std::function<void(mga::DisplayName)> const& vsync) override76 std::function<void()> const& hotplug, std::function<void(mga::DisplayName)> const& vsync) override
@@ -81,7 +82,7 @@
8182
82 struct StubOutputBuilder : public mga::DisplayComponentFactory83 struct StubOutputBuilder : public mga::DisplayComponentFactory
83 {84 {
84 std::unique_ptr<mga::FramebufferBundle> create_framebuffers(mga::DisplayAttribs const&) override85 std::unique_ptr<mga::FramebufferBundle> create_framebuffers(mg::DisplayConfigurationOutput const&) override
85 {86 {
86 return std::unique_ptr<mga::FramebufferBundle>(new testing::NiceMock<mtd::MockFBBundle>());87 return std::unique_ptr<mga::FramebufferBundle>(new testing::NiceMock<mtd::MockFBBundle>());
87 }88 }
8889
=== modified file 'tests/unit-tests/graphics/android/test_fb_device.cpp'
--- tests/unit-tests/graphics/android/test_fb_device.cpp 2015-03-24 16:02:48 +0000
+++ tests/unit-tests/graphics/android/test_fb_device.cpp 2015-03-24 19:59:11 +0000
@@ -139,17 +139,7 @@
139{139{
140 using namespace testing;140 using namespace testing;
141 mga::FbControl fb_control(fb_hal_mock);141 mga::FbControl fb_control(fb_hal_mock);
142 auto attribs = fb_control.active_attribs_for(mga::DisplayName::primary);142 auto attribs = fb_control.active_config_for(mga::DisplayName::primary);
143 EXPECT_EQ(display_size, attribs.pixel_size);143 EXPECT_EQ(display_size, attribs.modes[attribs.current_mode_index].size);
144 EXPECT_EQ(mir_pixel_format_abgr_8888, attribs.display_format);144 EXPECT_EQ(mir_pixel_format_abgr_8888, attribs.current_format);
145 EXPECT_EQ(fbnum, attribs.num_framebuffers);
146}
147
148//some drivers incorrectly report 0 buffers available. request 2 fbs in this case.
149TEST_F(FBDevice, determine_fbnum_always_reports_2_minimum)
150{
151 auto slightly_malformed_fb_hal_mock = std::make_shared<mtd::MockFBHalDevice>(
152 display_size.width.as_int(), display_size.height.as_int(), format, 0);
153 mga::FbControl fb_control(slightly_malformed_fb_hal_mock);
154 EXPECT_EQ(2u, fb_control.active_attribs_for(mga::DisplayName::primary).num_framebuffers);
155}145}
156146
=== modified file 'tests/unit-tests/graphics/android/test_hwc_configuration.cpp'
--- tests/unit-tests/graphics/android/test_hwc_configuration.cpp 2015-03-24 16:02:48 +0000
+++ tests/unit-tests/graphics/android/test_hwc_configuration.cpp 2015-03-24 19:59:11 +0000
@@ -68,7 +68,7 @@
68 .InSequence(seq);68 .InSequence(seq);
6969
70 mga::HwcBlankingControl hwc_config{mock_hwc_wrapper};70 mga::HwcBlankingControl hwc_config{mock_hwc_wrapper};
71 EXPECT_EQ(mir_pixel_format_argb_8888, hwc_config.active_attribs_for(mga::DisplayName::primary).display_format);71 EXPECT_EQ(mir_pixel_format_argb_8888, hwc_config.active_config_for(mga::DisplayName::primary).current_format);
72}72}
7373
74//not all hwc implementations give a hint about their framebuffer formats in their configuration.74//not all hwc implementations give a hint about their framebuffer formats in their configuration.
@@ -92,7 +92,7 @@
92 .InSequence(seq);92 .InSequence(seq);
9393
94 mga::HwcBlankingControl hwc_config{mock_hwc_wrapper};94 mga::HwcBlankingControl hwc_config{mock_hwc_wrapper};
95 EXPECT_EQ(mir_pixel_format_abgr_8888, hwc_config.active_attribs_for(mga::DisplayName::primary).display_format);95 EXPECT_EQ(mir_pixel_format_abgr_8888, hwc_config.active_config_for(mga::DisplayName::primary).current_format);
96}96}
9797
98TEST_F(HwcConfiguration, turns_screen_on)98TEST_F(HwcConfiguration, turns_screen_on)
@@ -173,11 +173,13 @@
173 }));173 }));
174174
175 auto vrefresh_hz = 1000.0 / vrefresh_period.count();175 auto vrefresh_hz = 1000.0 / vrefresh_period.count();
176 auto attribs = config.active_attribs_for(display);176 auto attribs = config.active_config_for(display);
177 EXPECT_THAT(attribs.pixel_size, Eq(px_size));177 ASSERT_THAT(attribs.modes.size(), Eq(1));
178 EXPECT_THAT(attribs.mm_size, Eq(mm_size));178 EXPECT_THAT(attribs.modes[0].size, Eq(px_size));
179 EXPECT_THAT(attribs.vrefresh_hz, Eq(vrefresh_hz));179 EXPECT_THAT(attribs.modes[0].vrefresh_hz, Eq(vrefresh_hz));
180 EXPECT_THAT(attribs.physical_size_mm, Eq(mm_size));
180 EXPECT_TRUE(attribs.connected);181 EXPECT_TRUE(attribs.connected);
182 EXPECT_TRUE(attribs.used);
181}183}
182184
183//the primary display should not be disconnected, but this is how to tell if the external one is185//the primary display should not be disconnected, but this is how to tell if the external one is
@@ -188,12 +190,12 @@
188 .WillByDefault(Return(std::vector<mga::ConfigId>{}));190 .WillByDefault(Return(std::vector<mga::ConfigId>{}));
189191
190 EXPECT_THROW({192 EXPECT_THROW({
191 config.active_attribs_for(mga::DisplayName::primary);193 config.active_config_for(mga::DisplayName::primary);
192 }, std::runtime_error);194 }, std::runtime_error);
193 auto external_attribs = config.active_attribs_for(mga::DisplayName::external);195 auto external_attribs = config.active_config_for(mga::DisplayName::external);
194 EXPECT_THAT(external_attribs.pixel_size, Eq(geom::Size{0,0}));196 EXPECT_THAT(external_attribs.modes.size(), Eq(0));
195 EXPECT_THAT(external_attribs.vrefresh_hz, Eq(0.0));
196 EXPECT_FALSE(external_attribs.connected);197 EXPECT_FALSE(external_attribs.connected);
198 EXPECT_FALSE(external_attribs.used);
197}199}
198200
199//some devices (bq) only report an error later in the display attributes call, make sure to report disconnected on error to this call. 201//some devices (bq) only report an error later in the display attributes call, make sure to report disconnected on error to this call.
@@ -204,12 +206,12 @@
204 .WillByDefault(Return(-22));206 .WillByDefault(Return(-22));
205207
206 EXPECT_THROW({208 EXPECT_THROW({
207 config.active_attribs_for(mga::DisplayName::primary);209 config.active_config_for(mga::DisplayName::primary);
208 }, std::runtime_error);210 }, std::runtime_error);
209 auto external_attribs = config.active_attribs_for(mga::DisplayName::external);211 auto external_attribs = config.active_config_for(mga::DisplayName::external);
210 EXPECT_THAT(external_attribs.pixel_size, Eq(geom::Size{0,0}));212 EXPECT_THAT(external_attribs.modes.size(), Eq(0));
211 EXPECT_THAT(external_attribs.vrefresh_hz, Eq(0.0));
212 EXPECT_FALSE(external_attribs.connected);213 EXPECT_FALSE(external_attribs.connected);
214 EXPECT_FALSE(external_attribs.used);
213}215}
214216
215TEST_F(HwcConfiguration, no_fpe_from_malformed_refresh)217TEST_F(HwcConfiguration, no_fpe_from_malformed_refresh)
@@ -224,8 +226,8 @@
224 values[i++] = 0;226 values[i++] = 0;
225 return 0;227 return 0;
226 }));228 }));
227 auto attribs = config.active_attribs_for(mga::DisplayName::external);229 auto attribs = config.active_config_for(mga::DisplayName::external);
228 EXPECT_THAT(attribs.vrefresh_hz, Eq(0.0f));230 EXPECT_THAT(attribs.modes[attribs.current_mode_index].vrefresh_hz, Eq(0.0f));
229}231}
230232
231TEST_F(HwcConfiguration, no_fpe_from_malformed_dpi)233TEST_F(HwcConfiguration, no_fpe_from_malformed_dpi)
@@ -240,8 +242,8 @@
240 values[i++] = 0;242 values[i++] = 0;
241 return 0;243 return 0;
242 }));244 }));
243 auto attribs = config.active_attribs_for(mga::DisplayName::external);245 auto attribs = config.active_config_for(mga::DisplayName::external);
244 EXPECT_THAT(attribs.mm_size, Eq(geom::Size{0,0}));246 EXPECT_THAT(attribs.physical_size_mm, Eq(geom::Size{0,0}));
245}247}
246248
247TEST_F(HwcConfiguration, subscribes_to_hotplug_and_vsync)249TEST_F(HwcConfiguration, subscribes_to_hotplug_and_vsync)
248250
=== modified file 'tests/unit-tests/graphics/android/test_output_builder.cpp'
--- tests/unit-tests/graphics/android/test_output_builder.cpp 2015-01-22 09:00:14 +0000
+++ tests/unit-tests/graphics/android/test_output_builder.cpp 2015-03-24 19:59:11 +0000
@@ -33,6 +33,7 @@
33#include "mir_test_doubles/mock_hwc_device_wrapper.h"33#include "mir_test_doubles/mock_hwc_device_wrapper.h"
34#include "mir_test_doubles/stub_gl_config.h"34#include "mir_test_doubles/stub_gl_config.h"
35#include "mir_test_doubles/stub_gl_program_factory.h"35#include "mir_test_doubles/stub_gl_program_factory.h"
36#include "mir_test_doubles/stub_display_configuration.h"
36#include <system/window.h>37#include <system/window.h>
37#include <gtest/gtest.h>38#include <gtest/gtest.h>
3839
@@ -159,3 +160,22 @@
159 mock_hwc_report);160 mock_hwc_report);
160 }, std::runtime_error);161 }, std::runtime_error);
161}162}
163
164//some drivers incorrectly report 0 buffers available. request 2 fbs in this case.
165TEST_F(HalComponentFactory, determine_fbnum_always_reports_2_minimum)
166{
167 using namespace testing;
168 EXPECT_CALL(*mock_resource_factory, create_hwc_wrapper(_))
169 .WillOnce(Throw(std::runtime_error("")));
170 EXPECT_CALL(*mock_resource_factory, create_fb_native_device())
171 .WillOnce(Return(std::make_shared<mtd::MockFBHalDevice>(
172 0, 0, mir_pixel_format_abgr_8888, 0)));
173 EXPECT_CALL(mock_buffer_allocator, alloc_buffer_platform(_,_,_))
174 .Times(2);
175
176 mga::HalComponentFactory factory(
177 mt::fake_shared(mock_buffer_allocator),
178 mock_resource_factory,
179 mock_hwc_report);
180 factory.create_framebuffers(mtd::StubDisplayConfig(1).outputs[0]);
181}

Subscribers

People subscribed via source and target branches