diff --git a/Kernel/Graphics/FramebufferDevice.cpp b/Kernel/Graphics/FramebufferDevice.cpp index 1daf3f287e9..cfe7d2db23b 100644 --- a/Kernel/Graphics/FramebufferDevice.cpp +++ b/Kernel/Graphics/FramebufferDevice.cpp @@ -22,6 +22,7 @@ namespace Kernel { KResultOr FramebufferDevice::mmap(Process& process, FileDescription&, const Range& range, u64 offset, int prot, bool shared) { + ScopedSpinLock lock(m_activation_lock); REQUIRE_PROMISE(video); if (!shared) return ENODEV; @@ -40,9 +41,15 @@ KResultOr FramebufferDevice::mmap(Process& process, FileDescription&, c m_real_framebuffer_region = MM.allocate_kernel_region_with_vmobject(*m_real_framebuffer_vmobject, page_round_up(framebuffer_size_in_bytes()), "Framebuffer", Region::Access::Read | Region::Access::Write); m_swapped_framebuffer_region = MM.allocate_kernel_region_with_vmobject(*m_swapped_framebuffer_vmobject, page_round_up(framebuffer_size_in_bytes()), "Framebuffer Swap (Blank)", Region::Access::Read | Region::Access::Write); + RefPtr chosen_vmobject; + if (m_graphical_writes_enabled) { + chosen_vmobject = m_real_framebuffer_vmobject; + } else { + chosen_vmobject = m_swapped_framebuffer_vmobject; + } auto result = process.space().allocate_region_with_vmobject( range, - vmobject.release_nonnull(), + chosen_vmobject.release_nonnull(), 0, "Framebuffer", prot, @@ -62,6 +69,7 @@ void FramebufferDevice::dectivate_writes() auto vmobject = m_swapped_framebuffer_vmobject; m_userspace_framebuffer_region->set_vmobject(vmobject.release_nonnull()); m_userspace_framebuffer_region->remap(); + m_graphical_writes_enabled = false; } void FramebufferDevice::activate_writes() { @@ -75,6 +83,7 @@ void FramebufferDevice::activate_writes() auto vmobject = m_userspace_real_framebuffer_vmobject; m_userspace_framebuffer_region->set_vmobject(vmobject.release_nonnull()); m_userspace_framebuffer_region->remap(); + m_graphical_writes_enabled = true; } String FramebufferDevice::device_name() const diff --git a/Kernel/Graphics/FramebufferDevice.h b/Kernel/Graphics/FramebufferDevice.h index f52f20ff4cf..45e9bd0c548 100644 --- a/Kernel/Graphics/FramebufferDevice.h +++ b/Kernel/Graphics/FramebufferDevice.h @@ -59,6 +59,8 @@ private: OwnPtr m_real_framebuffer_region; OwnPtr m_swapped_framebuffer_region; + bool m_graphical_writes_enabled { true }; + RefPtr m_userspace_real_framebuffer_vmobject; Region* m_userspace_framebuffer_region { nullptr }; };