mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 20:37:35 +00:00
WindowServer: Detect framebuffer capabilities and settings
The main changes are twofold: * Buffer flipping is now controlled by the m_screen_can_set_buffer flag in WSCompositor. This flag, in turn, is impacted by m_can_set_buffer flag, in WSScreen. m_can_set_buffer is set in the WSScreen constructor by checking the return value of fb_set_buffer. If the framebuffer supports this operation, it will succeed, and we record this fact. This information is then used by WSCompositor to set its own m_screen_can_set_buffer flag. * WSScreen now only requests a resolution change of the framebuffer. The driver itself is ultimately responsible for what resolution or mode is actually set, so WSScreen has to read the response from that request, and has no choice but to accept the answer. This allows the driver to choose a "close enough" value to what was requested, or simply ignore it. The result of this is that there is no special configuration necessary for WindowServer to work with reduced-capability framebuffer devices.
This commit is contained in:
parent
3932dfbb04
commit
23b6ef29dd
4 changed files with 68 additions and 51 deletions
|
@ -11,6 +11,8 @@ public:
|
|||
~WSScreen();
|
||||
|
||||
void set_resolution(int width, int height);
|
||||
bool can_set_buffer() { return m_can_set_buffer; }
|
||||
void set_buffer(int index);
|
||||
|
||||
int width() const { return m_width; }
|
||||
int height() const { return m_height; }
|
||||
|
@ -21,8 +23,6 @@ public:
|
|||
Size size() const { return { width(), height() }; }
|
||||
Rect rect() const { return { 0, 0, width(), height() }; }
|
||||
|
||||
void set_y_offset(int);
|
||||
|
||||
Point cursor_location() const { return m_cursor_location; }
|
||||
unsigned mouse_button_state() const { return m_mouse_button_state; }
|
||||
|
||||
|
@ -30,8 +30,14 @@ public:
|
|||
void on_receive_keyboard_data(KeyEvent);
|
||||
|
||||
private:
|
||||
RGBA32* m_framebuffer { nullptr };
|
||||
void on_change_resolution(int pitch, int width, int height);
|
||||
|
||||
size_t m_size_in_bytes;
|
||||
|
||||
RGBA32* m_framebuffer { nullptr };
|
||||
bool m_can_set_buffer { false };
|
||||
|
||||
int m_pitch { 0 };
|
||||
int m_width { 0 };
|
||||
int m_height { 0 };
|
||||
int m_framebuffer_fd { -1 };
|
||||
|
@ -43,6 +49,5 @@ private:
|
|||
|
||||
inline RGBA32* WSScreen::scanline(int y)
|
||||
{
|
||||
size_t pitch = sizeof(RGBA32) * width();
|
||||
return reinterpret_cast<RGBA32*>(((u8*)m_framebuffer) + (y * pitch));
|
||||
return reinterpret_cast<RGBA32*>(((u8*)m_framebuffer) + (y * m_pitch));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue