70
70
std::vector<MirPixelFormat> const& surface_pixel_formats,
71
71
std::shared_ptr<SessionMediatorReport> const& report,
72
72
std::shared_ptr<EventSink> const& sender,
73
std::shared_ptr<ResourceCache> const& resource_cache,
73
std::shared_ptr<MessageResourceCache> const& resource_cache,
74
74
std::shared_ptr<Screencast> const& screencast,
75
75
ConnectionContext const& connection_context,
76
76
std::shared_ptr<mi::CursorImages> const& cursor_images) :
79
79
graphics_platform(graphics_platform),
80
ipc_operations(graphics_platform->make_ipc_operations()),
80
81
surface_pixel_formats(surface_pixel_formats),
81
82
display_changer(display_changer),
119
120
connection_context.handle_client_connect(session);
121
auto ipc_package = graphics_platform->get_ipc_package();
122
auto ipc_package = ipc_operations->connection_ipc_package();
122
123
auto platform = response->mutable_platform();
124
125
for (auto& data : ipc_package->ipc_data)
144
145
Surface& surface,
145
146
std::function<void(graphics::Buffer*, graphics::BufferIpcMsgType)> complete)
147
surface.swap_buffers(
148
surface_tracker.last_buffer(surf_id),
148
auto client_buffer = surface_tracker.last_buffer(surf_id);
151
//TODO: once we are doing an exchange_buffer, we should use the request buffer
152
static mir::protobuf::Buffer dummy_raw_msg;
153
mfd::ProtobufBufferPacker dummy_msg{&dummy_raw_msg};
154
ipc_operations->unpack_buffer(dummy_msg, *client_buffer);
157
surface.swap_buffers(
149
159
[this, surf_id, complete](mg::Buffer* new_buffer)
151
161
if (surface_tracker.track_buffer(surf_id, new_buffer))
260
void mf::SessionMediator::exchange_buffer(
261
google::protobuf::RpcController*,
262
mir::protobuf::BufferRequest const* request,
263
mir::protobuf::Buffer* response,
264
google::protobuf::Closure* done)
266
mf::SurfaceId const surface_id{request->id().value()};
267
mg::BufferID const buffer_id{static_cast<uint32_t>(request->buffer().buffer_id())};
269
auto const lock = std::make_shared<std::unique_lock<std::mutex>>(session_mutex);
270
auto const session = weak_session.lock();
272
BOOST_THROW_EXCEPTION(std::logic_error("Invalid application session"));
274
report->session_exchange_buffer_called(session->name());
276
auto const& surface = session->get_surface(surface_id);
277
surface->swap_buffers(
278
surface_tracker.buffer_from(buffer_id),
279
[this, surface_id, lock, response, done](mg::Buffer* new_buffer)
283
if (surface_tracker.track_buffer(surface_id, new_buffer))
284
pack_protobuf_buffer(*response, new_buffer, mg::BufferIpcMsgType::update_msg);
286
pack_protobuf_buffer(*response, new_buffer, mg::BufferIpcMsgType::full_msg);
251
292
void mf::SessionMediator::release_surface(
252
293
google::protobuf::RpcController* /*controller*/,
253
294
const mir::protobuf::SurfaceId* request,
529
570
auto const magic = static_cast<unsigned int>(request->magic());
571
//FIXME: don't dynamic cast like this drm_auth_magic should be a part of PlatformIpcOperations
530
572
auto authenticator = std::dynamic_pointer_cast<mg::DRMAuthenticator>(graphics_platform);
531
573
if (!authenticator)
532
574
BOOST_THROW_EXCEPTION(std::logic_error("drm_auth_magic request not supported by the active platform"));
610
652
protobuf_buffer.set_buffer_id(graphics_buffer->id().as_value());
612
mfd::ProtobufBufferPacker packer{&protobuf_buffer, resource_cache};
613
graphics_platform->fill_buffer_package(&packer, graphics_buffer, buffer_msg_type);
654
mfd::ProtobufBufferPacker packer{&protobuf_buffer};
655
ipc_operations->pack_buffer(packer, *graphics_buffer, buffer_msg_type);
657
for(auto const& fd : packer.fds())
658
resource_cache->save_fd(&protobuf_buffer, fd);