/* * Copyright (c) 2025, Aliaksandr Kalenik * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include namespace Web::HTML { class RenderingThread { AK_MAKE_NONCOPYABLE(RenderingThread); AK_MAKE_NONMOVABLE(RenderingThread); public: RenderingThread(); ~RenderingThread(); void start(DisplayListPlayerType); void set_skia_player(OwnPtr&& player) { m_skia_player = move(player); } void set_skia_backend_context(RefPtr context) { m_skia_backend_context = move(context); } void enqueue_rendering_task(NonnullRefPtr, Painting::ScrollStateSnapshot&&, NonnullRefPtr, Function&& callback); void clear_bitmap_to_surface_cache(); private: void rendering_thread_loop(); NonnullRefPtr painting_surface_for_backing_store(Painting::BackingStore& backing_store); Core::EventLoop& m_main_thread_event_loop; DisplayListPlayerType m_display_list_player_type; OwnPtr m_skia_player; RefPtr m_skia_backend_context; RefPtr m_thread; Atomic m_exit { false }; struct Task { NonnullRefPtr display_list; Painting::ScrollStateSnapshot scroll_state_snapshot; NonnullRefPtr backing_store; Function callback; }; // NOTE: Queue will only contain multiple items in case tasks were scheduled by screenshot requests. // Otherwise, it will contain only one item at a time. Queue m_rendering_tasks; Threading::Mutex m_rendering_task_mutex; Threading::ConditionVariable m_rendering_task_ready_wake_condition { m_rendering_task_mutex }; HashMap> m_bitmap_to_surface; bool m_needs_to_clear_bitmap_to_surface_cache { false }; }; }