blob: 02c0f494ba1d438fbc1008fb143365262634068e [file] [log] [blame] [edit]
// Copyright 2025 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-fidl.h"
#include <fidl/fuchsia.hardware.display.engine/cpp/wire.h>
#include <lib/driver/logging/cpp/logger.h>
#include <lib/fdf/cpp/arena.h>
#include <lib/fdf/dispatcher.h>
#include <lib/fit/result.h>
#include <lib/zx/result.h>
#include <zircon/assert.h>
#include <zircon/errors.h>
#include <zircon/status.h>
#include "src/graphics/display/drivers/coordinator/fidl-conversion.h"
namespace display_coordinator {
namespace {
constexpr fdf_arena_tag_t kArenaTag = 'DISP';
} // namespace
EngineDriverClientFidl::EngineDriverClientFidl(
fdf::ClientEnd<fuchsia_hardware_display_engine::Engine> fidl_engine)
: fidl_engine_(std::move(fidl_engine)) {
ZX_DEBUG_ASSERT(fidl_engine_.is_valid());
}
EngineDriverClientFidl::~EngineDriverClientFidl() = default;
void EngineDriverClientFidl::ReleaseImage(display::DriverImageId driver_image_id) {
fdf::Arena arena(kArenaTag);
fidl::OneWayStatus fidl_transport_status =
fidl_engine_.buffer(arena)->ReleaseImage(driver_image_id.ToFidl());
ZX_ASSERT_MSG(fidl_transport_status.ok(), "FIDL error calling ReleaseImage: %s",
fidl_transport_status.FormatDescription().c_str());
}
zx::result<> EngineDriverClientFidl::ReleaseCapture(
display::DriverCaptureImageId driver_capture_image_id) {
fdf::Arena arena(kArenaTag);
fdf::WireUnownedResult<fuchsia_hardware_display_engine::Engine::ReleaseCapture>
fidl_transport_result =
fidl_engine_.buffer(arena)->ReleaseCapture(driver_capture_image_id.ToFidl());
ZX_ASSERT_MSG(fidl_transport_result.ok(), "FIDL error calling ReleaseCapture: %s",
fidl_transport_result.FormatDescription().c_str());
fit::result<zx_status_t>& fidl_domain_result = fidl_transport_result.value();
if (fidl_domain_result.is_error()) {
return zx::error(fidl_domain_result.error_value());
}
return zx::ok();
}
display::ConfigCheckResult EngineDriverClientFidl::CheckConfiguration(
const DriverDisplayConfig& driver_display_config,
std::span<const display::DriverLayer> layers) {
fdf::Arena arena(kArenaTag);
fuchsia_hardware_display_engine::wire::DisplayConfig fidl_config =
ToFidlDisplayConfig(driver_display_config, layers, arena);
fdf::WireUnownedResult<fuchsia_hardware_display_engine::Engine::CheckConfiguration>
fidl_transport_result = fidl_engine_.buffer(arena)->CheckConfiguration(fidl_config);
ZX_ASSERT_MSG(fidl_transport_result.ok(), "FIDL error calling CheckConfiguration: %s",
fidl_transport_result.FormatDescription().c_str());
fit::result<fuchsia_hardware_display_types::ConfigResult>& fidl_domain_result =
fidl_transport_result.value();
if (fidl_domain_result.is_error()) {
return display::ConfigCheckResult(fidl_domain_result.error_value());
}
return display::ConfigCheckResult::kOk;
}
void EngineDriverClientFidl::ApplyConfiguration(const DriverDisplayConfig& driver_display_config,
std::span<const display::DriverLayer> layers,
display::DriverConfigStamp config_stamp) {
fdf::Arena arena(kArenaTag);
fuchsia_hardware_display_engine::wire::DisplayConfig fidl_config =
ToFidlDisplayConfig(driver_display_config, layers, arena);
fdf::WireUnownedResult<::fuchsia_hardware_display_engine::Engine::ApplyConfiguration>
fidl_transport_result =
fidl_engine_.buffer(arena)->ApplyConfiguration(fidl_config, config_stamp.ToFidl());
ZX_ASSERT_MSG(fidl_transport_result.ok(), "FIDL error calling ApplyConfiguration: %s",
fidl_transport_result.FormatDescription().c_str());
}
display::EngineInfo EngineDriverClientFidl::CompleteCoordinatorConnection(
fdf::ClientEnd<fuchsia_hardware_display_engine::EngineListener> fidl_listener_client) {
fdf::Arena arena(kArenaTag);
fdf::WireUnownedResult<fuchsia_hardware_display_engine::Engine::CompleteCoordinatorConnection>
fidl_transport_result = fidl_engine_.buffer(arena)->CompleteCoordinatorConnection(
std::move(fidl_listener_client));
ZX_ASSERT_MSG(fidl_transport_result.ok(), "FIDL error calling CompleteCoordinatorConnection: %s",
fidl_transport_result.FormatDescription().c_str());
fuchsia_hardware_display_engine::wire::EngineCompleteCoordinatorConnectionResponse&
fidl_domain_result = fidl_transport_result.value();
return display::EngineInfo::From(fidl_domain_result.engine_info);
}
void EngineDriverClientFidl::UnsetListener() {
fdf::Arena arena(kArenaTag);
fidl::OneWayStatus fidl_transport_status = fidl_engine_.buffer(arena)->UnsetListener();
ZX_ASSERT_MSG(fidl_transport_status.ok(), "FIDL error calling UnsetListener: %s",
fidl_transport_status.FormatDescription().c_str());
}
zx::result<display::DriverImageId> EngineDriverClientFidl::ImportImage(
const display::ImageMetadata& image_metadata, display::DriverBufferCollectionId collection_id,
uint32_t index) {
fdf::Arena arena(kArenaTag);
fdf::WireUnownedResult<fuchsia_hardware_display_engine::Engine::ImportImage>
fidl_transport_result = fidl_engine_.buffer(arena)->ImportImage(
image_metadata.ToFidl(), collection_id.ToFidl(), index);
ZX_ASSERT_MSG(fidl_transport_result.ok(), "FIDL error calling ImportImage: %s",
fidl_transport_result.FormatDescription().c_str());
fit::result<zx_status_t, fuchsia_hardware_display_engine::wire::EngineImportImageResponse*>&
fidl_domain_result = fidl_transport_result.value();
if (fidl_domain_result.is_error()) {
return zx::error(fidl_domain_result.error_value());
}
return zx::ok(display::DriverImageId(fidl_domain_result.value()->image_id.value));
}
zx::result<display::DriverCaptureImageId> EngineDriverClientFidl::ImportImageForCapture(
display::DriverBufferCollectionId collection_id, uint32_t index) {
fdf::Arena arena(kArenaTag);
fdf::WireUnownedResult<fuchsia_hardware_display_engine::Engine::ImportImageForCapture>
fidl_transport_result =
fidl_engine_.buffer(arena)->ImportImageForCapture(collection_id.ToFidl(), index);
ZX_ASSERT_MSG(fidl_transport_result.ok(), "FIDL error calling ImportImageForCapture: %s",
fidl_transport_result.FormatDescription().c_str());
fit::result<zx_status_t,
fuchsia_hardware_display_engine::wire::EngineImportImageForCaptureResponse*>&
fidl_domain_result = fidl_transport_result.value();
if (fidl_domain_result.is_error()) {
return zx::error(fidl_domain_result.error_value());
}
fuchsia_hardware_display_engine::wire::ImageId image_id =
fidl_domain_result.value()->capture_image_id;
return zx::ok(display::DriverCaptureImageId(image_id.value));
}
zx::result<> EngineDriverClientFidl::ImportBufferCollection(
display::DriverBufferCollectionId collection_id,
fidl::ClientEnd<fuchsia_sysmem2::BufferCollectionToken> collection_token) {
fdf::Arena arena(kArenaTag);
fdf::WireUnownedResult<fuchsia_hardware_display_engine::Engine::ImportBufferCollection>
fidl_transport_result = fidl_engine_.buffer(arena)->ImportBufferCollection(
collection_id.ToFidl(), std::move(collection_token));
ZX_ASSERT_MSG(fidl_transport_result.ok(), "FIDL error calling ImportBufferCollection: %s",
fidl_transport_result.FormatDescription().c_str());
fit::result<zx_status_t>& fidl_domain_result = fidl_transport_result.value();
if (fidl_domain_result.is_error()) {
return zx::error(fidl_domain_result.error_value());
}
return zx::ok();
}
zx::result<> EngineDriverClientFidl::ReleaseBufferCollection(
display::DriverBufferCollectionId collection_id) {
fdf::Arena arena(kArenaTag);
fdf::WireUnownedResult<fuchsia_hardware_display_engine::Engine::ReleaseBufferCollection>
fidl_transport_result =
fidl_engine_.buffer(arena)->ReleaseBufferCollection(collection_id.ToFidl());
ZX_ASSERT_MSG(fidl_transport_result.ok(), "FIDL error calling ReleaseBufferCollection: %s",
fidl_transport_result.FormatDescription().c_str());
fit::result<zx_status_t>& fidl_domain_result = fidl_transport_result.value();
if (fidl_domain_result.is_error()) {
return zx::error(fidl_domain_result.error_value());
}
return zx::ok();
}
zx::result<> EngineDriverClientFidl::SetBufferCollectionConstraints(
const display::ImageBufferUsage& usage, display::DriverBufferCollectionId collection_id) {
fdf::Arena arena(kArenaTag);
fdf::WireUnownedResult<fuchsia_hardware_display_engine::Engine::SetBufferCollectionConstraints>
fidl_transport_result = fidl_engine_.buffer(arena)->SetBufferCollectionConstraints(
usage.ToFidl(), collection_id.ToFidl());
ZX_ASSERT_MSG(fidl_transport_result.ok(), "FIDL error calling SetBufferCollectionConstraints: %s",
fidl_transport_result.FormatDescription().c_str());
fit::result<zx_status_t>& fidl_domain_result = fidl_transport_result.value();
if (fidl_domain_result.is_error()) {
return zx::error(fidl_domain_result.error_value());
}
return zx::ok();
}
zx::result<> EngineDriverClientFidl::StartCapture(
display::DriverCaptureImageId driver_capture_image_id) {
fdf::Arena arena(kArenaTag);
fdf::WireUnownedResult<fuchsia_hardware_display_engine::Engine::StartCapture>
fidl_transport_result =
fidl_engine_.buffer(arena)->StartCapture(driver_capture_image_id.ToFidl());
ZX_ASSERT_MSG(fidl_transport_result.ok(), "FIDL error calling StartCapture: %s",
fidl_transport_result.FormatDescription().c_str());
fit::result<zx_status_t>& fidl_domain_result = fidl_transport_result.value();
if (fidl_domain_result.is_error()) {
return zx::error(fidl_domain_result.error_value());
}
return zx::ok();
}
zx::result<> EngineDriverClientFidl::SetDisplayPower(display::DisplayId display_id, bool power_on) {
fdf::Arena arena(kArenaTag);
fdf::WireUnownedResult<fuchsia_hardware_display_engine::Engine::SetDisplayPower>
fidl_transport_result =
fidl_engine_.buffer(arena)->SetDisplayPower(display_id.ToFidl(), power_on);
ZX_ASSERT_MSG(fidl_transport_result.ok(), "FIDL error calling SetDisplayPower: %s",
fidl_transport_result.FormatDescription().c_str());
fit::result<zx_status_t>& fidl_domain_result = fidl_transport_result.value();
if (fidl_domain_result.is_error()) {
return zx::error(fidl_domain_result.error_value());
}
return zx::ok();
}
zx::result<> EngineDriverClientFidl::SetMinimumRgb(uint8_t minimum_rgb) {
fdf::Arena arena(kArenaTag);
fdf::WireUnownedResult<fuchsia_hardware_display_engine::Engine::SetMinimumRgb>
fidl_transport_result = fidl_engine_.buffer(arena)->SetMinimumRgb(minimum_rgb);
ZX_ASSERT_MSG(fidl_transport_result.ok(), "FIDL error calling SetMinimumRgb: %s",
fidl_transport_result.FormatDescription().c_str());
fit::result<zx_status_t>& fidl_domain_result = fidl_transport_result.value();
if (fidl_domain_result.is_error()) {
return zx::error(fidl_domain_result.error_value());
}
return zx::ok();
}
} // namespace display_coordinator