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/Graphics/VMWare/Console.h>
8#include <Kernel/WorkQueue.h>
9
10namespace Kernel {
11
12constexpr static AK::Time refresh_interval = AK::Time::from_milliseconds(16);
13
14NonnullLockRefPtr<VMWareFramebufferConsole> VMWareFramebufferConsole::initialize(VMWareDisplayConnector& parent_display_connector)
15{
16 auto current_resolution = parent_display_connector.current_mode_setting();
17 return adopt_lock_ref(*new (nothrow) VMWareFramebufferConsole(parent_display_connector, current_resolution));
18}
19
20VMWareFramebufferConsole::VMWareFramebufferConsole(VMWareDisplayConnector const& parent_display_connector, DisplayConnector::ModeSetting current_resolution)
21 : GenericFramebufferConsole(current_resolution.horizontal_active, current_resolution.vertical_active, current_resolution.horizontal_stride)
22 , m_parent_display_connector(parent_display_connector)
23{
24 enqueue_refresh_timer();
25}
26
27void VMWareFramebufferConsole::set_resolution(size_t width, size_t height, size_t pitch)
28{
29 m_width = width;
30 m_height = height;
31 m_pitch = pitch;
32 m_dirty = true;
33}
34
35void VMWareFramebufferConsole::flush(size_t, size_t, size_t, size_t)
36{
37 m_dirty = true;
38}
39
40void VMWareFramebufferConsole::enqueue_refresh_timer()
41{
42 NonnullLockRefPtr<Timer> refresh_timer = adopt_lock_ref(*new (nothrow) Timer());
43 refresh_timer->setup(CLOCK_MONOTONIC, refresh_interval, [this]() {
44 if (m_enabled.load() && m_dirty) {
45 MUST(g_io_work->try_queue([this]() {
46 MUST(m_parent_display_connector->flush_first_surface());
47 m_dirty = false;
48 }));
49 }
50 enqueue_refresh_timer();
51 });
52 TimerQueue::the().add_timer(move(refresh_timer));
53}
54
55void VMWareFramebufferConsole::enable()
56{
57 auto current_resolution = m_parent_display_connector->current_mode_setting();
58 GenericFramebufferConsole::enable();
59 m_width = current_resolution.horizontal_active;
60 m_height = current_resolution.vertical_active;
61 m_pitch = current_resolution.horizontal_stride;
62}
63
64u8* VMWareFramebufferConsole::framebuffer_data()
65{
66 return m_parent_display_connector->framebuffer_data();
67}
68
69}