/* * Copyright (c) 2025, Aliaksandr Kalenik * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Web::HTML { class RenderingThread { AK_MAKE_NONCOPYABLE(RenderingThread); AK_MAKE_NONMOVABLE(RenderingThread); public: RenderingThread(); ~RenderingThread(); void start(); void set_skia_player(OwnPtr&& player) { m_skia_player = move(player); } void enqueue_rendering_task(RefPtr, NonnullRefPtr, Function&& callback); private: void rendering_thread_loop(); Core::EventLoop& m_main_thread_event_loop; OwnPtr m_skia_player; RefPtr m_thread; Atomic m_exit { false }; struct Task { RefPtr display_list; NonnullRefPtr painting_surface; 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 }; }; }