19
19
#include "mir/graphics/display_buffer.h"
20
#include "mir/graphics/display_configuration.h"
20
21
#include "src/server/graphics/android/android_display.h"
21
22
#include "src/server/graphics/android/gpu_android_display_buffer_factory.h"
22
23
#include "src/server/graphics/android/hwc_android_display_buffer_factory.h"
36
37
namespace mg=mir::graphics;
37
38
namespace mga=mir::graphics::android;
38
39
namespace mtd=mir::test::doubles;
40
namespace geom=mir::geometry;
40
42
struct DummyGPUDisplayType {};
41
43
struct DummyHWCDisplayType {};
44
std::shared_ptr<mg::Display> make_display(
45
std::shared_ptr<mtd::MockAndroidFramebufferWindow> const& fbwin,
46
std::shared_ptr<mg::DisplayReport> const& listener);
49
std::shared_ptr<mg::Display> make_display<DummyGPUDisplayType>(
50
std::shared_ptr<mtd::MockAndroidFramebufferWindow> const& fbwin,
51
std::shared_ptr<mg::DisplayReport> const& listener)
53
auto db_factory = std::make_shared<mga::GPUAndroidDisplayBufferFactory>();
54
return std::make_shared<mga::AndroidDisplay>(fbwin, db_factory, listener);
58
std::shared_ptr<mg::Display> make_display<DummyHWCDisplayType>(
59
std::shared_ptr<mtd::MockAndroidFramebufferWindow> const& fbwin,
60
std::shared_ptr<mg::DisplayReport> const& listener)
62
auto mock_hwc_device = std::make_shared<mtd::MockHWCInterface>();
63
auto db_factory = std::make_shared<mga::HWCAndroidDisplayBufferFactory>(mock_hwc_device);
64
return std::make_shared<mga::AndroidDisplay>(fbwin, db_factory, listener);
45
static geom::Size const display_size{433,232};
67
47
template<typename T>
68
48
class AndroidTestFramebufferInit : public ::testing::Test
82
62
EXPECT_CALL(*native_win, android_display_egl_config(_))
83
63
.Times(AtLeast(0));
65
ON_CALL(mock_egl, eglQuerySurface(_,_,EGL_WIDTH,_))
67
SetArgPointee<3>(display_size.width.as_uint32_t()),
69
ON_CALL(mock_egl, eglQuerySurface(_,_,EGL_HEIGHT,_))
71
SetArgPointee<3>(display_size.height.as_uint32_t()),
88
75
mock_display_report = std::make_shared<NiceMock<mtd::MockDisplayReport>>();
91
78
std::shared_ptr<mtd::MockDisplayReport> mock_display_report;
92
79
std::shared_ptr<mtd::MockAndroidFramebufferWindow> native_win;
93
80
mtd::MockEGL mock_egl;
84
std::shared_ptr<mg::Display> make_display(
85
std::shared_ptr<mtd::MockAndroidFramebufferWindow> const& fbwin,
86
std::shared_ptr<mg::DisplayReport> const& listener);
89
std::shared_ptr<mg::Display> make_display<DummyGPUDisplayType>(
90
std::shared_ptr<mtd::MockAndroidFramebufferWindow> const& fbwin,
91
std::shared_ptr<mg::DisplayReport> const& listener)
93
auto db_factory = std::make_shared<mga::GPUAndroidDisplayBufferFactory>();
94
return std::make_shared<mga::AndroidDisplay>(fbwin, db_factory, listener);
98
std::shared_ptr<mg::Display> make_display<DummyHWCDisplayType>(
99
std::shared_ptr<mtd::MockAndroidFramebufferWindow> const& fbwin,
100
std::shared_ptr<mg::DisplayReport> const& listener)
102
auto mock_hwc_device = std::make_shared<mtd::MockHWCInterface>();
103
ON_CALL(*mock_hwc_device, display_size())
104
.WillByDefault(testing::Return(display_size));
105
auto db_factory = std::make_shared<mga::HWCAndroidDisplayBufferFactory>(mock_hwc_device);
106
return std::make_shared<mga::AndroidDisplay>(fbwin, db_factory, listener);
97
110
typedef ::testing::Types<DummyGPUDisplayType, DummyHWCDisplayType> FramebufferTestTypes;
98
111
TYPED_TEST_CASE(AndroidTestFramebufferInit, FramebufferTestTypes);
590
602
auto display = make_display<TypeParam>(this->native_win, this->mock_display_report);
591
603
}, std::runtime_error);
606
//we only have single display and single mode on android for the time being
607
TYPED_TEST(AndroidTestFramebufferInit, android_display_configuration_info)
609
auto display = make_display<TypeParam>(this->native_win, this->mock_display_report);
610
auto config = display->configuration();
612
std::vector<mg::DisplayConfigurationOutput> configurations;
613
config->for_each_output([&](mg::DisplayConfigurationOutput const& config)
615
configurations.push_back(config);
618
ASSERT_EQ(1u, configurations.size());
619
auto& disp_conf = configurations[0];
620
ASSERT_EQ(1u, disp_conf.modes.size());
621
auto& disp_mode = disp_conf.modes[0];
622
EXPECT_EQ(display_size, disp_mode.size);
623
//TODO fill refresh rate accordingly
625
EXPECT_EQ(mg::DisplayConfigurationOutputId{0}, disp_conf.id);
626
EXPECT_EQ(mg::DisplayConfigurationCardId{0}, disp_conf.card_id);
627
EXPECT_TRUE(disp_conf.connected);
628
EXPECT_TRUE(disp_conf.used);
629
auto origin = geom::Point{0,0};
630
EXPECT_EQ(origin, disp_conf.top_left);
631
EXPECT_EQ(0, disp_conf.current_mode_index);
632
//TODO fill physical_size_mm fields accordingly;
635
//Cannot configure android displays at this time
636
TYPED_TEST(AndroidTestFramebufferInit, android_display_configure_output)
638
auto display = make_display<TypeParam>(this->native_win, this->mock_display_report);
639
auto config = display->configuration();
641
mg::DisplayConfigurationOutputId id{0};
643
config->configure_output(id, true, geom::Point{0,0}, 0);
644
}, std::runtime_error);