blob: 8fa23d735dc784cf37090dbccadd71bd4f28dfa7 [file] [log] [blame]
// Copyright 2024 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.
#ifndef SRC_GRAPHICS_DISPLAY_DRIVERS_VIRTIO_GUEST_V1_DISPLAY_CONTROLLER_BANJO_H_
#define SRC_GRAPHICS_DISPLAY_DRIVERS_VIRTIO_GUEST_V1_DISPLAY_CONTROLLER_BANJO_H_
#include <fuchsia/hardware/display/controller/cpp/banjo.h>
#include <lib/stdcompat/span.h>
#include <zircon/compiler.h>
#include <zircon/types.h>
#include <cstdint>
#include "src/graphics/display/drivers/virtio-guest/v1/display-coordinator-events-banjo.h"
#include "src/graphics/display/drivers/virtio-guest/v1/display-engine.h"
namespace virtio_display {
// Banjo <-> C++ bridge for the methods interface with the Display Coordinator.
//
// Instances are thread-safe, because Banjo does not make any threading
// guarantees.
class DisplayControllerBanjo : public ddk::DisplayControllerImplProtocol<DisplayControllerBanjo> {
public:
// `engine` and `coordinator_events` must not be null, and must outlive the
// newly created instance.
explicit DisplayControllerBanjo(DisplayEngine* engine,
DisplayCoordinatorEventsBanjo* coordinator_events);
DisplayControllerBanjo(const DisplayControllerBanjo&) = delete;
DisplayControllerBanjo& operator=(const DisplayControllerBanjo&) = delete;
~DisplayControllerBanjo();
// ddk::DisplayControllerImplProtocol
void DisplayControllerImplSetDisplayControllerInterface(
const display_controller_interface_protocol_t* display_controller_interface);
void DisplayControllerImplResetDisplayControllerInterface();
zx_status_t DisplayControllerImplImportBufferCollection(
uint64_t banjo_driver_buffer_collection_id, zx::channel buffer_collection_token);
zx_status_t DisplayControllerImplReleaseBufferCollection(
uint64_t banjo_driver_buffer_collection_id);
zx_status_t DisplayControllerImplImportImage(const image_metadata_t* banjo_image_metadata,
uint64_t banjo_driver_buffer_collection_id,
uint32_t index, uint64_t* out_image_handle);
zx_status_t DisplayControllerImplImportImageForCapture(uint64_t banjo_driver_buffer_collection_id,
uint32_t index,
uint64_t* out_capture_handle);
void DisplayControllerImplReleaseImage(uint64_t banjo_image_handle);
config_check_result_t DisplayControllerImplCheckConfiguration(
const display_config_t** banjo_display_configs, size_t banjo_display_configs_count,
client_composition_opcode_t* out_client_composition_opcodes_list,
size_t out_client_composition_opcodes_size, size_t* out_client_composition_opcodes_actual);
void DisplayControllerImplApplyConfiguration(const display_config_t** banjo_display_configs,
size_t banjo_display_configs_count,
const config_stamp_t* banjo_config_stamp);
void DisplayControllerImplSetEld(uint64_t banjo_display_id, const uint8_t* raw_eld_list,
size_t raw_eld_count);
zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
const image_buffer_usage_t* banjo_image_buffer_usage,
uint64_t banjo_driver_buffer_collection_id);
zx_status_t DisplayControllerImplSetDisplayPower(uint64_t banjo_display_id, bool power_on);
bool DisplayControllerImplIsCaptureSupported();
zx_status_t DisplayControllerImplStartCapture(uint64_t capture_handle);
zx_status_t DisplayControllerImplReleaseCapture(uint64_t capture_handle);
bool DisplayControllerImplIsCaptureCompleted();
zx_status_t DisplayControllerImplSetMinimumRgb(uint8_t minimum_rgb);
zx_status_t DdkGetProtocol(uint32_t proto_id, void* out);
private:
// This data member is thread-safe because it is immutable.
DisplayEngine& engine_;
// This data member is thread-safe because it is immutable.
DisplayCoordinatorEventsBanjo& coordinator_events_;
};
} // namespace virtio_display
#endif // SRC_GRAPHICS_DISPLAY_DRIVERS_VIRTIO_GUEST_V1_DISPLAY_CONTROLLER_BANJO_H_