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 HardwareScreenBackend::set_head_mode_setting(GraphicsHeadModeSetti ErrorOr HardwareScreenBackend::unmap_framebuffer() { if (m_framebuffer) { - free(m_framebuffer); - } - return {}; -} - -ErrorOr 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 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 set_head_mode_setting(GraphicsHeadModeSetting) override; virtual ErrorOr get_head_mode_setting() override; - virtual ErrorOr 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 set_head_mode_setting(GraphicsHeadModeSetting) = 0; virtual ErrorOr get_head_mode_setting() = 0; - virtual ErrorOr 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 };