Skip to content

Commit

Permalink
Kernel: Put VirtIOGPU related types into a namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
ccapitalK authored and alimpfard committed Jul 18, 2021
1 parent 215f383 commit 1c77f80
Show file tree
Hide file tree
Showing 12 changed files with 326 additions and 300 deletions.
6 changes: 3 additions & 3 deletions Kernel/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,10 @@ set(KERNEL_SOURCES
Graphics/FramebufferDevice.cpp
Graphics/GraphicsManagement.cpp
Graphics/Intel/NativeGraphicsAdapter.cpp
Graphics/VirtIOGPU/VirtIOFrameBufferDevice.cpp
Graphics/VirtIOGPU/VirtIOGPUConsole.cpp
Graphics/VirtIOGPU/FrameBufferDevice.cpp
Graphics/VirtIOGPU/Console.cpp
Graphics/VirtIOGPU/VirtIOGPU.cpp
Graphics/VirtIOGPU/VirtIOGraphicsAdapter.cpp
Graphics/VirtIOGPU/GraphicsAdapter.cpp
Graphics/VGACompatibleAdapter.cpp
Storage/Partition/DiskPartition.cpp
Storage/Partition/DiskPartitionMetadata.cpp
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Graphics/GraphicsManagement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include <Kernel/Graphics/GraphicsManagement.h>
#include <Kernel/Graphics/Intel/NativeGraphicsAdapter.h>
#include <Kernel/Graphics/VGACompatibleAdapter.h>
#include <Kernel/Graphics/VirtIOGPU/VirtIOGraphicsAdapter.h>
#include <Kernel/Graphics/VirtIOGPU/GraphicsAdapter.h>
#include <Kernel/IO.h>
#include <Kernel/Multiboot.h>
#include <Kernel/Sections.h>
Expand Down Expand Up @@ -91,7 +91,7 @@ UNMAP_AFTER_INIT bool GraphicsManagement::determine_and_initialize_graphics_devi
break;
case PCI::VendorID::VirtIO:
dmesgln("Graphics: Using VirtIO console");
adapter = Graphics::VirtIOGraphicsAdapter::initialize(address);
adapter = Graphics::VirtIOGPU::GraphicsAdapter::initialize(address);
break;
default:
if (!is_vga_compatible_pci_device(address))
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Graphics/GraphicsManagement.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#include <Kernel/Graphics/Console/Console.h>
#include <Kernel/Graphics/GraphicsDevice.h>
#include <Kernel/Graphics/VGACompatibleAdapter.h>
#include <Kernel/Graphics/VirtIOGPU/VirtIOGraphicsAdapter.h>
#include <Kernel/Graphics/VirtIOGPU/GraphicsAdapter.h>
#include <Kernel/VM/Region.h>

namespace Kernel {
Expand All @@ -26,7 +26,7 @@ class GraphicsManagement {
friend class BochsGraphicsAdapter;
friend class IntelNativeGraphicsAdapter;
friend class VGACompatibleAdapter;
friend class Graphics::VirtIOGraphicsAdapter;
friend class Graphics::VirtIOGPU::GraphicsAdapter;
AK_MAKE_ETERNAL

public:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
* SPDX-License-Identifier: BSD-2-Clause
*/

#include <Kernel/Graphics/VirtIOGPU/VirtIOFrameBufferDevice.h>
#include <Kernel/Graphics/VirtIOGPU/VirtIOGPUConsole.h>
#include <Kernel/Graphics/VirtIOGPU/Console.h>
#include <Kernel/Graphics/VirtIOGPU/FrameBufferDevice.h>
#include <Kernel/WorkQueue.h>

namespace Kernel::Graphics {
namespace Kernel::Graphics::VirtIOGPU {

constexpr static AK::Time refresh_interval = AK::Time::from_milliseconds(16);

Expand All @@ -30,36 +30,36 @@ void DirtyRect::union_rect(size_t x, size_t y, size_t width, size_t height)
}
}

NonnullRefPtr<VirtIOGPUConsole> VirtIOGPUConsole::initialize(RefPtr<VirtIOFrameBufferDevice> const& framebuffer_device)
NonnullRefPtr<Console> Console::initialize(RefPtr<FrameBufferDevice> const& framebuffer_device)
{
return adopt_ref(*new VirtIOGPUConsole(framebuffer_device));
return adopt_ref(*new Console(framebuffer_device));
}

VirtIOGPUConsole::VirtIOGPUConsole(RefPtr<VirtIOFrameBufferDevice> const& framebuffer_device)
Console::Console(RefPtr<FrameBufferDevice> const& framebuffer_device)
: GenericFramebufferConsole(framebuffer_device->width(), framebuffer_device->height(), framebuffer_device->pitch())
, m_framebuffer_device(framebuffer_device)
{
enqueue_refresh_timer();
}

void VirtIOGPUConsole::set_resolution(size_t width, size_t height, size_t)
void Console::set_resolution(size_t width, size_t height, size_t)
{
auto did_set_resolution = m_framebuffer_device->try_to_set_resolution(width, height);
VERIFY(did_set_resolution);
}

void VirtIOGPUConsole::flush(size_t x, size_t y, size_t width, size_t height)
void Console::flush(size_t x, size_t y, size_t width, size_t height)
{
m_dirty_rect.union_rect(x, y, width, height);
}

void VirtIOGPUConsole::enqueue_refresh_timer()
void Console::enqueue_refresh_timer()
{
NonnullRefPtr<Timer> refresh_timer = adopt_ref(*new Timer());
refresh_timer->setup(CLOCK_MONOTONIC, refresh_interval, [this]() {
auto rect = m_dirty_rect;
if (rect.is_dirty()) {
VirtIOGPURect dirty_rect {
Protocol::Rect dirty_rect {
.x = (u32)rect.x(),
.y = (u32)rect.y(),
.width = (u32)rect.width(),
Expand All @@ -75,7 +75,7 @@ void VirtIOGPUConsole::enqueue_refresh_timer()
TimerQueue::the().add_timer(move(refresh_timer));
}

void VirtIOGPUConsole::enable()
void Console::enable()
{
GenericFramebufferConsole::enable();
m_width = m_framebuffer_device->width();
Expand All @@ -84,7 +84,7 @@ void VirtIOGPUConsole::enable()
m_dirty_rect.union_rect(0, 0, m_width, m_height);
}

u8* VirtIOGPUConsole::framebuffer_data()
u8* Console::framebuffer_data()
{
return m_framebuffer_device->framebuffer_data();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include <Kernel/Graphics/VirtIOGPU/VirtIOGPU.h>
#include <Kernel/TimerQueue.h>

namespace Kernel::Graphics {
namespace Kernel::Graphics::VirtIOGPU {

class DirtyRect {
public:
Expand All @@ -30,9 +30,9 @@ class DirtyRect {
size_t m_y1 { 0 };
};

class VirtIOGPUConsole final : public GenericFramebufferConsole {
class Console final : public GenericFramebufferConsole {
public:
static NonnullRefPtr<VirtIOGPUConsole> initialize(RefPtr<VirtIOFrameBufferDevice> const&);
static NonnullRefPtr<Console> initialize(RefPtr<FrameBufferDevice> const&);

virtual void set_resolution(size_t width, size_t height, size_t pitch) override;
virtual void flush(size_t x, size_t y, size_t width, size_t height) override;
Expand All @@ -42,8 +42,8 @@ class VirtIOGPUConsole final : public GenericFramebufferConsole {
void enqueue_refresh_timer();
virtual u8* framebuffer_data() override;

VirtIOGPUConsole(RefPtr<VirtIOFrameBufferDevice> const&);
RefPtr<VirtIOFrameBufferDevice> m_framebuffer_device;
Console(RefPtr<FrameBufferDevice> const&);
RefPtr<FrameBufferDevice> m_framebuffer_device;
DirtyRect m_dirty_rect;
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
*/

#include <Kernel/Graphics/GraphicsManagement.h>
#include <Kernel/Graphics/VirtIOGPU/VirtIOFrameBufferDevice.h>
#include <Kernel/Graphics/VirtIOGPU/FrameBufferDevice.h>
#include <LibC/sys/ioctl_numbers.h>

namespace Kernel::Graphics {
namespace Kernel::Graphics::VirtIOGPU {

VirtIOFrameBufferDevice::VirtIOFrameBufferDevice(VirtIOGPU& virtio_gpu, VirtIOGPUScanoutID scanout)
FrameBufferDevice::FrameBufferDevice(GPU& virtio_gpu, ScanoutID scanout)
: BlockDevice(29, GraphicsManagement::the().allocate_minor_device_number())
, m_gpu(virtio_gpu)
, m_scanout(scanout)
Expand All @@ -19,11 +19,11 @@ VirtIOFrameBufferDevice::VirtIOFrameBufferDevice(VirtIOGPU& virtio_gpu, VirtIOGP
create_framebuffer();
}

VirtIOFrameBufferDevice::~VirtIOFrameBufferDevice()
FrameBufferDevice::~FrameBufferDevice()
{
}

void VirtIOFrameBufferDevice::create_framebuffer()
void FrameBufferDevice::create_framebuffer()
{
// First delete any existing framebuffers to free the memory first
m_framebuffer = nullptr;
Expand All @@ -48,7 +48,7 @@ void VirtIOFrameBufferDevice::create_framebuffer()
create_buffer(m_back_buffer, m_buffer_size, m_buffer_size);
}

void VirtIOFrameBufferDevice::create_buffer(Buffer& buffer, size_t framebuffer_offset, size_t framebuffer_size)
void FrameBufferDevice::create_buffer(Buffer& buffer, size_t framebuffer_offset, size_t framebuffer_size)
{
buffer.framebuffer_offset = framebuffer_offset;
buffer.framebuffer_data = m_framebuffer->vaddr().as_ptr() + framebuffer_offset;
Expand Down Expand Up @@ -76,32 +76,32 @@ void VirtIOFrameBufferDevice::create_buffer(Buffer& buffer, size_t framebuffer_o
info.enabled = 1;
}

VirtIOGPURespDisplayInfo::VirtIOGPUDisplayOne const& VirtIOFrameBufferDevice::display_info() const
Protocol::DisplayInfoResponse::Display const& FrameBufferDevice::display_info() const
{
return m_gpu.display_info(m_scanout);
}

VirtIOGPURespDisplayInfo::VirtIOGPUDisplayOne& VirtIOFrameBufferDevice::display_info()
Protocol::DisplayInfoResponse::Display& FrameBufferDevice::display_info()
{
return m_gpu.display_info(m_scanout);
}

void VirtIOFrameBufferDevice::transfer_framebuffer_data_to_host(VirtIOGPURect const& rect, Buffer& buffer)
void FrameBufferDevice::transfer_framebuffer_data_to_host(Protocol::Rect const& rect, Buffer& buffer)
{
m_gpu.transfer_framebuffer_data_to_host(m_scanout, rect, buffer.resource_id);
}

void VirtIOFrameBufferDevice::flush_dirty_window(VirtIOGPURect const& dirty_rect, Buffer& buffer)
void FrameBufferDevice::flush_dirty_window(Protocol::Rect const& dirty_rect, Buffer& buffer)
{
m_gpu.flush_dirty_window(m_scanout, dirty_rect, buffer.resource_id);
}

void VirtIOFrameBufferDevice::flush_displayed_image(VirtIOGPURect const& dirty_rect, Buffer& buffer)
void FrameBufferDevice::flush_displayed_image(Protocol::Rect const& dirty_rect, Buffer& buffer)
{
m_gpu.flush_displayed_image(dirty_rect, buffer.resource_id);
}

bool VirtIOFrameBufferDevice::try_to_set_resolution(size_t width, size_t height)
bool FrameBufferDevice::try_to_set_resolution(size_t width, size_t height)
{
if (width > MAX_VIRTIOGPU_RESOLUTION_WIDTH || height > MAX_VIRTIOGPU_RESOLUTION_HEIGHT)
return false;
Expand All @@ -120,7 +120,7 @@ bool VirtIOFrameBufferDevice::try_to_set_resolution(size_t width, size_t height)
return true;
}

void VirtIOFrameBufferDevice::set_buffer(int buffer_index)
void FrameBufferDevice::set_buffer(int buffer_index)
{
auto& buffer = buffer_index == 0 ? m_main_buffer : m_back_buffer;
MutexLocker locker(m_gpu.operation_lock());
Expand All @@ -132,7 +132,7 @@ void VirtIOFrameBufferDevice::set_buffer(int buffer_index)
buffer.dirty_rect = {};
}

int VirtIOFrameBufferDevice::ioctl(FileDescription&, unsigned request, FlatPtr arg)
int FrameBufferDevice::ioctl(FileDescription&, unsigned request, FlatPtr arg)
{
REQUIRE_PROMISE(video);
switch (request) {
Expand Down Expand Up @@ -188,7 +188,7 @@ int VirtIOFrameBufferDevice::ioctl(FileDescription&, unsigned request, FlatPtr a
FBRect user_dirty_rect;
if (!copy_from_user(&user_dirty_rect, &user_flush_rects.rects[i]))
return -EFAULT;
VirtIOGPURect dirty_rect {
Protocol::Rect dirty_rect {
.x = user_dirty_rect.x,
.y = user_dirty_rect.y,
.width = user_dirty_rect.width,
Expand Down Expand Up @@ -231,7 +231,7 @@ int VirtIOFrameBufferDevice::ioctl(FileDescription&, unsigned request, FlatPtr a
};
}

KResultOr<Region*> VirtIOFrameBufferDevice::mmap(Process& process, FileDescription&, const Range& range, u64 offset, int prot, bool shared)
KResultOr<Region*> FrameBufferDevice::mmap(Process& process, FileDescription&, const Range& range, u64 offset, int prot, bool shared)
{
REQUIRE_PROMISE(video);
if (!shared)
Expand Down Expand Up @@ -262,7 +262,7 @@ KResultOr<Region*> VirtIOFrameBufferDevice::mmap(Process& process, FileDescripti
return result;
}

void VirtIOFrameBufferDevice::deactivate_writes()
void FrameBufferDevice::deactivate_writes()
{
m_are_writes_active = false;
if (m_userspace_mmap_region) {
Expand All @@ -276,7 +276,7 @@ void VirtIOFrameBufferDevice::deactivate_writes()
clear_to_black(buffer_from_index(0));
}

void VirtIOFrameBufferDevice::activate_writes()
void FrameBufferDevice::activate_writes()
{
m_are_writes_active = true;
auto last_set_buffer_index = m_last_set_buffer_index.load();
Expand All @@ -288,7 +288,7 @@ void VirtIOFrameBufferDevice::activate_writes()
set_buffer(last_set_buffer_index);
}

void VirtIOFrameBufferDevice::clear_to_black(Buffer& buffer)
void FrameBufferDevice::clear_to_black(Buffer& buffer)
{
auto& info = display_info();
size_t width = info.rect.width;
Expand All @@ -302,7 +302,7 @@ void VirtIOFrameBufferDevice::clear_to_black(Buffer& buffer)
}
}

void VirtIOFrameBufferDevice::draw_ntsc_test_pattern(Buffer& buffer)
void FrameBufferDevice::draw_ntsc_test_pattern(Buffer& buffer)
{
static constexpr u8 colors[12][4] = {
{ 0xff, 0xff, 0xff, 0xff }, // White
Expand Down Expand Up @@ -359,7 +359,7 @@ void VirtIOFrameBufferDevice::draw_ntsc_test_pattern(Buffer& buffer)
dbgln_if(VIRTIO_DEBUG, "Finish drawing the pattern");
}

u8* VirtIOFrameBufferDevice::framebuffer_data()
u8* FrameBufferDevice::framebuffer_data()
{
return m_current_buffer->framebuffer_data;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,20 @@
#include <Kernel/VirtIO/VirtIO.h>
#include <Kernel/VirtIO/VirtIOQueue.h>

namespace Kernel::Graphics {
namespace Kernel::Graphics::VirtIOGPU {

class VirtIOFrameBufferDevice final : public BlockDevice {
friend class VirtIOGPUConsole;
class FrameBufferDevice final : public BlockDevice {
friend class Console;
struct Buffer {
size_t framebuffer_offset { 0 };
u8* framebuffer_data { nullptr };
VirtIOGPUResourceID resource_id { 0 };
VirtIOGPURect dirty_rect {};
Protocol::Rect dirty_rect {};
ResourceID resource_id { 0 };
};

public:
VirtIOFrameBufferDevice(VirtIOGPU& virtio_gpu, VirtIOGPUScanoutID);
virtual ~VirtIOFrameBufferDevice() override;
FrameBufferDevice(VirtIOGPU::GPU& virtio_gpu, ScanoutID);
virtual ~FrameBufferDevice() override;

virtual void deactivate_writes();
virtual void activate_writes();
Expand All @@ -42,9 +42,9 @@ class VirtIOFrameBufferDevice final : public BlockDevice {
return page_round_up(sizeof(u32) * width * height);
}

void flush_dirty_window(VirtIOGPURect const&, Buffer&);
void transfer_framebuffer_data_to_host(VirtIOGPURect const&, Buffer&);
void flush_displayed_image(VirtIOGPURect const&, Buffer&);
void flush_dirty_window(Protocol::Rect const&, Buffer&);
void transfer_framebuffer_data_to_host(Protocol::Rect const&, Buffer&);
void flush_displayed_image(Protocol::Rect const&, Buffer&);

void draw_ntsc_test_pattern(Buffer&);

Expand All @@ -53,8 +53,8 @@ class VirtIOFrameBufferDevice final : public BlockDevice {
private:
virtual StringView class_name() const override { return "VirtIOFrameBuffer"; }

VirtIOGPURespDisplayInfo::VirtIOGPUDisplayOne const& display_info() const;
VirtIOGPURespDisplayInfo::VirtIOGPUDisplayOne& display_info();
Protocol::DisplayInfoResponse::Display const& display_info() const;
Protocol::DisplayInfoResponse::Display& display_info();

void create_framebuffer();
void create_buffer(Buffer&, size_t, size_t);
Expand Down Expand Up @@ -82,8 +82,8 @@ class VirtIOFrameBufferDevice final : public BlockDevice {
}
Buffer& current_buffer() const { return *m_current_buffer; }

VirtIOGPU& m_gpu;
const VirtIOGPUScanoutID m_scanout;
GPU& m_gpu;
const ScanoutID m_scanout;
Buffer* m_current_buffer { nullptr };
Atomic<int, AK::memory_order_relaxed> m_last_set_buffer_index { 0 };
Buffer m_main_buffer;
Expand Down
Loading

0 comments on commit 1c77f80

Please sign in to comment.