blob: 49a480044f0aa5d25fa0aec35a8ce96c7777e034 [file] [log] [blame] [edit]
// Copyright 2023 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/graphics/display/drivers/coordinator/engine-driver-client.h"
#include <lib/driver/logging/cpp/logger.h>
#include <lib/zx/result.h>
#include <zircon/assert.h>
#include <zircon/errors.h>
#include <fbl/alloc_checker.h>
#include "src/graphics/display/drivers/coordinator/engine-driver-client-fidl.h"
namespace display_coordinator {
namespace {
zx::result<std::unique_ptr<EngineDriverClient>> CreateFidlEngineDriverClient(
fdf::Namespace& incoming) {
zx::result<fdf::ClientEnd<fuchsia_hardware_display_engine::Engine>> connect_engine_client_result =
incoming.Connect<fuchsia_hardware_display_engine::Service::Engine>();
if (connect_engine_client_result.is_error()) {
fdf::warn("Failed to connect to display engine FIDL client: {}", connect_engine_client_result);
return connect_engine_client_result.take_error();
}
fdf::ClientEnd<fuchsia_hardware_display_engine::Engine> engine_client =
std::move(connect_engine_client_result).value();
if (!engine_client.is_valid()) {
fdf::warn("Display engine FIDL device is invalid");
return zx::error(ZX_ERR_BAD_HANDLE);
}
fbl::AllocChecker alloc_checker;
auto engine_driver_client =
fbl::make_unique_checked<EngineDriverClientFidl>(&alloc_checker, std::move(engine_client));
if (!alloc_checker.check()) {
fdf::warn("Failed to allocate memory for EngineDriverClientFidl");
return zx::error(ZX_ERR_NO_MEMORY);
}
return zx::ok(std::move(engine_driver_client));
}
} // namespace
// static
zx::result<std::unique_ptr<EngineDriverClient>> EngineDriverClient::Create(
std::shared_ptr<fdf::Namespace> incoming) {
ZX_DEBUG_ASSERT(incoming != nullptr);
// Attempt to connect to FIDL protocol.
zx::result<std::unique_ptr<EngineDriverClient>> fidl_engine_driver_client_result =
CreateFidlEngineDriverClient(*incoming);
if (fidl_engine_driver_client_result.is_ok()) {
fdf::info("Using the FIDL Engine driver client");
return fidl_engine_driver_client_result.take_value();
}
fdf::error("Failed to create FIDL Engine driver client: {}", fidl_engine_driver_client_result);
return fidl_engine_driver_client_result;
}
} // namespace display_coordinator