summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2022-05-13 03:25:16 +0300
committerLinus Groh <mail@linusgroh.de>2022-06-06 20:11:05 +0100
commitf62cd52d12e67309ea179c3a812a1a4e927d5dbe (patch)
treedd862a112165498c544d3da9b0270ea39b56f3b2 /Userland
parente2ed6ef74195a22579e712db896745eaaedeb97f (diff)
downloadserenity-f62cd52d12e67309ea179c3a812a1a4e927d5dbe.zip
WindowServer: Drop support for the DisplayConnector write interface
All DisplayConnectors should support the mmap interface and it should provide better performance now, so let's just use it and drop support for the DisplayConnector's write interface from the WindowServer side.
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Services/WindowServer/Compositor.cpp7
-rw-r--r--Userland/Services/WindowServer/HardwareScreenBackend.cpp23
-rw-r--r--Userland/Services/WindowServer/HardwareScreenBackend.h2
-rw-r--r--Userland/Services/WindowServer/Screen.cpp5
-rw-r--r--Userland/Services/WindowServer/Screen.h2
-rw-r--r--Userland/Services/WindowServer/ScreenBackend.h2
6 files changed, 5 insertions, 36 deletions
diff --git a/Userland/Services/WindowServer/Compositor.cpp b/Userland/Services/WindowServer/Compositor.cpp
index 645b98f176..485e5987dc 100644
--- a/Userland/Services/WindowServer/Compositor.cpp
+++ b/Userland/Services/WindowServer/Compositor.cpp
@@ -724,13 +724,6 @@ void Compositor::flush(Screen& screen)
// now so that they can be sent to the device.
screen.flush_display(screen_data.m_buffers_are_flipped ? 1 : 0);
}
-
- // Note: We write all contents from the internal buffer of WindowServer Screen
- // to the actual framebuffer with the write() syscall, but after we flush the screen
- // to ensure we are in a "clean state"...
- // FIXME: This write is completely inefficient and needs to be done in chunks
- // only when appropriate...
- screen.write_all_display_contents();
}
void Compositor::invalidate_screen()
diff --git a/Userland/Services/WindowServer/HardwareScreenBackend.cpp b/Userland/Services/WindowServer/HardwareScreenBackend.cpp
index c8c746eb8b..97ae8c65ff 100644
--- a/Userland/Services/WindowServer/HardwareScreenBackend.cpp
+++ b/Userland/Services/WindowServer/HardwareScreenBackend.cpp
@@ -43,7 +43,7 @@ HardwareScreenBackend::~HardwareScreenBackend()
m_framebuffer_fd = -1;
}
if (m_framebuffer) {
- free(m_framebuffer);
+ MUST(Core::System::munmap(m_framebuffer, m_size_in_bytes));
m_framebuffer = nullptr;
m_size_in_bytes = 0;
@@ -71,22 +71,8 @@ ErrorOr<void> HardwareScreenBackend::set_head_mode_setting(GraphicsHeadModeSetti
ErrorOr<void> HardwareScreenBackend::unmap_framebuffer()
{
if (m_framebuffer) {
- free(m_framebuffer);
- }
- return {};
-}
-
-ErrorOr<void> HardwareScreenBackend::write_all_contents(Gfx::IntRect const& virtual_rect)
-{
- 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) {
- if (lseek(m_framebuffer_fd, virtual_rect.height() * m_pitch, SEEK_SET) < 0) {
- VERIFY_NOT_REACHED();
- }
-
- if (write(m_framebuffer_fd, scanline(0, 0), virtual_rect.height() * m_pitch) < 0)
- VERIFY_NOT_REACHED();
+ size_t previous_size_in_bytes = m_size_in_bytes;
+ return Core::System::munmap(m_framebuffer, previous_size_in_bytes);
}
return {};
}
@@ -100,7 +86,8 @@ ErrorOr<void> HardwareScreenBackend::map_framebuffer()
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);
+ 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
diff --git a/Userland/Services/WindowServer/HardwareScreenBackend.h b/Userland/Services/WindowServer/HardwareScreenBackend.h
index 5b3ca73d75..8af2642084 100644
--- a/Userland/Services/WindowServer/HardwareScreenBackend.h
+++ b/Userland/Services/WindowServer/HardwareScreenBackend.h
@@ -34,8 +34,6 @@ public:
virtual ErrorOr<void> set_head_mode_setting(GraphicsHeadModeSetting) override;
virtual ErrorOr<GraphicsHeadModeSetting> get_head_mode_setting() override;
- virtual ErrorOr<void> write_all_contents(Gfx::IntRect const&) override;
-
String m_device {};
int m_framebuffer_fd { -1 };
diff --git a/Userland/Services/WindowServer/Screen.cpp b/Userland/Services/WindowServer/Screen.cpp
index c2af132a31..71ef260b91 100644
--- a/Userland/Services/WindowServer/Screen.cpp
+++ b/Userland/Services/WindowServer/Screen.cpp
@@ -558,11 +558,6 @@ void Screen::flush_display(int buffer_index)
flush_rects.pending_flush_rects.clear_with_capacity();
}
-void Screen::write_all_display_contents()
-{
- MUST(m_backend->write_all_contents(m_physical_rect));
-}
-
void Screen::flush_display_entire_framebuffer()
{
VERIFY(m_backend->m_can_device_flush_entire_framebuffer);
diff --git a/Userland/Services/WindowServer/Screen.h b/Userland/Services/WindowServer/Screen.h
index 4b08646df2..6f5565f74d 100644
--- a/Userland/Services/WindowServer/Screen.h
+++ b/Userland/Services/WindowServer/Screen.h
@@ -176,8 +176,6 @@ public:
CompositorScreenData& compositor_screen_data() { return *m_compositor_screen_data; }
- void write_all_display_contents();
-
private:
Screen(size_t);
bool open_device();
diff --git a/Userland/Services/WindowServer/ScreenBackend.h b/Userland/Services/WindowServer/ScreenBackend.h
index 36dae86249..2e014d55ed 100644
--- a/Userland/Services/WindowServer/ScreenBackend.h
+++ b/Userland/Services/WindowServer/ScreenBackend.h
@@ -37,8 +37,6 @@ public:
virtual ErrorOr<void> set_head_mode_setting(GraphicsHeadModeSetting) = 0;
virtual ErrorOr<GraphicsHeadModeSetting> get_head_mode_setting() = 0;
- virtual ErrorOr<void> write_all_contents(Gfx::IntRect const&) { return {}; }
-
bool m_can_device_flush_buffers { true };
bool m_can_device_flush_entire_framebuffer { true };
bool m_can_set_head_buffer { false };