42
40
geom::Size, MirPixelFormat, mga::BufferUsage use));
45
static int const display_width = 180;
46
static int const display_height = 1010101;
48
43
class PostingFBBundleTest : public ::testing::Test
51
46
virtual void SetUp()
53
48
using namespace testing;
55
format = HAL_PIXEL_FORMAT_RGBA_8888;
56
49
buffer1 = std::make_shared<mtd::MockBuffer>();
57
50
buffer2 = std::make_shared<mtd::MockBuffer>();
58
51
buffer3 = std::make_shared<mtd::MockBuffer>();
59
mock_allocator = std::make_shared<MockGraphicBufferAllocator>();
60
mock_fb_hal = std::make_shared<mtd::MockFBHalDevice>(display_width, display_height, format, fbnum);
61
EXPECT_CALL(*mock_allocator, alloc_buffer_platform(_,_,_))
52
EXPECT_CALL(mock_allocator, alloc_buffer_platform(_,_,_))
63
54
.WillOnce(Return(buffer1))
64
55
.WillOnce(Return(buffer2))
65
56
.WillRepeatedly(Return(buffer3));
59
MirPixelFormat format{mir_pixel_format_abgr_8888};
70
60
double vrefresh_hz{55.330};
71
std::shared_ptr<mtd::MockFBHalDevice> mock_fb_hal;
72
std::shared_ptr<MockGraphicBufferAllocator> mock_allocator;
61
MockGraphicBufferAllocator mock_allocator;
73
62
std::shared_ptr<mg::Buffer> buffer1;
74
63
std::shared_ptr<mg::Buffer> buffer2;
75
64
std::shared_ptr<mg::Buffer> buffer3;
76
geom::Size display_size{display_width, display_height};
77
testing::NiceMock<mtd::MockEGL> mock_egl;
65
geom::Size display_size{180, 222};
82
69
TEST_F(PostingFBBundleTest, hwc_fb_size_allocation)
84
71
using namespace testing;
86
EXPECT_CALL(*mock_allocator, alloc_buffer_platform(display_size, _, mga::BufferUsage::use_framebuffer_gles))
73
EXPECT_CALL(mock_allocator, alloc_buffer_platform(display_size, _, mga::BufferUsage::use_framebuffer_gles))
88
75
.WillRepeatedly(Return(nullptr));
90
mga::Framebuffers framebuffers(mock_allocator, display_size, vrefresh_hz, 2u);
77
mga::Framebuffers framebuffers(mock_allocator, display_size, format, vrefresh_hz, 2u);
91
78
EXPECT_EQ(display_size, framebuffers.fb_size());
92
79
EXPECT_EQ(vrefresh_hz, framebuffers.fb_refresh_rate());
95
TEST_F(PostingFBBundleTest, hwc_fb_format_selection)
97
using namespace testing;
98
EGLint const expected_egl_config_attr [] =
100
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
101
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
102
EGL_FRAMEBUFFER_TARGET_ANDROID, EGL_TRUE,
106
int visual_id = HAL_PIXEL_FORMAT_BGRA_8888;
107
EGLDisplay fake_display = reinterpret_cast<EGLDisplay>(0x11235813);
108
EGLConfig fake_egl_config = reinterpret_cast<EGLConfig>(0x44);
111
EXPECT_CALL(mock_egl, eglGetDisplay(EGL_DEFAULT_DISPLAY))
113
.WillOnce(Return(fake_display));
114
EXPECT_CALL(mock_egl, eglInitialize(fake_display,_,_))
116
EXPECT_CALL(mock_egl, eglChooseConfig(fake_display,mtd::AttrMatches(expected_egl_config_attr),_,1,_))
118
.WillOnce(DoAll(SetArgPointee<2>(fake_egl_config), SetArgPointee<4>(1), Return(EGL_TRUE)));
119
EXPECT_CALL(mock_egl, eglGetConfigAttrib(fake_display, fake_egl_config, EGL_NATIVE_VISUAL_ID, _))
121
.WillOnce(DoAll(SetArgPointee<3>(visual_id), Return(EGL_TRUE)));
122
EXPECT_CALL(mock_egl, eglTerminate(fake_display))
125
mga::Framebuffers framebuffers(mock_allocator, display_size, vrefresh_hz, 2u);
126
EXPECT_EQ(mir_pixel_format_argb_8888, framebuffers.fb_format());
129
//not all hwc11 implementations give a hint about their framebuffer formats in their configuration.
130
//prefer abgr_8888 if we can't figure things out
131
TEST_F(PostingFBBundleTest, hwc_version_11_format_selection_failure)
133
using namespace testing;
134
EGLDisplay fake_display = reinterpret_cast<EGLDisplay>(0x11235813);
137
EXPECT_CALL(mock_egl, eglGetDisplay(EGL_DEFAULT_DISPLAY))
139
.WillOnce(Return(fake_display));
140
EXPECT_CALL(mock_egl, eglInitialize(fake_display,_,_))
142
EXPECT_CALL(mock_egl, eglChooseConfig(_,_,_,_,_))
144
.WillOnce(DoAll(SetArgPointee<4>(0), Return(EGL_TRUE)));
145
EXPECT_CALL(mock_egl, eglTerminate(fake_display))
148
mga::Framebuffers framebuffers(mock_allocator, display_size, vrefresh_hz, 2u);
149
EXPECT_EQ(mir_pixel_format_abgr_8888, framebuffers.fb_format());
152
TEST_F(PostingFBBundleTest, bundle_from_fb)
154
using namespace testing;
155
auto display_size = geom::Size{display_width, display_height};
156
EXPECT_CALL(*mock_allocator, alloc_buffer_platform(display_size, mir_pixel_format_abgr_8888, mga::BufferUsage::use_framebuffer_gles))
158
.WillRepeatedly(Return(nullptr));
160
mga::Framebuffers framebuffers(mock_allocator, display_size, vrefresh_hz, mock_fb_hal);
161
EXPECT_EQ(display_size, framebuffers.fb_size());
162
EXPECT_EQ(mir_pixel_format_abgr_8888, framebuffers.fb_format());
165
//some drivers incorrectly report 0 buffers available. if this is true, we should alloc 2, the minimum requirement
166
TEST_F(PostingFBBundleTest, determine_fbnum_always_reports_2_minimum)
168
using namespace testing;
169
auto slightly_malformed_fb_hal_mock = std::make_shared<mtd::MockFBHalDevice>(display_width, display_height, format, 0);
170
EXPECT_CALL(*mock_allocator, alloc_buffer_platform(_,_,_))
172
.WillRepeatedly(Return(nullptr));
174
mga::Framebuffers framebuffers(mock_allocator, display_size, vrefresh_hz, slightly_malformed_fb_hal_mock);
177
82
TEST_F(PostingFBBundleTest, last_rendered_returns_valid)
179
mga::Framebuffers framebuffers(mock_allocator, display_size, vrefresh_hz, mock_fb_hal);
84
mga::Framebuffers framebuffers(mock_allocator, display_size, format, vrefresh_hz, 2u);
181
86
auto test_buffer = framebuffers.last_rendered_buffer();
182
87
EXPECT_TRUE((test_buffer == buffer1) || (test_buffer == buffer2));