Serenity Operating System
at master 62 lines 2.2 kB view raw
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}