Commit 41e917d2 authored by Alexander Timin's avatar Alexander Timin Committed by Commit Bot

[scheduler] Prioritise input events on the compositor thread

Bind input-related mojo interface to the input task runner and add a
feature to assign the highest priority to it.

BUG=857099
R=alexclarke@chromium.org,yutak@chromium.org,haraken@chromium.org,rkaplow@chromium.org
CC=​eseckler@chromium.org,hajimehoshi@chromium.org

Change-Id: I19f3e08bcc6af626dba298f31570102ddaffc4ac
Reviewed-on: https://chromium-review.googlesource.com/1117188Reviewed-by: default avatarAlex Clarke <alexclarke@chromium.org>
Reviewed-by: default avatarRobert Kaplow <rkaplow@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarYuta Kitamura <yutak@chromium.org>
Commit-Queue: Alexander Timin <altimin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#571916}
parent 16ebf6e3
...@@ -574,10 +574,13 @@ void RenderWidget::Init(const ShowCallback& show_callback, ...@@ -574,10 +574,13 @@ void RenderWidget::Init(const ShowCallback& show_callback,
RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); RenderThreadImpl* render_thread_impl = RenderThreadImpl::current();
blink::scheduler::WebThreadScheduler* compositor_thread_scheduler =
blink::scheduler::WebThreadScheduler::CompositorThreadScheduler();
widget_input_handler_manager_ = WidgetInputHandlerManager::Create( widget_input_handler_manager_ = WidgetInputHandlerManager::Create(
weak_ptr_factory_.GetWeakPtr(), weak_ptr_factory_.GetWeakPtr(),
render_thread_impl && compositor_ compositor_thread_scheduler && compositor_
? render_thread_impl->compositor_task_runner() ? compositor_thread_scheduler->InputTaskRunner()
: nullptr, : nullptr,
render_thread_impl ? render_thread_impl->GetWebMainThreadScheduler() render_thread_impl ? render_thread_impl->GetWebMainThreadScheduler()
: nullptr); : nullptr);
......
...@@ -757,7 +757,7 @@ ...@@ -757,7 +757,7 @@
] ]
} }
], ],
"BlinkSchedulerHighPriorityInput": [ "BlinkSchedulerHighPriorityInputOnCompositorThread": [
{ {
"platforms": [ "platforms": [
"android", "android",
...@@ -769,7 +769,27 @@ ...@@ -769,7 +769,27 @@
], ],
"experiments": [ "experiments": [
{ {
"name": "BlinkSchedulerHighPriorityInput", "name": "Enabled",
"enable_features": [
"BlinkSchedulerHighPriorityInputOnCompositorThread"
]
}
]
}
],
"BlinkSchedulerHighPriorityInputOnMainThread": [
{
"platforms": [
"android",
"chromeos",
"ios",
"linux",
"mac",
"win"
],
"experiments": [
{
"name": "Enabled",
"enable_features": [ "enable_features": [
"BlinkSchedulerHighPriorityInput" "BlinkSchedulerHighPriorityInput"
] ]
......
...@@ -74,6 +74,10 @@ class BLINK_PLATFORM_EXPORT WebThreadScheduler { ...@@ -74,6 +74,10 @@ class BLINK_PLATFORM_EXPORT WebThreadScheduler {
static std::unique_ptr<WebThreadScheduler> CreateMainThreadScheduler( static std::unique_ptr<WebThreadScheduler> CreateMainThreadScheduler(
base::Optional<base::Time> initial_virtual_time = base::nullopt); base::Optional<base::Time> initial_virtual_time = base::nullopt);
// Returns compositor thread scheduler for the compositor thread
// of the current process.
static WebThreadScheduler* CompositorThreadScheduler();
// Returns the default task runner. // Returns the default task runner.
virtual scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner(); virtual scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner();
......
...@@ -183,11 +183,12 @@ enum class TaskType : unsigned { ...@@ -183,11 +183,12 @@ enum class TaskType : unsigned {
kMainThreadTaskQueueIPC = 42, kMainThreadTaskQueueIPC = 42,
kMainThreadTaskQueueControl = 43, kMainThreadTaskQueueControl = 43,
kCompositorThreadTaskQueueDefault = 45, kCompositorThreadTaskQueueDefault = 45,
kCompositorThreadTaskQueueInput = 49,
kWorkerThreadTaskQueueDefault = 46, kWorkerThreadTaskQueueDefault = 46,
kWorkerThreadTaskQueueV8 = 47, kWorkerThreadTaskQueueV8 = 47,
kWorkerThreadTaskQueueCompositor = 48, kWorkerThreadTaskQueueCompositor = 48,
kCount = 49, kCount = 50,
}; };
} // namespace blink } // namespace blink
......
...@@ -215,6 +215,7 @@ jumbo_source_set("unit_tests") { ...@@ -215,6 +215,7 @@ jumbo_source_set("unit_tests") {
"renderer/webthread_impl_for_renderer_scheduler_unittest.cc", "renderer/webthread_impl_for_renderer_scheduler_unittest.cc",
"util/thread_load_tracker_unittest.cc", "util/thread_load_tracker_unittest.cc",
"util/tracing_helper_unittest.cc", "util/tracing_helper_unittest.cc",
"worker/compositor_thread_scheduler_unittest.cc",
"worker/worker_scheduler_proxy_unittest.cc", "worker/worker_scheduler_proxy_unittest.cc",
"worker/worker_scheduler_unittest.cc", "worker/worker_scheduler_unittest.cc",
"worker/worker_thread_scheduler_unittest.cc", "worker/worker_thread_scheduler_unittest.cc",
......
...@@ -10,8 +10,12 @@ ...@@ -10,8 +10,12 @@
namespace blink { namespace blink {
namespace scheduler { namespace scheduler {
const base::Feature kHighPriorityInput{"BlinkSchedulerHighPriorityInput", const base::Feature kHighPriorityInputOnMainThread{
base::FEATURE_DISABLED_BY_DEFAULT}; "BlinkSchedulerHighPriorityInput", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kHighPriorityInputOnCompositorThread{
"BlinkSchedulerHighPriorityInputOnCompositorThread",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kDedicatedWorkerThrottling{ const base::Feature kDedicatedWorkerThrottling{
"BlinkSchedulerWorkerThrottling", base::FEATURE_DISABLED_BY_DEFAULT}; "BlinkSchedulerWorkerThrottling", base::FEATURE_DISABLED_BY_DEFAULT};
......
...@@ -32,9 +32,11 @@ void SchedulerHelper::InitDefaultQueues( ...@@ -32,9 +32,11 @@ void SchedulerHelper::InitDefaultQueues(
TaskType default_task_type) { TaskType default_task_type) {
control_task_queue->SetQueuePriority(TaskQueue::kControlPriority); control_task_queue->SetQueuePriority(TaskQueue::kControlPriority);
default_task_runner_ =
TaskQueueWithTaskType::Create(default_task_queue, default_task_type);
DCHECK(sequence_manager_); DCHECK(sequence_manager_);
sequence_manager_->SetDefaultTaskRunner( sequence_manager_->SetDefaultTaskRunner(default_task_runner_);
TaskQueueWithTaskType::Create(default_task_queue, default_task_type));
} }
SchedulerHelper::~SchedulerHelper() { SchedulerHelper::~SchedulerHelper() {
...@@ -49,6 +51,11 @@ void SchedulerHelper::Shutdown() { ...@@ -49,6 +51,11 @@ void SchedulerHelper::Shutdown() {
sequence_manager_.reset(); sequence_manager_.reset();
} }
scoped_refptr<base::SingleThreadTaskRunner>
SchedulerHelper::DefaultTaskRunner() {
return default_task_runner_;
}
void SchedulerHelper::SetWorkBatchSizeForTesting(size_t work_batch_size) { void SchedulerHelper::SetWorkBatchSizeForTesting(size_t work_batch_size) {
CheckOnValidThread(); CheckOnValidThread();
DCHECK(sequence_manager_.get()); DCHECK(sequence_manager_.get());
......
...@@ -44,6 +44,9 @@ class PLATFORM_EXPORT SchedulerHelper ...@@ -44,6 +44,9 @@ class PLATFORM_EXPORT SchedulerHelper
virtual scoped_refptr<base::sequence_manager::TaskQueue> virtual scoped_refptr<base::sequence_manager::TaskQueue>
ControlTaskQueue() = 0; ControlTaskQueue() = 0;
// Returns task runner for the default queue.
scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner();
// Adds or removes a task observer from the scheduler. The observer will be // Adds or removes a task observer from the scheduler. The observer will be
// notified before and after every executed task. These functions can only be // notified before and after every executed task. These functions can only be
// called on the thread this class was created on. // called on the thread this class was created on.
...@@ -108,6 +111,8 @@ class PLATFORM_EXPORT SchedulerHelper ...@@ -108,6 +111,8 @@ class PLATFORM_EXPORT SchedulerHelper
private: private:
friend class SchedulerHelperTest; friend class SchedulerHelperTest;
scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
Observer* observer_; // NOT OWNED Observer* observer_; // NOT OWNED
DISALLOW_COPY_AND_ASSIGN(SchedulerHelper); DISALLOW_COPY_AND_ASSIGN(SchedulerHelper);
......
...@@ -358,6 +358,7 @@ scoped_refptr<base::SingleThreadTaskRunner> FrameSchedulerImpl::GetTaskRunner( ...@@ -358,6 +358,7 @@ scoped_refptr<base::SingleThreadTaskRunner> FrameSchedulerImpl::GetTaskRunner(
case TaskType::kMainThreadTaskQueueIPC: case TaskType::kMainThreadTaskQueueIPC:
case TaskType::kMainThreadTaskQueueControl: case TaskType::kMainThreadTaskQueueControl:
case TaskType::kCompositorThreadTaskQueueDefault: case TaskType::kCompositorThreadTaskQueueDefault:
case TaskType::kCompositorThreadTaskQueueInput:
case TaskType::kWorkerThreadTaskQueueDefault: case TaskType::kWorkerThreadTaskQueueDefault:
case TaskType::kWorkerThreadTaskQueueV8: case TaskType::kWorkerThreadTaskQueueV8:
case TaskType::kWorkerThreadTaskQueueCompositor: case TaskType::kWorkerThreadTaskQueueCompositor:
......
...@@ -203,6 +203,8 @@ const char* TaskTypeToString(TaskType task_type) { ...@@ -203,6 +203,8 @@ const char* TaskTypeToString(TaskType task_type) {
return "InternalIntersectionObserver"; return "InternalIntersectionObserver";
case TaskType::kCompositorThreadTaskQueueDefault: case TaskType::kCompositorThreadTaskQueueDefault:
return "CompositorThreadTaskQueueDefault"; return "CompositorThreadTaskQueueDefault";
case TaskType::kCompositorThreadTaskQueueInput:
return "CompositorThreadTaskQueueInput";
case TaskType::kWorkerThreadTaskQueueDefault: case TaskType::kWorkerThreadTaskQueueDefault:
return "WorkerThreadTaskQueueDefault"; return "WorkerThreadTaskQueueDefault";
case TaskType::kWorkerThreadTaskQueueV8: case TaskType::kWorkerThreadTaskQueueV8:
...@@ -321,9 +323,6 @@ MainThreadSchedulerImpl::MainThreadSchedulerImpl( ...@@ -321,9 +323,6 @@ MainThreadSchedulerImpl::MainThreadSchedulerImpl(
control_task_runner_ = control_task_runner_ =
TaskQueueWithTaskType::Create(helper_.ControlMainThreadTaskQueue(), TaskQueueWithTaskType::Create(helper_.ControlMainThreadTaskQueue(),
TaskType::kMainThreadTaskQueueControl); TaskType::kMainThreadTaskQueueControl);
default_task_runner_ =
TaskQueueWithTaskType::Create(helper_.DefaultMainThreadTaskQueue(),
TaskType::kMainThreadTaskQueueDefault);
input_task_runner_ = TaskQueueWithTaskType::Create( input_task_runner_ = TaskQueueWithTaskType::Create(
input_task_queue_, TaskType::kMainThreadTaskQueueInput); input_task_queue_, TaskType::kMainThreadTaskQueueInput);
ipc_task_runner_ = TaskQueueWithTaskType::Create( ipc_task_runner_ = TaskQueueWithTaskType::Create(
...@@ -635,7 +634,8 @@ MainThreadSchedulerImpl::AnyThread::AnyThread( ...@@ -635,7 +634,8 @@ MainThreadSchedulerImpl::AnyThread::AnyThread(
YesNoStateToString) {} YesNoStateToString) {}
MainThreadSchedulerImpl::SchedulingSettings::SchedulingSettings() { MainThreadSchedulerImpl::SchedulingSettings::SchedulingSettings() {
high_priority_input = base::FeatureList::IsEnabled(kHighPriorityInput); high_priority_input =
base::FeatureList::IsEnabled(kHighPriorityInputOnMainThread);
low_priority_background_page = low_priority_background_page =
base::FeatureList::IsEnabled(kLowPriorityForBackgroundPages); base::FeatureList::IsEnabled(kLowPriorityForBackgroundPages);
...@@ -701,7 +701,7 @@ MainThreadSchedulerImpl::ControlTaskRunner() { ...@@ -701,7 +701,7 @@ MainThreadSchedulerImpl::ControlTaskRunner() {
scoped_refptr<base::SingleThreadTaskRunner> scoped_refptr<base::SingleThreadTaskRunner>
MainThreadSchedulerImpl::DefaultTaskRunner() { MainThreadSchedulerImpl::DefaultTaskRunner() {
return default_task_runner_; return helper_.DefaultTaskRunner();
} }
scoped_refptr<base::SingleThreadTaskRunner> scoped_refptr<base::SingleThreadTaskRunner>
......
...@@ -762,7 +762,6 @@ class PLATFORM_EXPORT MainThreadSchedulerImpl ...@@ -762,7 +762,6 @@ class PLATFORM_EXPORT MainThreadSchedulerImpl
scoped_refptr<TaskQueueWithTaskType> v8_task_runner_; scoped_refptr<TaskQueueWithTaskType> v8_task_runner_;
scoped_refptr<TaskQueueWithTaskType> compositor_task_runner_; scoped_refptr<TaskQueueWithTaskType> compositor_task_runner_;
scoped_refptr<TaskQueueWithTaskType> control_task_runner_; scoped_refptr<TaskQueueWithTaskType> control_task_runner_;
scoped_refptr<TaskQueueWithTaskType> default_task_runner_;
scoped_refptr<TaskQueueWithTaskType> input_task_runner_; scoped_refptr<TaskQueueWithTaskType> input_task_runner_;
scoped_refptr<TaskQueueWithTaskType> ipc_task_runner_; scoped_refptr<TaskQueueWithTaskType> ipc_task_runner_;
......
...@@ -307,7 +307,7 @@ class MainThreadSchedulerImplTest : public testing::Test { ...@@ -307,7 +307,7 @@ class MainThreadSchedulerImplTest : public testing::Test {
} }
MainThreadSchedulerImplTest() MainThreadSchedulerImplTest()
: MainThreadSchedulerImplTest({kHighPriorityInput}, : MainThreadSchedulerImplTest({kHighPriorityInputOnMainThread},
{kPrioritizeCompositingAfterInput}) {} {kPrioritizeCompositingAfterInput}) {}
~MainThreadSchedulerImplTest() override = default; ~MainThreadSchedulerImplTest() override = default;
...@@ -3911,7 +3911,7 @@ class CompositingExperimentWithExplicitSignalsTest ...@@ -3911,7 +3911,7 @@ class CompositingExperimentWithExplicitSignalsTest
public: public:
CompositingExperimentWithExplicitSignalsTest() CompositingExperimentWithExplicitSignalsTest()
: MainThreadSchedulerImplTest( : MainThreadSchedulerImplTest(
{kHighPriorityInput, kPrioritizeCompositingAfterInput, {kHighPriorityInputOnMainThread, kPrioritizeCompositingAfterInput,
kUseExplicitSignalForTriggeringCompositingPrioritization, kUseExplicitSignalForTriggeringCompositingPrioritization,
kUseWillBeginMainFrameForCompositingPrioritization}, kUseWillBeginMainFrameForCompositingPrioritization},
{}) {} {}) {}
...@@ -3953,7 +3953,7 @@ class CompositingExperimentWithImplicitSignalsTest ...@@ -3953,7 +3953,7 @@ class CompositingExperimentWithImplicitSignalsTest
public: public:
CompositingExperimentWithImplicitSignalsTest() CompositingExperimentWithImplicitSignalsTest()
: MainThreadSchedulerImplTest( : MainThreadSchedulerImplTest(
{kHighPriorityInput, kPrioritizeCompositingAfterInput}, {kHighPriorityInputOnMainThread, kPrioritizeCompositingAfterInput},
{kHighestPriorityForCompositingAfterInput, {kHighestPriorityForCompositingAfterInput,
kUseExplicitSignalForTriggeringCompositingPrioritization, kUseExplicitSignalForTriggeringCompositingPrioritization,
kUseWillBeginMainFrameForCompositingPrioritization}) {} kUseWillBeginMainFrameForCompositingPrioritization}) {}
......
...@@ -13,20 +13,53 @@ ...@@ -13,20 +13,53 @@
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/task_type.h"
#include "third_party/blink/renderer/platform/scheduler/base/task_queue_forward.h" #include "third_party/blink/renderer/platform/scheduler/base/task_queue_forward.h"
#include "third_party/blink/renderer/platform/scheduler/child/features.h"
#include "third_party/blink/renderer/platform/scheduler/child/task_queue_with_task_type.h" #include "third_party/blink/renderer/platform/scheduler/child/task_queue_with_task_type.h"
#include "third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h" #include "third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h"
namespace blink { namespace blink {
namespace scheduler { namespace scheduler {
namespace {
CompositorThreadScheduler* g_compositor_thread_scheduler = nullptr;
} // namespace
// static
WebThreadScheduler* WebThreadScheduler::CompositorThreadScheduler() {
return g_compositor_thread_scheduler;
}
CompositorThreadScheduler::CompositorThreadScheduler( CompositorThreadScheduler::CompositorThreadScheduler(
std::unique_ptr<base::sequence_manager::SequenceManager> sequence_manager) std::unique_ptr<base::sequence_manager::SequenceManager> sequence_manager)
: NonMainThreadSchedulerImpl(std::make_unique<NonMainThreadSchedulerHelper>( : NonMainThreadSchedulerImpl(std::make_unique<NonMainThreadSchedulerHelper>(
std::move(sequence_manager), std::move(sequence_manager),
this, this,
TaskType::kCompositorThreadTaskQueueDefault)) {} TaskType::kCompositorThreadTaskQueueDefault)),
input_task_queue_(
base::FeatureList::IsEnabled(kHighPriorityInputOnCompositorThread)
? helper()->NewTaskQueue(
base::sequence_manager::TaskQueue::Spec("input_tq")
.SetShouldMonitorQuiescence(true))
: nullptr),
input_task_runner_(input_task_queue_
? TaskQueueWithTaskType::Create(
input_task_queue_,
TaskType::kCompositorThreadTaskQueueInput)
: nullptr) {
if (input_task_queue_) {
input_task_queue_->SetQueuePriority(
base::sequence_manager::TaskQueue::QueuePriority::kHighestPriority);
}
DCHECK(!g_compositor_thread_scheduler);
g_compositor_thread_scheduler = this;
}
CompositorThreadScheduler::~CompositorThreadScheduler() = default; CompositorThreadScheduler::~CompositorThreadScheduler() {
DCHECK_EQ(g_compositor_thread_scheduler, this);
g_compositor_thread_scheduler = nullptr;
}
scoped_refptr<NonMainThreadTaskQueue> scoped_refptr<NonMainThreadTaskQueue>
CompositorThreadScheduler::DefaultTaskQueue() { CompositorThreadScheduler::DefaultTaskQueue() {
...@@ -51,8 +84,15 @@ CompositorThreadScheduler::IdleTaskRunner() { ...@@ -51,8 +84,15 @@ CompositorThreadScheduler::IdleTaskRunner() {
// an idle task runner with the semantics we want for the compositor thread // an idle task runner with the semantics we want for the compositor thread
// which runs them after the current frame has been drawn before the next // which runs them after the current frame has been drawn before the next
// vsync. https://crbug.com/609532 // vsync. https://crbug.com/609532
return base::MakeRefCounted<SingleThreadIdleTaskRunner>(DefaultTaskQueue(), return base::MakeRefCounted<SingleThreadIdleTaskRunner>(
this); helper()->DefaultTaskRunner(), this);
}
scoped_refptr<base::SingleThreadTaskRunner>
CompositorThreadScheduler::InputTaskRunner() {
if (input_task_runner_)
return input_task_runner_;
return helper()->DefaultTaskRunner();
} }
scoped_refptr<base::SingleThreadTaskRunner> scoped_refptr<base::SingleThreadTaskRunner>
...@@ -85,7 +125,9 @@ void CompositorThreadScheduler::RemoveTaskObserver( ...@@ -85,7 +125,9 @@ void CompositorThreadScheduler::RemoveTaskObserver(
helper()->RemoveTaskObserver(task_observer); helper()->RemoveTaskObserver(task_observer);
} }
void CompositorThreadScheduler::Shutdown() {} void CompositorThreadScheduler::Shutdown() {
input_task_queue_->ShutdownTaskQueue();
}
void CompositorThreadScheduler::OnIdleTaskPosted() {} void CompositorThreadScheduler::OnIdleTaskPosted() {}
......
...@@ -41,6 +41,7 @@ class PLATFORM_EXPORT CompositorThreadScheduler ...@@ -41,6 +41,7 @@ class PLATFORM_EXPORT CompositorThreadScheduler
override; override;
scoped_refptr<base::SingleThreadTaskRunner> V8TaskRunner() override; scoped_refptr<base::SingleThreadTaskRunner> V8TaskRunner() override;
scoped_refptr<base::SingleThreadTaskRunner> CompositorTaskRunner() override; scoped_refptr<base::SingleThreadTaskRunner> CompositorTaskRunner() override;
scoped_refptr<base::SingleThreadTaskRunner> InputTaskRunner() override;
bool ShouldYieldForHighPriorityWork() override; bool ShouldYieldForHighPriorityWork() override;
bool CanExceedIdleDeadlineIfRequired() const override; bool CanExceedIdleDeadlineIfRequired() const override;
void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer) override; void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer) override;
...@@ -59,6 +60,9 @@ class PLATFORM_EXPORT CompositorThreadScheduler ...@@ -59,6 +60,9 @@ class PLATFORM_EXPORT CompositorThreadScheduler
void InitImpl() override; void InitImpl() override;
private: private:
scoped_refptr<NonMainThreadTaskQueue> input_task_queue_;
scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_;
CompositorMetricsHelper compositor_metrics_helper_; CompositorMetricsHelper compositor_metrics_helper_;
DISALLOW_COPY_AND_ASSIGN(CompositorThreadScheduler); DISALLOW_COPY_AND_ASSIGN(CompositorThreadScheduler);
......
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/scheduler/worker/compositor_thread_scheduler.h"
#include <memory>
#include "base/macros.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/simple_test_tick_clock.h"
#include "base/test/test_mock_time_task_runner.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/platform/scheduler/base/test/sequence_manager_for_test.h"
#include "third_party/blink/renderer/platform/scheduler/child/features.h"
#include "third_party/blink/renderer/platform/wtf/functional.h"
using testing::ElementsAreArray;
using testing::ElementsAre;
namespace blink {
namespace scheduler {
// To avoid symbol collisions in jumbo builds.
namespace compositor_thread_scheduler_unittest {
class CompositorThreadSchedulerTest : public testing::Test {
public:
CompositorThreadSchedulerTest(
std::vector<base::Feature> features_to_enable,
std::vector<base::Feature> features_to_disable) {
feature_list_.InitWithFeatures(features_to_enable, features_to_disable);
}
CompositorThreadSchedulerTest() : CompositorThreadSchedulerTest({}, {}) {}
~CompositorThreadSchedulerTest() override = default;
void SetUp() override {
mock_task_runner_ = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
mock_task_runner_->AdvanceMockTickClock(
base::TimeDelta::FromMicroseconds(5000));
scheduler_ = std::make_unique<CompositorThreadScheduler>(
base::sequence_manager::SequenceManagerForTest::Create(
nullptr, mock_task_runner_, mock_task_runner_->GetMockTickClock()));
scheduler_->Init();
}
void TearDown() override {}
protected:
base::test::ScopedFeatureList feature_list_;
scoped_refptr<base::TestMockTimeTaskRunner> mock_task_runner_;
std::unique_ptr<CompositorThreadScheduler> scheduler_;
DISALLOW_COPY_AND_ASSIGN(CompositorThreadSchedulerTest);
};
class CompositorThreadInputPriorityTest : public CompositorThreadSchedulerTest {
public:
CompositorThreadInputPriorityTest()
: CompositorThreadSchedulerTest(
{kHighPriorityInputOnCompositorThread} /* features_to_enable */,
{} /* features_to_disable */) {}
~CompositorThreadInputPriorityTest() override = default;
};
namespace {
void RunTestTask(std::string name, std::vector<std::string>* log) {
log->push_back(name);
}
} // namespace
TEST_F(CompositorThreadInputPriorityTest, HighestPriorityInput) {
std::vector<std::string> run_order;
scheduler_->DefaultTaskQueue()->PostTask(
FROM_HERE,
base::BindOnce(&RunTestTask, "default", base::Unretained(&run_order)));
scheduler_->InputTaskRunner()->PostTask(
FROM_HERE,
base::BindOnce(&RunTestTask, "input", base::Unretained(&run_order)));
mock_task_runner_->RunUntilIdle();
EXPECT_THAT(run_order, testing::ElementsAre(std::string("input"),
std::string("default")));
}
class CompositorThreadNoInputPriorityTest
: public CompositorThreadSchedulerTest {
public:
CompositorThreadNoInputPriorityTest()
: CompositorThreadSchedulerTest(
{} /* features_to_enable */,
{kHighPriorityInputOnCompositorThread} /* features_to_disable */) {}
~CompositorThreadNoInputPriorityTest() override = default;
};
TEST_F(CompositorThreadNoInputPriorityTest, InputNotPrioritized) {
std::vector<std::string> run_order;
scheduler_->DefaultTaskQueue()->PostTask(
FROM_HERE,
base::BindOnce(&RunTestTask, "default", base::Unretained(&run_order)));
scheduler_->InputTaskRunner()->PostTask(
FROM_HERE,
base::BindOnce(&RunTestTask, "input", base::Unretained(&run_order)));
mock_task_runner_->RunUntilIdle();
EXPECT_THAT(run_order, testing::ElementsAre(std::string("default"),
std::string("input")));
}
} // namespace compositor_thread_scheduler_unittest
} // namespace scheduler
} // namespace blink
...@@ -137,6 +137,7 @@ scoped_refptr<base::SingleThreadTaskRunner> WorkerScheduler::GetTaskRunner( ...@@ -137,6 +137,7 @@ scoped_refptr<base::SingleThreadTaskRunner> WorkerScheduler::GetTaskRunner(
case TaskType::kMainThreadTaskQueueIPC: case TaskType::kMainThreadTaskQueueIPC:
case TaskType::kMainThreadTaskQueueControl: case TaskType::kMainThreadTaskQueueControl:
case TaskType::kCompositorThreadTaskQueueDefault: case TaskType::kCompositorThreadTaskQueueDefault:
case TaskType::kCompositorThreadTaskQueueInput:
case TaskType::kWorkerThreadTaskQueueDefault: case TaskType::kWorkerThreadTaskQueueDefault:
case TaskType::kWorkerThreadTaskQueueV8: case TaskType::kWorkerThreadTaskQueueV8:
case TaskType::kWorkerThreadTaskQueueCompositor: case TaskType::kWorkerThreadTaskQueueCompositor:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment