Mir

Merge lp:~afrantzis/mir/platform-operation-set-gbm-device into lp:mir

Proposed by Alexandros Frantzis
Status: Merged
Approved by: Alexandros Frantzis
Approved revision: no longer in the source branch.
Merged at revision: 2286
Proposed branch: lp:~afrantzis/mir/platform-operation-set-gbm-device
Merge into: lp:mir
Prerequisite: lp:~afrantzis/mir/client-platform-populate-package
Diff against target: 763 lines (+306/-143)
17 files modified
src/client/mir_connection.cpp (+8/-20)
src/client/mir_connection.h (+0/-4)
src/client/mir_connection_api.cpp (+36/-11)
src/include/client/mir/client_platform.h (+11/-0)
src/platforms/android/client/android_client_platform.cpp (+6/-0)
src/platforms/android/client/android_client_platform.h (+1/-1)
src/platforms/mesa/client/client_platform.cpp (+46/-1)
src/platforms/mesa/client/client_platform.h (+4/-0)
src/platforms/mesa/include/mir_toolkit/mesa/platform_operation.h (+19/-2)
tests/acceptance-tests/CMakeLists.txt (+0/-1)
tests/acceptance-tests/test_client_library_drm.cpp (+0/-46)
tests/acceptance-tests/test_client_library_errors.cpp (+5/-0)
tests/include/mir_test_framework/client_platform_factory.h (+3/-9)
tests/mir_test_framework/stub_client_platform_factory.cpp (+5/-0)
tests/unit-tests/client/mesa/test_client_platform.cpp (+77/-6)
tests/unit-tests/client/test_client_mir_surface.cpp (+6/-0)
tests/unit-tests/client/test_mir_connection.cpp (+79/-42)
To merge this branch: bzr merge lp:~afrantzis/mir/platform-operation-set-gbm-device
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Robert Carr (community) Approve
Alan Griffiths Approve
Review via email: mp+248125@code.launchpad.net

This proposal supersedes a proposal from 2015-01-30.

Commit message

client: Add set_gbm_device platform operation

Description of the change

client: Add set_gbm_device platform operation

Implement the set_gbm_device functionality as a platform operation. The mir_connection_drm_set_gbm_device() function is kept (for now) for backward compatibility and implemented in terms of the platform operation.

This changes also allows us to remove the final platform specific piece from the nested server, which will happen in an upcoming MP.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

OK

review: Approve
Revision history for this message
Robert Carr (robertcarr) wrote :

LGTM

review: Approve
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/client/mir_connection.cpp'
--- src/client/mir_connection.cpp 2015-01-30 14:38:25 +0000
+++ src/client/mir_connection.cpp 2015-01-30 14:38:25 +0000
@@ -361,6 +361,14 @@
361 MirPlatformMessage const* request,361 MirPlatformMessage const* request,
362 mir_platform_operation_callback callback, void* context)362 mir_platform_operation_callback callback, void* context)
363{363{
364 auto const client_response = platform->platform_operation(request);
365 if (client_response)
366 {
367 set_error_message("");
368 callback(this, client_response, context);
369 return nullptr;
370 }
371
364 mir::protobuf::PlatformOperationMessage protobuf_request;372 mir::protobuf::PlatformOperationMessage protobuf_request;
365373
366 protobuf_request.set_opcode(opcode);374 protobuf_request.set_opcode(opcode);
@@ -420,11 +428,6 @@
420 platform_package.fd_items = platform.fd_size();428 platform_package.fd_items = platform.fd_size();
421 for (int i = 0; i != platform.fd_size(); ++i)429 for (int i = 0; i != platform.fd_size(); ++i)
422 platform_package.fd[i] = platform.fd(i);430 platform_package.fd[i] = platform.fd(i);
423
424 // TODO: Replace the extra platform data mechanism with a
425 // client side, platform specific operation
426 for (auto d : extra_platform_data)
427 platform_package.data[platform_package.data_items++] = d;
428 }431 }
429 else432 else
430 {433 {
@@ -567,21 +570,6 @@
567 return &configure_display_wait_handle;570 return &configure_display_wait_handle;
568}571}
569572
570bool MirConnection::set_extra_platform_data(
571 std::vector<int> const& extra_platform_data_arg)
572{
573 std::lock_guard<decltype(mutex)> lock(mutex);
574
575 auto const total_data_size =
576 connect_result.platform().data_size() + extra_platform_data_arg.size();
577
578 if (total_data_size > mir_platform_package_max)
579 return false;
580
581 extra_platform_data = extra_platform_data_arg;
582 return true;
583}
584
585mir::protobuf::DisplayServer& MirConnection::display_server()573mir::protobuf::DisplayServer& MirConnection::display_server()
586{574{
587 return server;575 return server;
588576
=== modified file 'src/client/mir_connection.h'
--- src/client/mir_connection.h 2015-01-30 14:38:25 +0000
+++ src/client/mir_connection.h 2015-01-30 14:38:25 +0000
@@ -137,8 +137,6 @@
137 MirWaitHandle* configure_display(MirDisplayConfiguration* configuration);137 MirWaitHandle* configure_display(MirDisplayConfiguration* configuration);
138 void done_display_configure();138 void done_display_configure();
139139
140 bool set_extra_platform_data(std::vector<int> const& extra_platform_data);
141
142 std::shared_ptr<google::protobuf::RpcChannel> rpc_channel() const140 std::shared_ptr<google::protobuf::RpcChannel> rpc_channel() const
143 {141 {
144 return channel;142 return channel;
@@ -197,8 +195,6 @@
197 std::shared_ptr<mir::client::EventHandlerRegister> const event_handler_register;195 std::shared_ptr<mir::client::EventHandlerRegister> const event_handler_register;
198196
199 std::unique_ptr<mir::dispatch::SimpleDispatchThread> const eventloop;197 std::unique_ptr<mir::dispatch::SimpleDispatchThread> const eventloop;
200
201 std::vector<int> extra_platform_data;
202 198
203 std::shared_ptr<mir::client::ClientBufferStreamFactory> buffer_stream_factory;199 std::shared_ptr<mir::client::ClientBufferStreamFactory> buffer_stream_factory;
204200
205201
=== modified file 'src/client/mir_connection_api.cpp'
--- src/client/mir_connection_api.cpp 2015-01-26 15:53:18 +0000
+++ src/client/mir_connection_api.cpp 2015-01-30 14:38:25 +0000
@@ -51,11 +51,6 @@
51 *context = result;51 *context = result;
52}52}
5353
54size_t division_ceiling(size_t a, size_t b)
55{
56 return ((a - 1) / b) + 1;
57}
58
59class DefaultMirConnectionAPI : public mcl::MirConnectionAPI54class DefaultMirConnectionAPI : public mcl::MirConnectionAPI
60{55{
61public:56public:
@@ -356,6 +351,21 @@
356 auth_magic_context->callback(auth_response->status, auth_magic_context->context);351 auth_magic_context->callback(auth_response->status, auth_magic_context->context);
357}352}
358353
354void assign_set_gbm_device_status(
355 MirConnection*, MirPlatformMessage* response, void* context)
356{
357 auto const response_msg = mir::raii::deleter_for(
358 response,
359 &mir_platform_message_release);
360
361 auto const response_data = mir_platform_message_get_data(response_msg.get());
362 auto const set_gbm_device_response_ptr =
363 reinterpret_cast<MirMesaSetGBMDeviceResponse const*>(response_data.data);
364
365 auto status_ptr = static_cast<int*>(context);
366 *status_ptr = set_gbm_device_response_ptr->status;
367}
368
359}369}
360370
361MirWaitHandle* mir_connection_drm_auth_magic(MirConnection* connection,371MirWaitHandle* mir_connection_drm_auth_magic(MirConnection* connection,
@@ -386,10 +396,25 @@
386int mir_connection_drm_set_gbm_device(MirConnection* connection,396int mir_connection_drm_set_gbm_device(MirConnection* connection,
387 struct gbm_device* gbm_dev)397 struct gbm_device* gbm_dev)
388{398{
389 size_t const pointer_size_in_ints = division_ceiling(sizeof(gbm_dev), sizeof(int));399 MirMesaSetGBMDeviceRequest const request{gbm_dev};
390 std::vector<int> extra_data(pointer_size_in_ints);400
391401 auto const msg = mir::raii::deleter_for(
392 memcpy(extra_data.data(), &gbm_dev, sizeof(gbm_dev));402 mir_platform_message_create(MirMesaPlatformOperation::set_gbm_device),
393403 &mir_platform_message_release);
394 return connection->set_extra_platform_data(extra_data);404
405 mir_platform_message_set_data(msg.get(), &request, sizeof(request));
406
407 static int const success{0};
408 int status{-1};
409
410 auto wh = mir_connection_platform_operation(
411 connection,
412 MirMesaPlatformOperation::set_gbm_device,
413 msg.get(),
414 assign_set_gbm_device_status,
415 &status);
416
417 mir_wait_for(wh);
418
419 return status == success;
395}420}
396421
=== modified file 'src/include/client/mir/client_platform.h'
--- src/include/client/mir/client_platform.h 2015-01-30 14:38:25 +0000
+++ src/include/client/mir/client_platform.h 2015-01-30 14:38:25 +0000
@@ -49,6 +49,17 @@
4949
50 virtual MirPlatformType platform_type() const = 0;50 virtual MirPlatformType platform_type() const = 0;
51 virtual void populate(MirPlatformPackage& package) const = 0;51 virtual void populate(MirPlatformPackage& package) const = 0;
52 /**
53 * Perform a platform operation.
54 *
55 * The returned platform message is owned by the caller and should be
56 * released with mir_platform_message_release().
57 *
58 * \param [in] request The platform operation request
59 * \return The platform operation reply, or a nullptr if the
60 * requested operation is not supported
61 */
62 virtual MirPlatformMessage* platform_operation(MirPlatformMessage const* request) = 0;
52 virtual std::shared_ptr<ClientBufferFactory> create_buffer_factory() = 0;63 virtual std::shared_ptr<ClientBufferFactory> create_buffer_factory() = 0;
53 virtual std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) = 0;64 virtual std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) = 0;
54 virtual std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() = 0;65 virtual std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() = 0;
5566
=== modified file 'src/platforms/android/client/android_client_platform.cpp'
--- src/platforms/android/client/android_client_platform.cpp 2015-01-30 14:38:25 +0000
+++ src/platforms/android/client/android_client_platform.cpp 2015-01-30 14:38:25 +0000
@@ -112,6 +112,12 @@
112 context->populate_server_package(package);112 context->populate_server_package(package);
113}113}
114114
115MirPlatformMessage* mcla::AndroidClientPlatform::platform_operation(
116 MirPlatformMessage const*)
117{
118 return nullptr;
119}
120
115MirNativeBuffer* mcla::AndroidClientPlatform::convert_native_buffer(graphics::NativeBuffer* buf) const121MirNativeBuffer* mcla::AndroidClientPlatform::convert_native_buffer(graphics::NativeBuffer* buf) const
116{122{
117 return buf->anwb();123 return buf->anwb();
118124
=== modified file 'src/platforms/android/client/android_client_platform.h'
--- src/platforms/android/client/android_client_platform.h 2015-01-30 14:38:25 +0000
+++ src/platforms/android/client/android_client_platform.h 2015-01-30 14:38:25 +0000
@@ -35,6 +35,7 @@
35 AndroidClientPlatform(ClientContext* const context);35 AndroidClientPlatform(ClientContext* const context);
36 MirPlatformType platform_type() const override;36 MirPlatformType platform_type() const override;
37 void populate(MirPlatformPackage& package) const override;37 void populate(MirPlatformPackage& package) const override;
38 MirPlatformMessage* platform_operation(MirPlatformMessage const* request) override;
38 std::shared_ptr<ClientBufferFactory> create_buffer_factory() override;39 std::shared_ptr<ClientBufferFactory> create_buffer_factory() override;
39 std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) override;40 std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) override;
40 std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() override;41 std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() override;
@@ -42,7 +43,6 @@
4243
43private:44private:
44 ClientContext* const context;45 ClientContext* const context;
45
46};46};
4747
48}48}
4949
=== modified file 'src/platforms/mesa/client/client_platform.cpp'
--- src/platforms/mesa/client/client_platform.cpp 2015-01-30 14:38:25 +0000
+++ src/platforms/mesa/client/client_platform.cpp 2015-01-30 14:38:25 +0000
@@ -23,6 +23,9 @@
23#include "native_surface.h"23#include "native_surface.h"
24#include "mir/client_buffer_factory.h"24#include "mir/client_buffer_factory.h"
25#include "mir/client_context.h"25#include "mir/client_context.h"
26#include "mir_toolkit/mesa/platform_operation.h"
27
28#include <cstring>
2629
27namespace mcl=mir::client;30namespace mcl=mir::client;
28namespace mclm=mir::client::mesa;31namespace mclm=mir::client::mesa;
@@ -47,6 +50,11 @@
47 mcl::EGLNativeDisplayContainer& container;50 mcl::EGLNativeDisplayContainer& container;
48};51};
4952
53constexpr size_t division_ceiling(size_t a, size_t b)
54{
55 return ((a - 1) / b) + 1;
56}
57
50}58}
5159
52mclm::ClientPlatform::ClientPlatform(60mclm::ClientPlatform::ClientPlatform(
@@ -55,7 +63,8 @@
55 mcl::EGLNativeDisplayContainer& display_container)63 mcl::EGLNativeDisplayContainer& display_container)
56 : context{context},64 : context{context},
57 buffer_file_ops{buffer_file_ops},65 buffer_file_ops{buffer_file_ops},
58 display_container(display_container)66 display_container(display_container),
67 gbm_dev{nullptr}
59{68{
60}69}
6170
@@ -108,7 +117,43 @@
108117
109void mclm::ClientPlatform::populate(MirPlatformPackage& package) const118void mclm::ClientPlatform::populate(MirPlatformPackage& package) const
110{119{
120 size_t constexpr pointer_size_in_ints = division_ceiling(sizeof(gbm_dev), sizeof(int));
121
111 context->populate_server_package(package);122 context->populate_server_package(package);
123
124 auto const total_data_size = package.data_items + pointer_size_in_ints;
125 if (gbm_dev && total_data_size <= mir_platform_package_max)
126 {
127 int gbm_ptr[pointer_size_in_ints]{};
128 std::memcpy(&gbm_ptr, &gbm_dev, sizeof(gbm_dev));
129
130 for (auto i : gbm_ptr)
131 package.data[package.data_items++] = i;
132 }
133}
134
135MirPlatformMessage* mclm::ClientPlatform::platform_operation(
136 MirPlatformMessage const* msg)
137{
138 auto const op = mir_platform_message_get_opcode(msg);
139
140 if (op == MirMesaPlatformOperation::set_gbm_device)
141 {
142 auto const msg_data = mir_platform_message_get_data(msg);
143 auto const set_gbm_device_request_ptr =
144 reinterpret_cast<MirMesaSetGBMDeviceRequest const*>(msg_data.data);
145
146 gbm_dev = set_gbm_device_request_ptr->device;
147
148 static int const success{0};
149 MirMesaSetGBMDeviceResponse const response{success};
150 auto const response_msg = mir_platform_message_create(op);
151 mir_platform_message_set_data(response_msg, &response, sizeof(response));
152
153 return response_msg;
154 }
155
156 return nullptr;
112}157}
113158
114MirNativeBuffer* mclm::ClientPlatform::convert_native_buffer(graphics::NativeBuffer* buf) const159MirNativeBuffer* mclm::ClientPlatform::convert_native_buffer(graphics::NativeBuffer* buf) const
115160
=== modified file 'src/platforms/mesa/client/client_platform.h'
--- src/platforms/mesa/client/client_platform.h 2015-01-30 14:38:25 +0000
+++ src/platforms/mesa/client/client_platform.h 2015-01-30 14:38:25 +0000
@@ -20,6 +20,8 @@
2020
21#include "mir/client_platform.h"21#include "mir/client_platform.h"
2222
23struct gbm_device;
24
23namespace mir25namespace mir
24{26{
25namespace client27namespace client
@@ -41,6 +43,7 @@
4143
42 MirPlatformType platform_type() const override;44 MirPlatformType platform_type() const override;
43 void populate(MirPlatformPackage& package) const override;45 void populate(MirPlatformPackage& package) const override;
46 MirPlatformMessage* platform_operation(MirPlatformMessage const* request) override;
44 std::shared_ptr<ClientBufferFactory> create_buffer_factory() override;47 std::shared_ptr<ClientBufferFactory> create_buffer_factory() override;
45 std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) override;48 std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) override;
46 std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() override;49 std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() override;
@@ -50,6 +53,7 @@
50 ClientContext* const context;53 ClientContext* const context;
51 std::shared_ptr<BufferFileOps> const buffer_file_ops;54 std::shared_ptr<BufferFileOps> const buffer_file_ops;
52 EGLNativeDisplayContainer& display_container;55 EGLNativeDisplayContainer& display_container;
56 gbm_device* gbm_dev;
53};57};
5458
55}59}
5660
=== modified file 'src/platforms/mesa/include/mir_toolkit/mesa/platform_operation.h'
--- src/platforms/mesa/include/mir_toolkit/mesa/platform_operation.h 2015-01-27 14:59:08 +0000
+++ src/platforms/mesa/include/mir_toolkit/mesa/platform_operation.h 2015-01-30 14:38:25 +0000
@@ -35,7 +35,8 @@
35enum MirMesaPlatformOperation35enum MirMesaPlatformOperation
36{36{
37 auth_magic = 1,37 auth_magic = 1,
38 auth_fd = 238 auth_fd = 2,
39 set_gbm_device = 3
39};40};
4041
41/*42/*
@@ -49,7 +50,23 @@
4950
50struct MirMesaAuthMagicResponse51struct MirMesaAuthMagicResponse
51{52{
52 int status;53 int status; /* 0 on success, a positive error number on failure */
54};
55
56/*
57 * MesaPlatformOperation::set_gbm_device related structures
58 */
59
60struct gbm_device;
61
62struct MirMesaSetGBMDeviceRequest
63{
64 struct gbm_device* device;
65};
66
67struct MirMesaSetGBMDeviceResponse
68{
69 int status; /* 0 on success, a positive error number on failure */
53};70};
5471
55#ifdef __cplusplus72#ifdef __cplusplus
5673
=== modified file 'tests/acceptance-tests/CMakeLists.txt'
--- tests/acceptance-tests/CMakeLists.txt 2015-01-19 06:55:41 +0000
+++ tests/acceptance-tests/CMakeLists.txt 2015-01-30 14:38:25 +0000
@@ -25,7 +25,6 @@
25 test_display_configuration.cpp25 test_display_configuration.cpp
26 test_surfaces_with_output_id.cpp26 test_surfaces_with_output_id.cpp
27 test_server_disconnect.cpp27 test_server_disconnect.cpp
28 test_client_library_drm.cpp
29 test_prompt_session_client_api.cpp28 test_prompt_session_client_api.cpp
30 test_client_screencast.cpp29 test_client_screencast.cpp
31 test_client_surface_visibility.cpp30 test_client_surface_visibility.cpp
3231
=== removed file 'tests/acceptance-tests/test_client_library_drm.cpp'
--- tests/acceptance-tests/test_client_library_drm.cpp 2015-01-14 06:39:13 +0000
+++ tests/acceptance-tests/test_client_library_drm.cpp 1970-01-01 00:00:00 +0000
@@ -1,46 +0,0 @@
1/*
2 * Copyright © 2013-2014 Canonical Ltd.
3 *
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.
7 *
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.
12 *
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/>.
15 *
16 * Authored by: Alexandros Frantzis <alexandros.frantzis@canonical.com>
17 */
18
19#include "mir_toolkit/mir_client_library_drm.h"
20
21#include "mir_test_framework/connected_client_headless_server.h"
22
23#include <gtest/gtest.h>
24#include <gmock/gmock.h>
25
26namespace mtf = mir_test_framework;
27using namespace testing;
28
29using MirClientLibraryDrmTest = mtf::ConnectedClientHeadlessServer;
30
31TEST_F(MirClientLibraryDrmTest, sets_gbm_device_in_platform_data)
32{
33 struct gbm_device* dev = reinterpret_cast<struct gbm_device*>(connection);
34
35 MirPlatformPackage pkg;
36
37 mir_connection_get_platform(connection, &pkg);
38 int const previous_data_count{pkg.data_items};
39
40 mir_connection_drm_set_gbm_device(connection, dev);
41 mir_connection_get_platform(connection, &pkg);
42
43 EXPECT_THAT(pkg.data_items, Eq(previous_data_count + (sizeof(dev) / sizeof(int))));
44 EXPECT_THAT(reinterpret_cast<struct gbm_device*>(pkg.data[previous_data_count]),
45 Eq(dev));
46}
470
=== modified file 'tests/acceptance-tests/test_client_library_errors.cpp'
--- tests/acceptance-tests/test_client_library_errors.cpp 2015-01-30 14:38:25 +0000
+++ tests/acceptance-tests/test_client_library_errors.cpp 2015-01-30 14:38:25 +0000
@@ -77,6 +77,11 @@
77 {77 {
78 }78 }
7979
80 MirPlatformMessage* platform_operation(MirPlatformMessage const*) override
81 {
82 return nullptr;
83 }
84
80 MirPlatformType platform_type() const85 MirPlatformType platform_type() const
81 {86 {
82 BOOST_THROW_EXCEPTION(std::runtime_error{exception_text});87 BOOST_THROW_EXCEPTION(std::runtime_error{exception_text});
8388
=== modified file 'tests/include/mir_test_framework/client_platform_factory.h'
--- tests/include/mir_test_framework/client_platform_factory.h 2015-01-30 14:38:25 +0000
+++ tests/include/mir_test_framework/client_platform_factory.h 2015-01-30 14:38:25 +0000
@@ -42,19 +42,13 @@
42 return platform_factory(&ctx);42 return platform_factory(&ctx);
43}43}
4444
45std::shared_ptr<mir::client::ClientPlatform> create_mesa_client_platform()45std::shared_ptr<mir::client::ClientPlatform> create_mesa_client_platform(
46 mir::client::ClientContext* client_context)
46{47{
47 using namespace testing;48 using namespace testing;
48 mtd::MockClientContext ctx;
49 ON_CALL(ctx, populate_server_package(_))
50 .WillByDefault(Invoke([](MirPlatformPackage& package)
51 {
52 ::memset(&package, 0, sizeof(package));
53 package.fd_items = 1;
54 }));
55 platform_library = std::make_shared<mir::SharedLibrary>(client_platform("mesa.so"));49 platform_library = std::make_shared<mir::SharedLibrary>(client_platform("mesa.so"));
56 auto platform_factory = platform_library->load_function<mir::client::CreateClientPlatform>("create_client_platform");50 auto platform_factory = platform_library->load_function<mir::client::CreateClientPlatform>("create_client_platform");
57 return platform_factory(&ctx);51 return platform_factory(client_context);
58}52}
5953
60std::shared_ptr<mir::SharedLibrary>54std::shared_ptr<mir::SharedLibrary>
6155
=== modified file 'tests/mir_test_framework/stub_client_platform_factory.cpp'
--- tests/mir_test_framework/stub_client_platform_factory.cpp 2015-01-30 14:38:25 +0000
+++ tests/mir_test_framework/stub_client_platform_factory.cpp 2015-01-30 14:38:25 +0000
@@ -50,6 +50,11 @@
50 context->populate_server_package(package);50 context->populate_server_package(package);
51 }51 }
5252
53 MirPlatformMessage* platform_operation(MirPlatformMessage const*) override
54 {
55 return nullptr;
56 }
57
53 std::shared_ptr<mcl::ClientBufferFactory> create_buffer_factory()58 std::shared_ptr<mcl::ClientBufferFactory> create_buffer_factory()
54 {59 {
55 return std::make_shared<mtd::StubClientBufferFactory>();60 return std::make_shared<mtd::StubClientBufferFactory>();
5661
=== modified file 'tests/unit-tests/client/mesa/test_client_platform.cpp'
--- tests/unit-tests/client/mesa/test_client_platform.cpp 2015-01-22 21:42:26 +0000
+++ tests/unit-tests/client/mesa/test_client_platform.cpp 2015-01-30 14:38:25 +0000
@@ -18,23 +18,56 @@
1818
19#include "mir/client_platform.h"19#include "mir/client_platform.h"
20#include "mir/shared_library.h"20#include "mir/shared_library.h"
21#include "mir/raii.h"
21#include "src/platforms/mesa/client/mesa_native_display_container.h"22#include "src/platforms/mesa/client/mesa_native_display_container.h"
22#include "mir_test_framework/client_platform_factory.h"23#include "mir_test_framework/client_platform_factory.h"
23#include "mir_test_doubles/mock_egl_native_surface.h"
2424
25#include "mir_toolkit/mir_client_library.h"
25#include "mir_toolkit/mesa/native_display.h"26#include "mir_toolkit/mesa/native_display.h"
27#include "mir_toolkit/mesa/platform_operation.h"
2628
27#include <gtest/gtest.h>29#include <gtest/gtest.h>
30#include <gmock/gmock.h>
2831
29namespace mcl = mir::client;32namespace mcl = mir::client;
30namespace mclm = mir::client::mesa;33namespace mclm = mir::client::mesa;
31namespace mt = mir::test;
32namespace mtd = mir::test::doubles;
33namespace mtf = mir_test_framework;34namespace mtf = mir_test_framework;
3435
35TEST(MesaClientPlatformTest, egl_native_display_is_valid_until_released)36namespace
36{37{
37 auto platform = mtf::create_mesa_client_platform();38
39struct StubClientContext : mcl::ClientContext
40{
41 void populate_server_package(MirPlatformPackage& platform_package) override
42 {
43 platform_package.data_items = 0;
44 platform_package.fd_items = 1;
45 }
46
47};
48
49struct MesaClientPlatformTest : testing::Test
50{
51 MirPlatformMessage* set_gbm_device(gbm_device* dev)
52 {
53 auto request_msg = mir::raii::deleter_for(
54 mir_platform_message_create(MirMesaPlatformOperation::set_gbm_device),
55 &mir_platform_message_release);
56 MirMesaSetGBMDeviceRequest const request{dev};
57 mir_platform_message_set_data(request_msg.get(), &request, sizeof(request));
58
59 return platform->platform_operation(request_msg.get());
60 }
61
62 StubClientContext client_context;
63 std::shared_ptr<mir::client::ClientPlatform> platform =
64 mtf::create_mesa_client_platform(&client_context);
65};
66
67}
68
69TEST_F(MesaClientPlatformTest, egl_native_display_is_valid_until_released)
70{
38 auto platform_lib = mtf::get_platform_library();71 auto platform_lib = mtf::get_platform_library();
3972
40 MirMesaEGLNativeDisplay* nd;73 MirMesaEGLNativeDisplay* nd;
@@ -47,3 +80,41 @@
47 }80 }
48 EXPECT_EQ(MIR_MESA_FALSE, mclm::mir_client_mesa_egl_native_display_is_valid(nd));81 EXPECT_EQ(MIR_MESA_FALSE, mclm::mir_client_mesa_egl_native_display_is_valid(nd));
49}82}
83
84TEST_F(MesaClientPlatformTest, handles_set_gbm_device_platform_operation)
85{
86 using namespace testing;
87
88 int const success{0};
89 auto const gbm_dev_dummy = reinterpret_cast<gbm_device*>(this);
90
91 auto response_msg = mir::raii::deleter_for(
92 set_gbm_device(gbm_dev_dummy),
93 &mir_platform_message_release);
94
95 ASSERT_THAT(response_msg, NotNull());
96 auto const response_data = mir_platform_message_get_data(response_msg.get());
97 ASSERT_THAT(response_data.size, Eq(sizeof(MirMesaSetGBMDeviceResponse)));
98 auto const response_ptr =
99 reinterpret_cast<MirMesaSetGBMDeviceResponse const*>(response_data.data);
100 EXPECT_THAT(response_ptr->status, Eq(success));
101}
102
103TEST_F(MesaClientPlatformTest, appends_gbm_device_to_platform_package)
104{
105 using namespace testing;
106
107 MirPlatformPackage pkg;
108 platform->populate(pkg);
109 int const previous_data_count{pkg.data_items};
110 auto const gbm_dev_dummy = reinterpret_cast<gbm_device*>(this);
111
112 auto response_msg = mir::raii::deleter_for(
113 set_gbm_device(gbm_dev_dummy),
114 &mir_platform_message_release);
115
116 platform->populate(pkg);
117 EXPECT_THAT(pkg.data_items, Eq(previous_data_count + (sizeof(gbm_dev_dummy) / sizeof(int))));
118 EXPECT_THAT(reinterpret_cast<struct gbm_device*>(pkg.data[previous_data_count]),
119 Eq(gbm_dev_dummy));
120}
50121
=== modified file 'tests/unit-tests/client/test_client_mir_surface.cpp'
--- tests/unit-tests/client/test_client_mir_surface.cpp 2015-01-30 14:38:25 +0000
+++ tests/unit-tests/client/test_client_mir_surface.cpp 2015-01-30 14:38:25 +0000
@@ -211,6 +211,12 @@
211 {211 {
212 }212 }
213213
214 MirPlatformMessage* platform_operation(
215 MirPlatformMessage const*) override
216 {
217 return nullptr;
218 }
219
214 std::shared_ptr<mcl::ClientBufferFactory> create_buffer_factory()220 std::shared_ptr<mcl::ClientBufferFactory> create_buffer_factory()
215 {221 {
216 return std::make_shared<mtd::StubClientBufferFactory>();222 return std::make_shared<mtd::StubClientBufferFactory>();
217223
=== modified file 'tests/unit-tests/client/test_mir_connection.cpp'
--- tests/unit-tests/client/test_mir_connection.cpp 2015-01-30 14:38:25 +0000
+++ tests/unit-tests/client/test_mir_connection.cpp 2015-01-30 14:38:25 +0000
@@ -28,6 +28,7 @@
28#include "src/client/mir_surface.h"28#include "src/client/mir_surface.h"
29#include "mir/client_buffer_factory.h"29#include "mir/client_buffer_factory.h"
30#include "mir/dispatch/dispatchable.h"30#include "mir/dispatch/dispatchable.h"
31#include "mir/raii.h"
3132
32#include "src/server/frontend/resource_cache.h" /* needed by test_server.h */33#include "src/server/frontend/resource_cache.h" /* needed by test_server.h */
33#include "mir_test/test_protobuf_server.h"34#include "mir_test/test_protobuf_server.h"
@@ -74,12 +75,19 @@
74 {75 {
75 configure_display_sent(static_cast<mp::DisplayConfiguration const*>(parameters));76 configure_display_sent(static_cast<mp::DisplayConfiguration const*>(parameters));
76 }77 }
78 else if (method->name() == "platform_operation")
79 {
80 platform_operation(static_cast<mp::PlatformOperationMessage const*>(parameters),
81 static_cast<mp::PlatformOperationMessage*>(response));
82 }
7783
78 complete->Run();84 complete->Run();
79 }85 }
8086
81 MOCK_METHOD2(connect, void(mp::ConnectParameters const*,mp::Connection*));87 MOCK_METHOD2(connect, void(mp::ConnectParameters const*,mp::Connection*));
82 MOCK_METHOD1(configure_display_sent, void(mp::DisplayConfiguration const*));88 MOCK_METHOD1(configure_display_sent, void(mp::DisplayConfiguration const*));
89 MOCK_METHOD2(platform_operation,
90 void(mp::PlatformOperationMessage const*, mp::PlatformOperationMessage*));
8391
84 MOCK_CONST_METHOD0(watch_fd, mir::Fd());92 MOCK_CONST_METHOD0(watch_fd, mir::Fd());
85 MOCK_METHOD1(dispatch, bool(md::FdEvents));93 MOCK_METHOD1(dispatch, bool(md::FdEvents));
@@ -101,6 +109,8 @@
101 .WillByDefault(Return(std::make_shared<mtd::StubClientBufferFactory>()));109 .WillByDefault(Return(std::make_shared<mtd::StubClientBufferFactory>()));
102 ON_CALL(*this, create_egl_native_window(_))110 ON_CALL(*this, create_egl_native_window(_))
103 .WillByDefault(Return(std::shared_ptr<EGLNativeWindowType>()));111 .WillByDefault(Return(std::shared_ptr<EGLNativeWindowType>()));
112 ON_CALL(*this, platform_operation(_))
113 .WillByDefault(Return(nullptr));
104 }114 }
105115
106 void set_client_context(mcl::ClientContext* ctx)116 void set_client_context(mcl::ClientContext* ctx)
@@ -115,6 +125,7 @@
115125
116 MOCK_CONST_METHOD1(convert_native_buffer, MirNativeBuffer*(mir::graphics::NativeBuffer*));126 MOCK_CONST_METHOD1(convert_native_buffer, MirNativeBuffer*(mir::graphics::NativeBuffer*));
117 MOCK_CONST_METHOD0(platform_type, MirPlatformType());127 MOCK_CONST_METHOD0(platform_type, MirPlatformType());
128 MOCK_METHOD1(platform_operation, MirPlatformMessage*(MirPlatformMessage const*));
118 MOCK_METHOD0(create_buffer_factory, std::shared_ptr<mcl::ClientBufferFactory>());129 MOCK_METHOD0(create_buffer_factory, std::shared_ptr<mcl::ClientBufferFactory>());
119 MOCK_METHOD1(create_egl_native_window, std::shared_ptr<EGLNativeWindowType>(mcl::EGLNativeSurface*));130 MOCK_METHOD1(create_egl_native_window, std::shared_ptr<EGLNativeWindowType>(mcl::EGLNativeSurface*));
120 MOCK_METHOD0(create_egl_native_display, std::shared_ptr<EGLNativeDisplayType>());131 MOCK_METHOD0(create_egl_native_display, std::shared_ptr<EGLNativeDisplayType>());
@@ -568,46 +579,72 @@
568namespace579namespace
569{580{
570581
571ACTION_P(FillPlatformDataWith, sample_data)582void assign_response(MirConnection*, MirPlatformMessage* response, void* context)
572{583{
573 for (auto d : sample_data)584 auto response_ptr = static_cast<MirPlatformMessage**>(context);
574 arg1->mutable_platform()->add_data(d);585 *response_ptr = response;
575}586}
576587
577}588ACTION(CopyRequestToResponse)
578589{
579TEST_F(MirConnectionTest, sets_extra_platform_data)590 *arg1 = *arg0;
580{591}
581 using namespace testing;592}
582 std::vector<int> const initial_data{0x66, 0x67, 0x68};593
583 std::vector<int> const extra_data{0x11, 0x12, 0x13};594TEST_F(MirConnectionTest, uses_client_platform_for_platform_operation)
584595{
585 EXPECT_CALL(*mock_channel, connect(_,_))596 using namespace testing;
586 .WillOnce(FillPlatformDataWith(initial_data));597
587598 unsigned int const opcode{42};
588 MirWaitHandle *wait_handle =599 auto const request = mir::raii::deleter_for(
589 connection->connect("MirClientSurfaceTest", &connected_callback, nullptr);600 mir_platform_message_create(opcode),
590 wait_handle->wait_for_all();601 &mir_platform_message_release);
591602 auto const response = mir::raii::deleter_for(
592 MirPlatformPackage pkg;603 mir_platform_message_create(opcode),
593604 &mir_platform_message_release);
594 /* Check initial data */605
595 connection->populate(pkg);606 EXPECT_CALL(*mock_platform, platform_operation(request.get()))
596607 .WillOnce(Return(response.get()));
597 EXPECT_EQ(initial_data.size(), static_cast<size_t>(pkg.data_items));608 EXPECT_CALL(*mock_channel, platform_operation(_,_))
598 for (size_t i = 0; i < initial_data.size(); i++)609 .Times(0);
599 EXPECT_EQ(initial_data[i], pkg.data[i]) << " i=" << i;610
600611 auto connect_wh =
601 /* Check initial data plus extra data*/612 connection->connect("MirClientSurfaceTest", &connected_callback, nullptr);
602 connection->set_extra_platform_data(extra_data);613 mir_wait_for(connect_wh);
603 connection->populate(pkg);614
604615 MirPlatformMessage* returned_response{nullptr};
605 EXPECT_EQ(initial_data.size() + extra_data.size(),616
606 static_cast<size_t>(pkg.data_items));617 auto op_wh = connection->platform_operation(
607618 opcode, request.get(), assign_response, &returned_response);
608 for (size_t i = 0; i < initial_data.size(); i++)619 mir_wait_for(op_wh);
609 EXPECT_EQ(initial_data[i], pkg.data[i]) << " i=" << i;620
610621 EXPECT_THAT(returned_response, Eq(response.get()));
611 for (size_t i = 0; i < extra_data.size(); i++)622}
612 EXPECT_EQ(extra_data[i], pkg.data[i + initial_data.size()]) << " i=" << i;623
624TEST_F(MirConnectionTest, contacts_server_if_client_platform_cannot_handle_platform_operation)
625{
626 using namespace testing;
627
628 unsigned int const opcode{42};
629 auto const request = mir::raii::deleter_for(
630 mir_platform_message_create(opcode),
631 &mir_platform_message_release);
632
633 EXPECT_CALL(*mock_platform, platform_operation(_))
634 .WillOnce(Return(nullptr));
635 EXPECT_CALL(*mock_channel, platform_operation(_,_))
636 .WillOnce(CopyRequestToResponse());
637
638 auto connect_wh =
639 connection->connect("MirClientSurfaceTest", &connected_callback, nullptr);
640 mir_wait_for(connect_wh);
641
642 MirPlatformMessage* returned_response{nullptr};
643
644 auto op_wh = connection->platform_operation(
645 opcode, request.get(), assign_response, &returned_response);
646 mir_wait_for(op_wh);
647
648 EXPECT_THAT(mir_platform_message_get_opcode(returned_response), Eq(opcode));
649 mir_platform_message_release(returned_response);
613}650}

Subscribers

People subscribed via source and target branches