Serenity Operating System
1/*
2 * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <Kernel/Devices/DeviceManagement.h>
8#include <Kernel/Graphics/Console/ContiguousFramebufferConsole.h>
9#include <Kernel/Graphics/Generic/DisplayConnector.h>
10#include <Kernel/Graphics/GraphicsManagement.h>
11
12namespace Kernel {
13
14NonnullLockRefPtr<GenericDisplayConnector> GenericDisplayConnector::must_create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch)
15{
16 auto device_or_error = DeviceManagement::try_create_device<GenericDisplayConnector>(framebuffer_address, width, height, pitch);
17 VERIFY(!device_or_error.is_error());
18 auto connector = device_or_error.release_value();
19 MUST(connector->create_attached_framebuffer_console());
20 MUST(connector->initialize_edid_for_generic_monitor({}));
21 return connector;
22}
23
24GenericDisplayConnector::GenericDisplayConnector(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch)
25 : DisplayConnector(framebuffer_address, height * pitch, true)
26{
27 m_current_mode_setting.horizontal_active = width;
28 m_current_mode_setting.vertical_active = height;
29 m_current_mode_setting.horizontal_stride = pitch;
30}
31
32ErrorOr<void> GenericDisplayConnector::create_attached_framebuffer_console()
33{
34 auto width = m_current_mode_setting.horizontal_active;
35 auto height = m_current_mode_setting.vertical_active;
36 auto pitch = m_current_mode_setting.horizontal_stride;
37
38 m_framebuffer_console = Graphics::ContiguousFramebufferConsole::initialize(m_framebuffer_address.value(), width, height, pitch);
39 GraphicsManagement::the().set_console(*m_framebuffer_console);
40 return {};
41}
42
43void GenericDisplayConnector::enable_console()
44{
45 VERIFY(m_control_lock.is_locked());
46 VERIFY(m_framebuffer_console);
47 m_framebuffer_console->enable();
48}
49
50void GenericDisplayConnector::disable_console()
51{
52 VERIFY(m_control_lock.is_locked());
53 VERIFY(m_framebuffer_console);
54 m_framebuffer_console->disable();
55}
56
57ErrorOr<void> GenericDisplayConnector::flush_first_surface()
58{
59 return Error::from_errno(ENOTSUP);
60}
61
62}