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.
This commit is contained in:
Liav A 2022-09-24 16:55:46 +03:00 committed by Linus Groh
parent 50ed50752f
commit d5b97eb41e
Notes: sideshowbarker 2024-07-17 06:40:21 +09:00
4 changed files with 5 additions and 0 deletions

View File

@ -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);
}

View File

@ -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 {

View File

@ -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 {};
}

View File

@ -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 };