#ifndef ANDROID_WEBVIEW_BROWSER_GFX_TASK_QUEUE_WEBVIEW_H_
#define ANDROID_WEBVIEW_BROWSER_GFX_TASK_QUEUE_WEBVIEW_H_
#include <memory>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/scoped_refptr.h"
#include "base/synchronization/condition_variable.h"
#include "base/synchronization/lock.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/thread_checker.h"
#include "gpu/command_buffer/common/command_buffer_id.h"
#include "gpu/command_buffer/common/constants.h"
#include "gpu/command_buffer/service/sequence_id.h"
#include "gpu/command_buffer/service/task_graph.h"
namespace gpu {
class BlockingSequenceRunner;
}
namespace android_webview {
class TaskQueueWebView {
public:
static TaskQueueWebView* GetInstance();
TaskQueueWebView(const TaskQueueWebView&) = delete;
TaskQueueWebView& operator=(const TaskQueueWebView&) = delete;
~TaskQueueWebView();
void InitializeVizThread(
const scoped_refptr<base::SingleThreadTaskRunner>& viz_task_runner);
using VizTask = base::OnceCallback<void(base::OnceClosure)>;
void ScheduleOnVizAndBlock(VizTask viz_task);
scoped_refptr<base::SingleThreadTaskRunner> GetClientTaskRunner();
void ResetRenderThreadForTesting() {
DETACH_FROM_THREAD(render_thread_checker_);
}
void EnsureSequenceInitialized();
gpu::SequenceId GetSequenceId();
void ScheduleTask(gpu::TaskCallback task,
std::vector<gpu::SyncToken> sync_token_fences,
const gpu::SyncToken& release,
gpu::ReportingCallback report_callback);
void ScheduleTask(base::OnceClosure task,
std::vector<gpu::SyncToken> sync_token_fences,
const gpu::SyncToken& release,
gpu::ReportingCallback report_callback);
void ScheduleOrRetainTask(base::OnceClosure task,
std::vector<gpu::SyncToken> sync_token_fences,
const gpu::SyncToken& release,
gpu::ReportingCallback report_callback);
void ScheduleIdleTask(base::OnceClosure task);
[[nodiscard]] gpu::ScopedSyncPointClientState CreateSyncPointClientState(
gpu::CommandBufferNamespace namespace_id,
gpu::CommandBufferId command_buffer_id);
private:
TaskQueueWebView();
void RunOnViz(VizTask viz_task);
void SignalDone();
scoped_refptr<base::SingleThreadTaskRunner> viz_task_runner_;
THREAD_CHECKER(render_thread_checker_);
bool allow_schedule_task_ = false;
bool inside_schedule_on_viz_and_block_ = false;
base::Lock lock_;
base::ConditionVariable condvar_{&lock_};
bool done_ GUARDED_BY(lock_) = true;
std::unique_ptr<gpu::BlockingSequenceRunner> blocking_sequence_runner_
GUARDED_BY(lock_);
};
}
#endif