mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 21:37:35 +00:00
Kernel/Graphics: Force VirtIO Framebuffer to inherit FramebufferDevice
The distinction is not justified because a VirtIO Framebuffer device acts much more like a regular FramebufferDevice than a pure BlockDevice.
This commit is contained in:
parent
4815282a5f
commit
fb0ed2ae46
7 changed files with 24 additions and 14 deletions
|
@ -99,6 +99,13 @@ UNMAP_AFTER_INIT KResult FramebufferDevice::initialize()
|
||||||
return KSuccess;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UNMAP_AFTER_INIT FramebufferDevice::FramebufferDevice(const GraphicsDevice& adapter, size_t output_port_index)
|
||||||
|
: BlockDevice(29, GraphicsManagement::the().allocate_minor_device_number())
|
||||||
|
, m_output_port_index(output_port_index)
|
||||||
|
, m_graphics_adapter(adapter)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT FramebufferDevice::FramebufferDevice(const GraphicsDevice& adapter, size_t output_port_index, PhysicalAddress addr, size_t width, size_t height, size_t pitch)
|
UNMAP_AFTER_INIT FramebufferDevice::FramebufferDevice(const GraphicsDevice& adapter, size_t output_port_index, PhysicalAddress addr, size_t width, size_t height, size_t pitch)
|
||||||
: BlockDevice(29, GraphicsManagement::the().allocate_minor_device_number())
|
: BlockDevice(29, GraphicsManagement::the().allocate_minor_device_number())
|
||||||
, m_framebuffer_address(addr)
|
, m_framebuffer_address(addr)
|
||||||
|
|
|
@ -34,6 +34,9 @@ public:
|
||||||
virtual ~FramebufferDevice() {};
|
virtual ~FramebufferDevice() {};
|
||||||
KResult initialize();
|
KResult initialize();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
FramebufferDevice(const GraphicsDevice&, size_t);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FramebufferDevice(const GraphicsDevice&, size_t, PhysicalAddress, size_t, size_t, size_t);
|
FramebufferDevice(const GraphicsDevice&, size_t, PhysicalAddress, size_t, size_t, size_t);
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
|
|
||||||
namespace Kernel::Graphics::VirtIOGPU {
|
namespace Kernel::Graphics::VirtIOGPU {
|
||||||
|
|
||||||
FramebufferDevice::FramebufferDevice(GPU& virtio_gpu, ScanoutID scanout)
|
FramebufferDevice::FramebufferDevice(GraphicsDevice const& adapter, GPU& virtio_gpu, ScanoutID scanout)
|
||||||
: BlockDevice(29, GraphicsManagement::the().allocate_minor_device_number())
|
: Kernel::FramebufferDevice(adapter, scanout.value())
|
||||||
, m_gpu(virtio_gpu)
|
, m_gpu(virtio_gpu)
|
||||||
, m_scanout(scanout)
|
, m_scanout(scanout)
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,12 +8,13 @@
|
||||||
|
|
||||||
#include <Kernel/Bus/VirtIO/Device.h>
|
#include <Kernel/Bus/VirtIO/Device.h>
|
||||||
#include <Kernel/Bus/VirtIO/Queue.h>
|
#include <Kernel/Bus/VirtIO/Queue.h>
|
||||||
#include <Kernel/Devices/BlockDevice.h>
|
#include <Kernel/Graphics/FramebufferDevice.h>
|
||||||
|
#include <Kernel/Graphics/GraphicsDevice.h>
|
||||||
#include <Kernel/Graphics/VirtIOGPU/GPU.h>
|
#include <Kernel/Graphics/VirtIOGPU/GPU.h>
|
||||||
|
|
||||||
namespace Kernel::Graphics::VirtIOGPU {
|
namespace Kernel::Graphics::VirtIOGPU {
|
||||||
|
|
||||||
class FramebufferDevice final : public BlockDevice {
|
class FramebufferDevice final : public Kernel::FramebufferDevice {
|
||||||
friend class Console;
|
friend class Console;
|
||||||
struct Buffer {
|
struct Buffer {
|
||||||
size_t framebuffer_offset { 0 };
|
size_t framebuffer_offset { 0 };
|
||||||
|
@ -23,7 +24,7 @@ class FramebufferDevice final : public BlockDevice {
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FramebufferDevice(VirtIOGPU::GPU& virtio_gpu, ScanoutID);
|
FramebufferDevice(GraphicsDevice const&, VirtIOGPU::GPU& virtio_gpu, ScanoutID);
|
||||||
virtual ~FramebufferDevice() override;
|
virtual ~FramebufferDevice() override;
|
||||||
|
|
||||||
virtual void deactivate_writes();
|
virtual void deactivate_writes();
|
||||||
|
@ -62,11 +63,6 @@ private:
|
||||||
|
|
||||||
virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) override;
|
virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||||
virtual KResultOr<Memory::Region*> mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
virtual KResultOr<Memory::Region*> mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
|
||||||
virtual bool can_read(const OpenFileDescription&, size_t) const override { return true; }
|
|
||||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override { return EINVAL; }
|
|
||||||
virtual bool can_write(const OpenFileDescription&, size_t) const override { return true; }
|
|
||||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override { return EINVAL; };
|
|
||||||
virtual void start_request(AsyncBlockDeviceRequest& request) override { request.complete(AsyncDeviceRequest::Failure); }
|
|
||||||
|
|
||||||
static bool is_valid_buffer_index(int buffer_index)
|
static bool is_valid_buffer_index(int buffer_index)
|
||||||
{
|
{
|
||||||
|
|
|
@ -46,8 +46,9 @@ void GPU::initialize()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GPU::GPU(PCI::DeviceIdentifier const& device_identifier)
|
GPU::GPU(GraphicsDevice const& adapter, PCI::DeviceIdentifier const& device_identifier)
|
||||||
: VirtIO::Device(device_identifier)
|
: VirtIO::Device(device_identifier)
|
||||||
|
, m_adapter(adapter)
|
||||||
{
|
{
|
||||||
auto region_or_error = MM.allocate_contiguous_kernel_region(32 * PAGE_SIZE, "VirtGPU Scratch Space", Memory::Region::Access::ReadWrite);
|
auto region_or_error = MM.allocate_contiguous_kernel_region(32 * PAGE_SIZE, "VirtGPU Scratch Space", Memory::Region::Access::ReadWrite);
|
||||||
if (region_or_error.is_error())
|
if (region_or_error.is_error())
|
||||||
|
@ -63,7 +64,7 @@ void GPU::create_framebuffer_devices()
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < min(m_num_scanouts, VIRTIO_GPU_MAX_SCANOUTS); i++) {
|
for (size_t i = 0; i < min(m_num_scanouts, VIRTIO_GPU_MAX_SCANOUTS); i++) {
|
||||||
auto& scanout = m_scanouts[i];
|
auto& scanout = m_scanouts[i];
|
||||||
scanout.framebuffer = adopt_ref(*new VirtIOGPU::FramebufferDevice(*this, i));
|
scanout.framebuffer = adopt_ref(*new VirtIOGPU::FramebufferDevice(*m_adapter, *this, i));
|
||||||
scanout.framebuffer->after_inserting();
|
scanout.framebuffer->after_inserting();
|
||||||
scanout.console = Kernel::Graphics::VirtIOGPU::Console::initialize(scanout.framebuffer);
|
scanout.console = Kernel::Graphics::VirtIOGPU::Console::initialize(scanout.framebuffer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <Kernel/Bus/VirtIO/Device.h>
|
#include <Kernel/Bus/VirtIO/Device.h>
|
||||||
#include <Kernel/Bus/VirtIO/Queue.h>
|
#include <Kernel/Bus/VirtIO/Queue.h>
|
||||||
#include <Kernel/Devices/BlockDevice.h>
|
#include <Kernel/Devices/BlockDevice.h>
|
||||||
|
#include <Kernel/Graphics/GraphicsDevice.h>
|
||||||
#include <Kernel/Graphics/VirtIOGPU/Protocol.h>
|
#include <Kernel/Graphics/VirtIOGPU/Protocol.h>
|
||||||
|
|
||||||
#define VIRTIO_GPU_F_VIRGL (1 << 0)
|
#define VIRTIO_GPU_F_VIRGL (1 << 0)
|
||||||
|
@ -40,7 +41,7 @@ class GPU final
|
||||||
friend class FramebufferDevice;
|
friend class FramebufferDevice;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GPU(PCI::DeviceIdentifier const&);
|
GPU(GraphicsDevice const&, PCI::DeviceIdentifier const&);
|
||||||
virtual ~GPU() override;
|
virtual ~GPU() override;
|
||||||
|
|
||||||
void create_framebuffer_devices();
|
void create_framebuffer_devices();
|
||||||
|
@ -119,6 +120,8 @@ private:
|
||||||
VirtIO::Configuration const* m_device_configuration { nullptr };
|
VirtIO::Configuration const* m_device_configuration { nullptr };
|
||||||
ResourceID m_resource_id_counter { 0 };
|
ResourceID m_resource_id_counter { 0 };
|
||||||
|
|
||||||
|
NonnullRefPtr<GraphicsDevice> m_adapter;
|
||||||
|
|
||||||
// Synchronous commands
|
// Synchronous commands
|
||||||
WaitQueue m_outstanding_request;
|
WaitQueue m_outstanding_request;
|
||||||
Mutex m_operation_lock;
|
Mutex m_operation_lock;
|
||||||
|
|
|
@ -22,7 +22,7 @@ NonnullRefPtr<GraphicsAdapter> GraphicsAdapter::initialize(PCI::DeviceIdentifier
|
||||||
GraphicsAdapter::GraphicsAdapter(PCI::DeviceIdentifier const& device_identifier)
|
GraphicsAdapter::GraphicsAdapter(PCI::DeviceIdentifier const& device_identifier)
|
||||||
: PCI::Device(device_identifier.address())
|
: PCI::Device(device_identifier.address())
|
||||||
{
|
{
|
||||||
m_gpu_device = adopt_ref(*new GPU(device_identifier)).leak_ref();
|
m_gpu_device = adopt_ref(*new GPU(*this, device_identifier)).leak_ref();
|
||||||
m_gpu_device->initialize();
|
m_gpu_device->initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue