2
* Copyright © 2013 Canonical Ltd.
4
* This program is free software: you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 3 as
6
* published by the Free Software Foundation.
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.
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/>.
16
* Authored by: Kevin DuBois <kevin.dubois@canonical.com>
19
#include "src/platforms/android/server/server_render_window.h"
21
#include "mir/test/doubles/mock_buffer.h"
22
#include "mir/test/doubles/mock_fence.h"
23
#include "mir/test/doubles/mock_interpreter_resource_cache.h"
24
#include "mir/test/doubles/mock_framebuffer_bundle.h"
25
#include "mir/test/doubles/stub_android_native_buffer.h"
26
#include "mir/test/fake_shared.h"
27
#include "mir/test/doubles/mock_android_native_buffer.h"
28
#include "mir/test/doubles/null_gl_context.h"
29
#include "mir/test/doubles/mock_egl.h"
30
#include "mir_toolkit/common.h"
31
#include <hardware/gralloc.h>
32
#include <gtest/gtest.h>
33
#include <gmock/gmock.h>
36
namespace mt=mir::test;
37
namespace mtd=mir::test::doubles;
38
namespace geom=mir::geometry;
39
namespace mg=mir::graphics;
40
namespace mga=mir::graphics::android;
44
//krillin and arale need to clear their fences before hwc commit.
45
struct StubPropertiesWrapper : mga::PropertiesWrapper
47
StubPropertiesWrapper(bool should_clear_fence) :
48
name(should_clear_fence ? "arale" : "otherdevice")
52
int property_get(char const* key, char* value, char const* default_value) const override
54
if (strncmp(key, "ro.product.device", PROP_VALUE_MAX) == 0)
55
strncpy(value, name.c_str(), name.size());
57
strncpy(value, default_value, PROP_VALUE_MAX);
64
struct ServerRenderWindow : public ::testing::Test
66
std::shared_ptr<mtd::MockBuffer> mock_buffer{std::make_shared<testing::NiceMock<mtd::MockBuffer>>()};
67
std::shared_ptr<mtd::MockInterpreterResourceCache> mock_cache{
68
std::make_shared<testing::NiceMock<mtd::MockInterpreterResourceCache>>()};
69
std::shared_ptr<mtd::MockFBBundle> mock_fb_bundle{
70
std::make_shared<testing::NiceMock<mtd::MockFBBundle>>()};
71
MirPixelFormat format{mir_pixel_format_abgr_8888};
72
StubPropertiesWrapper wrapper{false};
73
mtd::NullGLContext context;
74
testing::NiceMock<mtd::MockEGL> mock_egl;
75
mga::DeviceQuirks quirks{wrapper, context};
76
mga::ServerRenderWindow render_window{mock_fb_bundle, format, mock_cache, quirks};
80
TEST_F(ServerRenderWindow, returns_buffer_on_request)
82
using namespace testing;
83
auto stub_buffer = std::make_shared<mtd::StubAndroidNativeBuffer>();
85
EXPECT_CALL(*mock_fb_bundle, buffer_for_render())
86
.WillOnce(Return(mock_buffer));
87
EXPECT_CALL(*mock_buffer, native_buffer_handle())
88
.WillOnce(Return(stub_buffer));
90
std::shared_ptr<mg::Buffer> tmp = mock_buffer;
91
std::shared_ptr<mga::NativeBuffer> tmp2 = stub_buffer;
92
EXPECT_CALL(*mock_cache, store_buffer(tmp, tmp2));
94
auto rc_buffer = render_window.driver_requests_buffer();
95
EXPECT_EQ(stub_buffer.get(), rc_buffer);
98
TEST_F(ServerRenderWindow, updates_fences_and_returns_buffer_on_queue)
100
using namespace testing;
101
int fake_fence = 488;
102
auto stub_buffer = std::make_shared<mtd::StubAndroidNativeBuffer>();
104
EXPECT_CALL(*mock_fb_bundle, buffer_for_render())
105
.WillOnce(Return(mock_buffer));
106
EXPECT_CALL(*mock_buffer, native_buffer_handle())
107
.WillOnce(Return(stub_buffer));
109
render_window.driver_requests_buffer();
110
Mock::VerifyAndClearExpectations(mock_fb_bundle.get());
112
std::shared_ptr<mg::Buffer> buf1 = mock_buffer;
113
EXPECT_CALL(*mock_cache, update_native_fence(stub_buffer->anwb(), fake_fence));
114
EXPECT_CALL(*mock_cache, retrieve_buffer(stub_buffer->anwb()))
115
.WillOnce(Return(mock_buffer));
117
render_window.driver_returns_buffer(stub_buffer->anwb(), fake_fence);
118
Mock::VerifyAndClearExpectations(mock_fb_bundle.get());
121
TEST_F(ServerRenderWindow, clears_fence_when_quirk_present)
123
using namespace testing;
124
StubPropertiesWrapper wrapper{true};
125
mga::DeviceQuirks quirks{wrapper, context};
126
mga::ServerRenderWindow render_window{mock_fb_bundle, format, mock_cache, quirks};
128
int fake_fence = 488;
129
auto stub_buffer = std::make_shared<mtd::StubAndroidNativeBuffer>();
131
EXPECT_CALL(*mock_fb_bundle, buffer_for_render())
132
.WillOnce(Return(mock_buffer));
133
EXPECT_CALL(*mock_buffer, native_buffer_handle())
134
.WillOnce(Return(stub_buffer));
136
render_window.driver_requests_buffer();
137
Mock::VerifyAndClearExpectations(mock_fb_bundle.get());
139
std::shared_ptr<mg::Buffer> buf1 = mock_buffer;
140
EXPECT_CALL(*mock_cache, update_native_fence(stub_buffer->anwb(), fake_fence))
142
EXPECT_CALL(*mock_cache, retrieve_buffer(stub_buffer->anwb()))
143
.WillOnce(Return(mock_buffer));
145
render_window.driver_returns_buffer(stub_buffer->anwb(), fake_fence);
146
Mock::VerifyAndClearExpectations(mock_fb_bundle.get());
149
TEST_F(ServerRenderWindow, returns_format)
151
EXPECT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, render_window.driver_requests_info(NATIVE_WINDOW_FORMAT));
154
TEST_F(ServerRenderWindow, returns_usage_bits_for_fb)
156
using namespace testing;
157
auto bits = GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_FB;
158
EXPECT_THAT(render_window.driver_requests_info(NATIVE_WINDOW_CONSUMER_USAGE_BITS), Eq(bits));
161
TEST_F(ServerRenderWindow, returns_different_format_if_format_changes)
163
render_window.dispatch_driver_request_format(HAL_PIXEL_FORMAT_RGBX_8888);
164
EXPECT_EQ(HAL_PIXEL_FORMAT_RGBX_8888, render_window.driver_requests_info(NATIVE_WINDOW_FORMAT));
167
TEST_F(ServerRenderWindow, returns_sensible_size_values_without_size_having_been_set)
169
using namespace testing;
170
geom::Size test_size{4, 5};
171
EXPECT_CALL(*mock_fb_bundle, fb_size())
173
.WillRepeatedly(Return(test_size));
175
unsigned int rc_width = render_window.driver_requests_info(NATIVE_WINDOW_DEFAULT_WIDTH);
176
unsigned int rc_height = render_window.driver_requests_info(NATIVE_WINDOW_DEFAULT_HEIGHT);
177
EXPECT_EQ(test_size.width.as_uint32_t(), rc_width);
178
EXPECT_EQ(test_size.height.as_uint32_t(), rc_height);
180
rc_width = render_window.driver_requests_info(NATIVE_WINDOW_WIDTH);
181
rc_height = render_window.driver_requests_info(NATIVE_WINDOW_HEIGHT);
182
EXPECT_EQ(test_size.width.as_uint32_t(), rc_width);
183
EXPECT_EQ(test_size.height.as_uint32_t(), rc_height);
186
TEST_F(ServerRenderWindow, returns_no_transform_when_asked_for_hint)
188
EXPECT_EQ(0, render_window.driver_requests_info(NATIVE_WINDOW_TRANSFORM_HINT));
191
TEST_F(ServerRenderWindow, reports_framebuffer_concrete_type)
193
EXPECT_EQ(NATIVE_WINDOW_FRAMEBUFFER, render_window.driver_requests_info(NATIVE_WINDOW_CONCRETE_TYPE));
196
TEST_F(ServerRenderWindow, throws_on_driver_unknown_inquiry)
199
render_window.driver_requests_info(NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND);
200
}, std::runtime_error);