mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 21:58:12 +00:00
Everywhere: Purge all support and usage of framebuffer devices
Long live the DisplayConnector object!
This commit is contained in:
parent
aad968cc5e
commit
e301af8352
25 changed files with 90 additions and 995 deletions
|
@ -17,9 +17,8 @@
|
|||
|
||||
namespace WindowServer {
|
||||
|
||||
HardwareScreenBackend::HardwareScreenBackend(String device, bool display_connector_device_backed)
|
||||
HardwareScreenBackend::HardwareScreenBackend(String device)
|
||||
: m_device(move(device))
|
||||
, display_connector_device_backed(display_connector_device_backed)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -44,38 +43,26 @@ HardwareScreenBackend::~HardwareScreenBackend()
|
|||
m_framebuffer_fd = -1;
|
||||
}
|
||||
if (m_framebuffer) {
|
||||
if (!display_connector_device_backed)
|
||||
MUST(Core::System::munmap(m_framebuffer, m_size_in_bytes));
|
||||
else
|
||||
free(m_framebuffer);
|
||||
free(m_framebuffer);
|
||||
|
||||
m_framebuffer = nullptr;
|
||||
m_size_in_bytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
ErrorOr<void> HardwareScreenBackend::set_head_resolution(FBHeadResolution resolution)
|
||||
ErrorOr<void> HardwareScreenBackend::set_head_mode_setting(GraphicsHeadModeSetting mode_setting)
|
||||
{
|
||||
if (!display_connector_device_backed) {
|
||||
auto rc = fb_set_resolution(m_framebuffer_fd, &resolution);
|
||||
if (rc != 0)
|
||||
return Error::from_syscall("fb_set_resolution", rc);
|
||||
} else {
|
||||
GraphicsHeadModeSetting mode_setting;
|
||||
memset(&mode_setting, 0, sizeof(GraphicsHeadModeSetting));
|
||||
mode_setting.horizontal_active = resolution.width;
|
||||
mode_setting.vertical_active = resolution.height;
|
||||
mode_setting.horizontal_stride = resolution.pitch;
|
||||
auto rc = graphics_connector_set_head_mode_setting(m_framebuffer_fd, &mode_setting);
|
||||
|
||||
GraphicsHeadModeSetting requested_mode_setting = mode_setting;
|
||||
auto rc = graphics_connector_set_head_mode_setting(m_framebuffer_fd, &requested_mode_setting);
|
||||
if (rc != 0) {
|
||||
dbgln("Failed to set backend mode setting: falling back to safe resolution");
|
||||
rc = graphics_connector_set_safe_head_mode_setting(m_framebuffer_fd);
|
||||
if (rc != 0) {
|
||||
dbgln("Failed to set backend mode setting: falling back to safe resolution");
|
||||
rc = graphics_connector_set_safe_head_mode_setting(m_framebuffer_fd);
|
||||
if (rc != 0) {
|
||||
dbgln("Failed to set backend safe mode setting: aborting");
|
||||
return Error::from_syscall("graphics_connector_set_safe_head_mode_setting", rc);
|
||||
}
|
||||
dbgln("Failed to set backend mode setting: falling back to safe resolution - success.");
|
||||
dbgln("Failed to set backend safe mode setting: aborting");
|
||||
return Error::from_syscall("graphics_connector_set_safe_head_mode_setting", rc);
|
||||
}
|
||||
dbgln("Failed to set backend mode setting: falling back to safe resolution - success.");
|
||||
}
|
||||
|
||||
return {};
|
||||
|
@ -84,20 +71,13 @@ ErrorOr<void> HardwareScreenBackend::set_head_resolution(FBHeadResolution resolu
|
|||
ErrorOr<void> HardwareScreenBackend::unmap_framebuffer()
|
||||
{
|
||||
if (m_framebuffer) {
|
||||
if (!display_connector_device_backed) {
|
||||
size_t previous_size_in_bytes = m_size_in_bytes;
|
||||
return Core::System::munmap(m_framebuffer, previous_size_in_bytes);
|
||||
} else {
|
||||
free(m_framebuffer);
|
||||
}
|
||||
free(m_framebuffer);
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void> HardwareScreenBackend::write_all_contents(Gfx::IntRect const& virtual_rect)
|
||||
{
|
||||
if (!display_connector_device_backed)
|
||||
return {};
|
||||
lseek(m_framebuffer_fd, 0, SEEK_SET);
|
||||
write(m_framebuffer_fd, scanline(0, 0), virtual_rect.height() * m_pitch);
|
||||
if (m_can_set_head_buffer) {
|
||||
|
@ -113,80 +93,38 @@ ErrorOr<void> HardwareScreenBackend::write_all_contents(Gfx::IntRect const& virt
|
|||
|
||||
ErrorOr<void> HardwareScreenBackend::map_framebuffer()
|
||||
{
|
||||
if (!display_connector_device_backed) {
|
||||
FBHeadProperties properties;
|
||||
properties.head_index = 0;
|
||||
int rc = fb_get_head_properties(m_framebuffer_fd, &properties);
|
||||
if (rc != 0)
|
||||
return Error::from_syscall("fb_get_head_properties", rc);
|
||||
m_size_in_bytes = properties.buffer_length;
|
||||
|
||||
m_framebuffer = (Gfx::ARGB32*)TRY(Core::System::mmap(nullptr, m_size_in_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, m_framebuffer_fd, 0));
|
||||
|
||||
if (m_can_set_head_buffer) {
|
||||
// Note: fall back to assuming the second buffer starts right after the last line of the first
|
||||
// Note: for now, this calculation works quite well, so need to defer it to another function
|
||||
// that does ioctl to figure out the correct offset. If a Framebuffer device ever happens to
|
||||
// to set the second buffer at different location than this, we might need to consider bringing
|
||||
// back a function with ioctl to check this.
|
||||
m_back_buffer_offset = static_cast<size_t>(properties.pitch) * properties.height;
|
||||
} else {
|
||||
m_back_buffer_offset = 0;
|
||||
}
|
||||
GraphicsHeadModeSetting mode_setting {};
|
||||
memset(&mode_setting, 0, sizeof(GraphicsHeadModeSetting));
|
||||
int rc = graphics_connector_get_head_mode_setting(m_framebuffer_fd, &mode_setting);
|
||||
if (rc != 0) {
|
||||
return Error::from_syscall("graphics_connector_get_head_mode_setting", rc);
|
||||
}
|
||||
m_size_in_bytes = mode_setting.horizontal_stride * mode_setting.vertical_active * 2;
|
||||
m_framebuffer = (Gfx::ARGB32*)malloc(m_size_in_bytes);
|
||||
if (m_can_set_head_buffer) {
|
||||
// Note: fall back to assuming the second buffer starts right after the last line of the first
|
||||
// Note: for now, this calculation works quite well, so need to defer it to another function
|
||||
// that does ioctl to figure out the correct offset. If a Framebuffer device ever happens to
|
||||
// to set the second buffer at different location than this, we might need to consider bringing
|
||||
// back a function with ioctl to check this.
|
||||
m_back_buffer_offset = static_cast<size_t>(mode_setting.horizontal_stride) * mode_setting.vertical_active;
|
||||
} else {
|
||||
GraphicsHeadModeSetting mode_setting {};
|
||||
memset(&mode_setting, 0, sizeof(GraphicsHeadModeSetting));
|
||||
int rc = graphics_connector_get_head_mode_setting(m_framebuffer_fd, &mode_setting);
|
||||
if (rc != 0) {
|
||||
return Error::from_syscall("graphics_connector_get_head_mode_setting", rc);
|
||||
}
|
||||
m_size_in_bytes = mode_setting.horizontal_stride * mode_setting.vertical_active * 2;
|
||||
m_framebuffer = (Gfx::ARGB32*)malloc(m_size_in_bytes);
|
||||
if (m_can_set_head_buffer) {
|
||||
// Note: fall back to assuming the second buffer starts right after the last line of the first
|
||||
// Note: for now, this calculation works quite well, so need to defer it to another function
|
||||
// that does ioctl to figure out the correct offset. If a Framebuffer device ever happens to
|
||||
// to set the second buffer at different location than this, we might need to consider bringing
|
||||
// back a function with ioctl to check this.
|
||||
m_back_buffer_offset = static_cast<size_t>(mode_setting.horizontal_stride) * mode_setting.vertical_active;
|
||||
} else {
|
||||
m_back_buffer_offset = 0;
|
||||
}
|
||||
m_back_buffer_offset = 0;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<FBHeadProperties> HardwareScreenBackend::get_head_properties()
|
||||
ErrorOr<GraphicsHeadModeSetting> HardwareScreenBackend::get_head_mode_setting()
|
||||
{
|
||||
if (!display_connector_device_backed) {
|
||||
FBHeadProperties properties;
|
||||
properties.head_index = 0;
|
||||
int rc = fb_get_head_properties(m_framebuffer_fd, &properties);
|
||||
if (rc != 0)
|
||||
return Error::from_syscall("fb_get_head_properties", rc);
|
||||
m_pitch = static_cast<int>(properties.pitch);
|
||||
return properties;
|
||||
} else {
|
||||
GraphicsHeadModeSetting mode_setting {};
|
||||
memset(&mode_setting, 0, sizeof(GraphicsHeadModeSetting));
|
||||
int rc = graphics_connector_get_head_mode_setting(m_framebuffer_fd, &mode_setting);
|
||||
if (rc != 0) {
|
||||
return Error::from_syscall("graphics_connector_get_head_mode_setting", rc);
|
||||
}
|
||||
m_pitch = mode_setting.horizontal_stride;
|
||||
// Note: We translate (for now, until Framebuffer devices are removed) the GraphicsHeadModeSetting
|
||||
// structure to FBHeadProperties.
|
||||
FBHeadProperties properties;
|
||||
properties.head_index = 0;
|
||||
properties.pitch = mode_setting.horizontal_stride;
|
||||
properties.width = mode_setting.horizontal_active;
|
||||
properties.height = mode_setting.vertical_active;
|
||||
properties.offset = 0;
|
||||
properties.buffer_length = mode_setting.horizontal_stride * mode_setting.vertical_active * 2;
|
||||
return properties;
|
||||
GraphicsHeadModeSetting mode_setting {};
|
||||
memset(&mode_setting, 0, sizeof(GraphicsHeadModeSetting));
|
||||
int rc = graphics_connector_get_head_mode_setting(m_framebuffer_fd, &mode_setting);
|
||||
if (rc != 0) {
|
||||
return Error::from_syscall("graphics_connector_get_head_mode_setting", rc);
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
m_pitch = mode_setting.horizontal_stride;
|
||||
return mode_setting;
|
||||
}
|
||||
|
||||
void HardwareScreenBackend::set_head_buffer(int head_index)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue