summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2022-09-24 16:55:46 +0300
committerLinus Groh <mail@linusgroh.de>2022-09-24 15:38:56 +0100
commitd5b97eb41e2b4d3497a07e809953456a59e09a68 (patch)
tree5a480f95dd2fbb05e212dd156f80f55c229a0333
parent50ed50752f5cf0d66f8d478a006eb57a019fe954 (diff)
downloadserenity-d5b97eb41e2b4d3497a07e809953456a59e09a68.zip
Kernel+Userland: Provide bytes count for a DisplayConnector framebuffer
This value will be used later on by WindowServer to reject resolutions that will request a mapping that will overflow the hardware framebuffer max length.
-rw-r--r--Kernel/Graphics/DisplayConnector.cpp2
-rw-r--r--Userland/Libraries/LibC/sys/ioctl_numbers.h1
-rw-r--r--Userland/Services/WindowServer/HardwareScreenBackend.cpp1
-rw-r--r--Userland/Services/WindowServer/ScreenBackend.h1
4 files changed, 5 insertions, 0 deletions
diff --git a/Kernel/Graphics/DisplayConnector.cpp b/Kernel/Graphics/DisplayConnector.cpp
index e1bcc9de4d..1686c68545 100644
--- a/Kernel/Graphics/DisplayConnector.cpp
+++ b/Kernel/Graphics/DisplayConnector.cpp
@@ -301,12 +301,14 @@ ErrorOr<void> DisplayConnector::ioctl(OpenFileDescription&, unsigned request, Us
return {};
}
case GRAPHICS_IOCTL_GET_PROPERTIES: {
+ VERIFY(m_shared_framebuffer_vmobject);
auto user_properties = static_ptr_cast<GraphicsConnectorProperties*>(arg);
GraphicsConnectorProperties properties {};
properties.flushing_support = flush_support();
properties.doublebuffer_support = double_framebuffering_capable();
properties.partial_flushing_support = partial_flush_support();
properties.refresh_rate_support = refresh_rate_support();
+ properties.max_buffer_bytes = m_shared_framebuffer_vmobject->size();
return copy_to_user(user_properties, &properties);
}
diff --git a/Userland/Libraries/LibC/sys/ioctl_numbers.h b/Userland/Libraries/LibC/sys/ioctl_numbers.h
index c7c596f94f..df044ddf8f 100644
--- a/Userland/Libraries/LibC/sys/ioctl_numbers.h
+++ b/Userland/Libraries/LibC/sys/ioctl_numbers.h
@@ -24,6 +24,7 @@ struct GraphicsConnectorProperties {
unsigned char flushing_support;
unsigned char partial_flushing_support;
unsigned char refresh_rate_support;
+ unsigned max_buffer_bytes;
};
struct GraphicsHeadModeSetting {
diff --git a/Userland/Services/WindowServer/HardwareScreenBackend.cpp b/Userland/Services/WindowServer/HardwareScreenBackend.cpp
index 9c9a82b60e..dffbc0b7c2 100644
--- a/Userland/Services/WindowServer/HardwareScreenBackend.cpp
+++ b/Userland/Services/WindowServer/HardwareScreenBackend.cpp
@@ -33,6 +33,7 @@ ErrorOr<void> HardwareScreenBackend::open()
m_can_device_flush_buffers = (properties.partial_flushing_support != 0);
m_can_device_flush_entire_framebuffer = (properties.flushing_support != 0);
m_can_set_head_buffer = (properties.doublebuffer_support != 0);
+ m_max_size_in_bytes = properties.max_buffer_bytes;
return {};
}
diff --git a/Userland/Services/WindowServer/ScreenBackend.h b/Userland/Services/WindowServer/ScreenBackend.h
index 2e014d55ed..14870c1aa3 100644
--- a/Userland/Services/WindowServer/ScreenBackend.h
+++ b/Userland/Services/WindowServer/ScreenBackend.h
@@ -43,6 +43,7 @@ public:
Gfx::ARGB32* m_framebuffer { nullptr };
size_t m_size_in_bytes { 0 };
+ size_t m_max_size_in_bytes { 0 };
size_t m_back_buffer_offset { 0 };
int m_pitch { 0 };