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/server/graphics/gbm/internal_native_surface.h"
20
#include "mir/graphics/platform.h"
21
#include "mir/graphics/platform_ipc_package.h"
22
#include "mir/graphics/internal_surface.h"
24
#include "mir_toolkit/mesa/native_display.h"
26
#include "mir_test/fake_shared.h"
27
#include "mir_test_doubles/stub_surface_builder.h"
28
#include "mir_test_doubles/mock_frontend_surface.h"
29
#include "mir_test_doubles/mock_buffer.h"
31
#include <gtest/gtest.h>
32
#include <gmock/gmock.h>
34
namespace mg = mir::graphics;
35
namespace mgg = mir::graphics::gbm;
36
namespace mc = mir::compositor;
37
namespace msh = mir::shell;
38
namespace geom = mir::geometry;
39
namespace mt = mir::test;
40
namespace mtd = mt::doubles;
44
class MockInternalSurface : public mg::InternalSurface
47
MOCK_CONST_METHOD0(size, geom::Size());
48
MOCK_CONST_METHOD0(pixel_format, MirPixelFormat());
49
MOCK_METHOD0(advance_client_buffer, std::shared_ptr<mg::Buffer>());
52
struct InternalNativeSurface : public testing::Test
56
using namespace ::testing;
57
mock_surface = std::make_shared<MockInternalSurface>();
60
std::shared_ptr<MockInternalSurface> mock_surface;
63
MATCHER_P(ParametersHaveSize, size, "")
65
if (static_cast<uint32_t>(arg.width) != size.width.as_uint32_t())
67
if (static_cast<uint32_t>(arg.height) != size.height.as_uint32_t())
73
TEST_F(InternalNativeSurface, surface_advance_buffer_packaging)
75
using namespace ::testing;
77
auto buffer = std::make_shared<mtd::MockBuffer>();
79
auto test_buffer_package = std::make_shared<MirBufferPackage>();
80
test_buffer_package->data_items = 2;
81
test_buffer_package->data[0] = 1;
82
test_buffer_package->data[1] = 2;
83
test_buffer_package->fd_items = 2;
84
test_buffer_package->fd[0] = 3;
85
test_buffer_package->fd[1] = 4;
86
test_buffer_package->stride = 77;
88
mgg::InternalNativeSurface native_surface(mock_surface);
90
EXPECT_CALL(*buffer, native_buffer_handle())
91
.WillOnce(Return(test_buffer_package));
92
EXPECT_CALL(*mock_surface, advance_client_buffer())
94
.WillOnce(Return(buffer));
96
MirBufferPackage buffer_package;
97
memset(&buffer_package, 0, sizeof(MirBufferPackage));
98
native_surface.surface_advance_buffer(&native_surface, &buffer_package);
100
EXPECT_EQ(test_buffer_package->data_items, buffer_package.data_items);
101
EXPECT_EQ(test_buffer_package->data[0], buffer_package.data[0]);
102
EXPECT_EQ(test_buffer_package->data[1], buffer_package.data[1]);
103
EXPECT_EQ(test_buffer_package->fd_items, buffer_package.fd_items);
104
EXPECT_EQ(test_buffer_package->fd[0], buffer_package.fd[0]);
105
EXPECT_EQ(test_buffer_package->fd[1], buffer_package.fd[1]);
106
EXPECT_EQ(test_buffer_package->stride, buffer_package.stride);
109
TEST_F(InternalNativeSurface, surface_advance_buffer_secures_resource)
111
using namespace ::testing;
112
mgg::InternalNativeSurface native_surface(mock_surface);
113
auto stub_buffer1 = std::make_shared<mtd::MockBuffer>();
114
auto stub_buffer2 = std::make_shared<mtd::MockBuffer>();
116
auto test_buffer_package = std::make_shared<MirBufferPackage>();
117
EXPECT_CALL(*stub_buffer1, native_buffer_handle())
118
.WillOnce(Return(test_buffer_package));
119
EXPECT_CALL(*stub_buffer2, native_buffer_handle())
120
.WillOnce(Return(test_buffer_package));
121
EXPECT_CALL(*mock_surface, advance_client_buffer())
123
.WillOnce(Return(stub_buffer1))
124
.WillOnce(Return(stub_buffer2));
126
auto use_count_1 = stub_buffer1.use_count();
127
auto use_count_2 = stub_buffer2.use_count();
129
MirBufferPackage buffer_package;
130
native_surface.surface_advance_buffer(&native_surface, &buffer_package);
131
EXPECT_EQ(use_count_1 + 1, stub_buffer1.use_count());
133
native_surface.surface_advance_buffer(&native_surface, &buffer_package);
134
EXPECT_EQ(use_count_1, stub_buffer1.use_count());
135
EXPECT_EQ(use_count_2 + 1, stub_buffer2.use_count());
138
TEST_F(InternalNativeSurface, surface_get_parameters)
140
using namespace ::testing;
142
geom::Size const test_surface_size{17, 29};
143
MirPixelFormat const test_pixel_format = mir_pixel_format_xrgb_8888;
144
EXPECT_CALL(*mock_surface, size())
146
.WillOnce(Return(test_surface_size));
147
EXPECT_CALL(*mock_surface, pixel_format())
149
.WillOnce(Return(test_pixel_format));
151
mgg::InternalNativeSurface native_surface(mock_surface);
153
MirSurfaceParameters parameters;
154
memset(¶meters, 0, sizeof(MirSurfaceParameters));
155
native_surface.surface_get_parameters(&native_surface, ¶meters);
157
EXPECT_THAT(parameters, ParametersHaveSize(test_surface_size));
158
EXPECT_EQ(parameters.pixel_format, mir_pixel_format_xrgb_8888);
159
// TODO: What to do about buffer usage besides hardware? ~racarr
160
EXPECT_EQ(parameters.buffer_usage, mir_buffer_usage_hardware);