The Pedigree Project 0.1
VirtioGpu.h
1/* Copyright (c) 2026, Pedigree Developers. SPDX-License-Identifier: ISC */
2#ifndef PEDIGREE_VIRTIO_GPU_H
3#define PEDIGREE_VIRTIO_GPU_H
4
5#include "pedigree/kernel/graphics/GraphicsService.h"
6#include "pedigree/kernel/machine/Display.h"
7#include "pedigree/kernel/machine/Framebuffer.h"
8#include "pedigree/kernel/process/Mutex.h"
9#include "pedigree/kernel/process/OperationBarrier.h"
10#include "pedigree/kernel/processor/MemoryRegion.h"
11
12#include "modules/drivers/common/virtio/VirtioPci.h"
13#include "modules/drivers/common/virtio/Virtqueue.h"
14
15class Thread;
16
17class VirtioGpu final : public Display {
18 public:
19 explicit VirtioGpu(Device* pci);
20 ~VirtioGpu() override;
21
22 bool initialise();
23 void shutdown();
24 void redraw(size_t x, size_t y, size_t width, size_t height);
25
26 void getName(String& name) override;
27 void dump(String& description) override;
28 void* getFramebuffer() override;
29 bool getPixelFormat(PixelFormat& format) override;
30 bool getCurrentScreenMode(ScreenMode& mode) override;
31 bool getScreenModes(List<ScreenMode*>& modes) override;
32 bool setScreenMode(ScreenMode mode) override;
33 bool setScreenMode(size_t modeId) override;
34 bool setScreenMode(size_t width, size_t height, size_t bpp) override;
35
36 private:
37 class GpuFramebuffer final : public Framebuffer {
38 public:
39 explicit GpuFramebuffer(VirtioGpu* gpu);
40 physical_uintptr_t getPhysicalPage(size_t offset) const override;
41 void closeCallbacks();
42 void detach();
43
44 protected:
45 void hwRedraw(size_t x, size_t y, size_t width, size_t height) override;
46
47 private:
48 OperationBarrier m_Callbacks;
49 VirtioGpu* m_Gpu;
50 };
51
52 static int refreshThread(void* context);
53 bool transact(const void* request, size_t requestLength, uint32_t expectedResponse,
54 void* response, size_t responseLength);
55 bool update(size_t x, size_t y, size_t width, size_t height);
56 bool registerProvider();
57 void unregisterProvider();
58
59 Device* m_Pci;
60 Virtio::PciTransport m_Transport;
61 Virtio::Queue m_ControlQueue;
62 MemoryRegion m_Commands;
63 MemoryRegion m_Backing;
64 MemoryRegion m_Pixels;
65 Mutex m_CommandLock;
66 GpuFramebuffer* m_Framebuffer;
68 Thread* m_RefreshThread;
69 ScreenMode m_Mode;
70 uint64_t m_NextFence;
71 uint32_t m_Scanout;
72 bool m_Ready;
73 bool m_Failed;
74 bool m_Registered;
75 bool m_Shutdown;
76 bool m_Stopping;
77};
78
79#endif
Definition List.h:61
Special memory entity in the kernel's virtual address space.
Definition Mutex.h:56
physical_uintptr_t getPhysicalPage(size_t offset) const override
Definition VirtioGpu.cc:107
void hwRedraw(size_t x, size_t y, size_t width, size_t height) override
Inherited by drivers that provide a hardware redraw function.
Definition VirtioGpu.cc:133
void dump(String &description) override
Definition VirtioGpu.cc:507
void * getFramebuffer() override
Definition VirtioGpu.cc:511
void getName(String &name) override
Definition VirtioGpu.cc:503
bool setScreenMode(ScreenMode mode) override
Definition VirtioGpu.cc:537
bool getCurrentScreenMode(ScreenMode &mode) override
Definition VirtioGpu.cc:520
bool getScreenModes(List< ScreenMode * > &modes) override
Definition VirtioGpu.cc:525
bool getPixelFormat(PixelFormat &format) override
Definition VirtioGpu.cc:515