diff options
author | Sahan Fernando <sahan.h.fernando@gmail.com> | 2021-06-12 22:30:05 +1000 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-06-25 19:26:30 +0200 |
commit | 34e9fa4d3be0284ac120e885ab920bb6024e4f04 (patch) | |
tree | 93f68ce4b61cb50f7440d4558b969d8f23341b2a /Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp | |
parent | cf1c8eb77862b9ef489619c73d16ace92b0aedf9 (diff) | |
download | serenity-34e9fa4d3be0284ac120e885ab920bb6024e4f04.zip |
Kernel: Abstract FramebufferConsole away from contiguous physical range
Currently, Kernel::Graphics::FramebufferConsole is written assuming that
the underlying framebuffer memory exists in physically contiguous
memory. There are a bunch of framebuffer devices that would need to use
the components of FramebufferConsole (in particular access to the kernel
bitmap font rendering logic). To reduce code duplication, framebuffer
console has been split into two parts, the abstract
GenericFramebufferConsole class which does the rendering, and the
ContiguousFramebufferConsole class which contains all logic related to
managing the underling vm object.
Also, a new flush method has been added to the class, to support devices
that require an extra flush step to render.
Diffstat (limited to 'Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp')
-rw-r--r-- | Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp b/Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp new file mode 100644 index 0000000000..12a7cd45ca --- /dev/null +++ b/Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021, Sahan Fernando <sahan.h.fernando@gmail.com> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <Kernel/Graphics/Console/ContiguousFramebufferConsole.h> +#include <Kernel/TTY/ConsoleManagement.h> + +namespace Kernel::Graphics { + +NonnullRefPtr<ContiguousFramebufferConsole> ContiguousFramebufferConsole::initialize(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch) +{ + return adopt_ref(*new ContiguousFramebufferConsole(framebuffer_address, width, height, pitch)); +} + +ContiguousFramebufferConsole::ContiguousFramebufferConsole(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch) + : GenericFramebufferConsole(width, height, pitch) + , m_framebuffer_address(framebuffer_address) +{ + set_resolution(width, height, pitch); +} + +void ContiguousFramebufferConsole::set_resolution(size_t width, size_t height, size_t pitch) +{ + m_width = width; + m_height = height; + m_pitch = pitch; + + dbgln("Framebuffer Console: taking {} bytes", page_round_up(pitch * height)); + m_framebuffer_region = MM.allocate_kernel_region(m_framebuffer_address, page_round_up(pitch * height), "Framebuffer Console", Region::Access::Read | Region::Access::Write, Region::Cacheable::Yes); + VERIFY(m_framebuffer_region); + + // Just to start cleanly, we clean the entire framebuffer + memset(m_framebuffer_region->vaddr().as_ptr(), 0, pitch * height); + + ConsoleManagement::the().resolution_was_changed(); +} + +} |