/* * Copyright (c) 2022, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include namespace Kernel { class BochsDisplayConnector : public DisplayConnector { friend class BochsGraphicsAdapter; friend class DeviceManagement; public: TYPEDEF_DISTINCT_ORDERED_ID(u16, IndexID); static NonnullRefPtr must_create(PhysicalAddress framebuffer_address); virtual IndexID index_id() const; protected: ErrorOr create_attached_framebuffer_console(); explicit BochsDisplayConnector(PhysicalAddress framebuffer_address); virtual bool mutable_mode_setting_capable() const override final { return true; } virtual bool double_framebuffering_capable() const override { return false; } virtual ErrorOr set_mode_setting(ModeSetting const&) override; virtual ErrorOr set_safe_mode_setting() override final; virtual ErrorOr set_y_offset(size_t y) override; virtual ErrorOr unblank() override; virtual bool partial_flush_support() const override final { return false; } virtual bool flush_support() const override final { return false; } // Note: Paravirtualized hardware doesn't require a defined refresh rate for modesetting. virtual bool refresh_rate_support() const override final { return false; } virtual ErrorOr write_to_first_surface(u64 offset, UserOrKernelBuffer const&, size_t length) override final; virtual ErrorOr flush_first_surface() override final; virtual void enable_console() override final; virtual void disable_console() override final; const PhysicalAddress m_framebuffer_address; RefPtr m_framebuffer_console; OwnPtr m_framebuffer_region; u8* m_framebuffer_data {}; }; }