From ac6e6f3ec1fb79ea4e526225b2d0247f8c1cafa1 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sat, 11 Apr 2026 08:29:10 +0300 Subject: [PATCH] Kernel: Add ioctl to sync rectangular areas in framebuffer msync is not really the best API for framebuffer synchronization --- .../include/kernel/Device/FramebufferDevice.h | 2 ++ kernel/kernel/Device/FramebufferDevice.cpp | 21 +++++++++++++++++++ userspace/libraries/LibC/include/sys/ioctl.h | 9 ++++++++ 3 files changed, 32 insertions(+) diff --git a/kernel/include/kernel/Device/FramebufferDevice.h b/kernel/include/kernel/Device/FramebufferDevice.h index 8a095c40..f298aaca 100644 --- a/kernel/include/kernel/Device/FramebufferDevice.h +++ b/kernel/include/kernel/Device/FramebufferDevice.h @@ -37,6 +37,8 @@ namespace Kernel virtual BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override; virtual BAN::ErrorOr write_impl(off_t, BAN::ConstByteSpan) override; + BAN::ErrorOr ioctl_impl(int cmd, void* arg) override; + virtual bool can_read_impl() const override { return true; } virtual bool can_write_impl() const override { return true; } virtual bool has_error_impl() const override { return false; } diff --git a/kernel/kernel/Device/FramebufferDevice.cpp b/kernel/kernel/Device/FramebufferDevice.cpp index 071a343d..37e16215 100644 --- a/kernel/kernel/Device/FramebufferDevice.cpp +++ b/kernel/kernel/Device/FramebufferDevice.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -133,6 +134,26 @@ namespace Kernel return bytes_to_copy; } + BAN::ErrorOr FramebufferDevice::ioctl_impl(int cmd, void* arg) + { + switch (cmd) + { + case FB_MSYNC_RECTANGLE: + { + auto& rectangle = *static_cast(arg); + sync_pixels_rectangle( + rectangle.min_x, + rectangle.min_y, + rectangle.max_x - rectangle.min_x, + rectangle.max_y - rectangle.min_y + ); + return 0; + } + } + + return CharacterDevice::ioctl(cmd, arg); + } + uint32_t FramebufferDevice::get_pixel(uint32_t x, uint32_t y) const { ASSERT(x < m_width && y < m_height); diff --git a/userspace/libraries/LibC/include/sys/ioctl.h b/userspace/libraries/LibC/include/sys/ioctl.h index d1842427..0a6366c3 100644 --- a/userspace/libraries/LibC/include/sys/ioctl.h +++ b/userspace/libraries/LibC/include/sys/ioctl.h @@ -74,6 +74,15 @@ struct snd_volume_info #define JOYSTICK_GET_RUMBLE 82 /* get controller rumble strength to uint8_t argument */ #define JOYSTICK_SET_RUMBLE 83 /* set controller rumble strength to uint8_t argument */ +struct fb_msync_region +{ + uint32_t min_x; + uint32_t min_y; + uint32_t max_x; + uint32_t max_y; +}; +#define FB_MSYNC_RECTANGLE 90 /* msync a rectangular area in mmap'd framebuffer device */ + int ioctl(int, int, ...); __END_DECLS