/* * Copyright (c) 2025, Aliaksandr Kalenik * * SPDX-License-Identifier: BSD-2-Clause */ #include #include namespace Web::HTML { RenderingThread::RenderingThread() : m_main_thread_event_loop(Core::EventLoop::current()) { } RenderingThread::~RenderingThread() { m_exit = true; m_rendering_task_ready_wake_condition.signal(); (void)m_thread->join(); } void RenderingThread::start() { VERIFY(m_skia_player); m_thread = Threading::Thread::construct([this] { rendering_thread_loop(); return static_cast(0); }); m_thread->start(); } void RenderingThread::rendering_thread_loop() { while (true) { auto task = [this]() -> Optional { Threading::MutexLocker const locker { m_rendering_task_mutex }; while (m_rendering_tasks.is_empty() && !m_exit) { m_rendering_task_ready_wake_condition.wait(); } if (m_exit) return {}; return m_rendering_tasks.dequeue(); }(); if (!task.has_value()) { VERIFY(m_exit); break; } m_skia_player->execute(*task->display_list, task->painting_surface); m_main_thread_event_loop.deferred_invoke([callback = move(task->callback)] { callback(); }); } } void RenderingThread::enqueue_rendering_task(RefPtr display_list, NonnullRefPtr painting_surface, Function&& callback) { Threading::MutexLocker const locker { m_rendering_task_mutex }; m_rendering_tasks.enqueue(Task { move(display_list), move(painting_surface), move(callback) }); m_rendering_task_ready_wake_condition.signal(); } }