1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 19:37:35 +00:00

WindowServer: Query driver for framebuffer offset

Depending on the driver, the second buffer may not be located right
after the first, e.g. it may be page aligned. This removes this
assumption and queries the driver for the appropriate offset.
This commit is contained in:
Tom 2021-07-03 20:36:16 -06:00 committed by Andreas Kling
parent fdae117600
commit 6e792553f2
5 changed files with 47 additions and 6 deletions

View file

@ -225,6 +225,19 @@ bool Screen::set_resolution(bool initial)
m_framebuffer = (Gfx::RGBA32*)mmap(nullptr, m_size_in_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, m_framebuffer_fd, 0);
VERIFY(m_framebuffer && m_framebuffer != (void*)-1);
if (m_can_set_buffer) {
unsigned buffer_offset = 0;
rc = fb_get_buffer_offset(m_framebuffer_fd, 1, &buffer_offset);
if (rc == 0) {
m_back_buffer_offset = buffer_offset;
} else {
// fall back to assuming the second buffer starts right after the last line of the first
m_back_buffer_offset = physical_resolution.pitch * physical_resolution.height;
}
} else {
m_back_buffer_offset = 0;
}
}
m_info.resolution = { physical_resolution.width, physical_resolution.height };
@ -255,6 +268,15 @@ void Screen::set_buffer(int index)
VERIFY(rc == 0);
}
size_t Screen::buffer_offset(int index) const
{
if (index == 0)
return 0;
if (index == 1)
return m_back_buffer_offset;
VERIFY_NOT_REACHED();
}
void ScreenInput::set_acceleration_factor(double factor)
{
VERIFY(factor >= mouse_accel_min && factor <= mouse_accel_max);