| Index: gpu/command_buffer/service/scheduler_unittest.cc
|
| diff --git a/gpu/command_buffer/service/scheduler_unittest.cc b/gpu/command_buffer/service/scheduler_unittest.cc
|
| deleted file mode 100644
|
| index 43328b33577c1600cf9870720f9671b4a6b6d08d..0000000000000000000000000000000000000000
|
| --- a/gpu/command_buffer/service/scheduler_unittest.cc
|
| +++ /dev/null
|
| @@ -1,335 +0,0 @@
|
| -// Copyright (c) 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 "gpu/command_buffer/service/scheduler.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/memory/ptr_util.h"
|
| -#include "base/test/test_simple_task_runner.h"
|
| -#include "gpu/command_buffer/service/sync_point_manager.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace gpu {
|
| -namespace {
|
| -
|
| -template <typename T>
|
| -void RunFunctor(T functor) {
|
| - functor();
|
| -}
|
| -
|
| -template <typename T>
|
| -base::OnceClosure GetClosure(T functor) {
|
| - return base::BindOnce(&RunFunctor<T>, functor);
|
| -}
|
| -
|
| -class SchedulerTest : public testing::Test {
|
| - public:
|
| - SchedulerTest()
|
| - : task_runner_(new base::TestSimpleTaskRunner()),
|
| - sync_point_manager_(new SyncPointManager),
|
| - scheduler_(new Scheduler(task_runner_, sync_point_manager_.get())) {}
|
| -
|
| - protected:
|
| - base::TestSimpleTaskRunner* task_runner() const { return task_runner_.get(); }
|
| -
|
| - SyncPointManager* sync_point_manager() const {
|
| - return sync_point_manager_.get();
|
| - }
|
| -
|
| - Scheduler* scheduler() const { return scheduler_.get(); }
|
| -
|
| - private:
|
| - scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
|
| - std::unique_ptr<SyncPointManager> sync_point_manager_;
|
| - std::unique_ptr<Scheduler> scheduler_;
|
| -};
|
| -
|
| -TEST_F(SchedulerTest, ScheduledTasksRunInOrder) {
|
| - SequenceId sequence_id =
|
| - scheduler()->CreateSequence(SchedulingPriority::kNormal);
|
| -
|
| - bool ran1 = false;
|
| - scheduler()->ScheduleTask(sequence_id, GetClosure([&] { ran1 = true; }),
|
| - std::vector<SyncToken>());
|
| -
|
| - bool ran2 = false;
|
| - scheduler()->ScheduleTask(sequence_id, GetClosure([&] { ran2 = true; }),
|
| - std::vector<SyncToken>());
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran1);
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran2);
|
| -}
|
| -
|
| -TEST_F(SchedulerTest, ContinuedTasksRunFirst) {
|
| - SequenceId sequence_id =
|
| - scheduler()->CreateSequence(SchedulingPriority::kNormal);
|
| -
|
| - bool ran1 = false;
|
| - bool continued1 = false;
|
| - scheduler()->ScheduleTask(sequence_id, GetClosure([&] {
|
| - scheduler()->ContinueTask(
|
| - sequence_id,
|
| - GetClosure([&] { continued1 = true; }));
|
| - ran1 = true;
|
| - }),
|
| - std::vector<SyncToken>());
|
| -
|
| - bool ran2 = false;
|
| - scheduler()->ScheduleTask(sequence_id, GetClosure([&] { ran2 = true; }),
|
| - std::vector<SyncToken>());
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran1);
|
| - EXPECT_FALSE(continued1);
|
| - EXPECT_FALSE(ran2);
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(continued1);
|
| - EXPECT_FALSE(ran2);
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran2);
|
| -}
|
| -
|
| -TEST_F(SchedulerTest, SequencesRunInPriorityOrder) {
|
| - SequenceId sequence_id1 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kLowest);
|
| - bool ran1 = false;
|
| - scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
|
| - std::vector<SyncToken>());
|
| -
|
| - SequenceId sequence_id2 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kNormal);
|
| - bool ran2 = false;
|
| - scheduler()->ScheduleTask(sequence_id2, GetClosure([&] { ran2 = true; }),
|
| - std::vector<SyncToken>());
|
| -
|
| - SequenceId sequence_id3 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kHighest);
|
| - bool ran3 = false;
|
| - scheduler()->ScheduleTask(sequence_id3, GetClosure([&] { ran3 = true; }),
|
| - std::vector<SyncToken>());
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran3);
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran2);
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran1);
|
| -}
|
| -
|
| -TEST_F(SchedulerTest, SequencesOfSamePriorityRunInOrder) {
|
| - SequenceId sequence_id1 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kNormal);
|
| - bool ran1 = false;
|
| - scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
|
| - std::vector<SyncToken>());
|
| -
|
| - SequenceId sequence_id2 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kNormal);
|
| - bool ran2 = false;
|
| - scheduler()->ScheduleTask(sequence_id2, GetClosure([&] { ran2 = true; }),
|
| - std::vector<SyncToken>());
|
| -
|
| - SequenceId sequence_id3 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kNormal);
|
| - bool ran3 = false;
|
| - scheduler()->ScheduleTask(sequence_id3, GetClosure([&] { ran3 = true; }),
|
| - std::vector<SyncToken>());
|
| -
|
| - SequenceId sequence_id4 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kNormal);
|
| - bool ran4 = false;
|
| - scheduler()->ScheduleTask(sequence_id4, GetClosure([&] { ran4 = true; }),
|
| - std::vector<SyncToken>());
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran1);
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran2);
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran3);
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran4);
|
| -}
|
| -
|
| -TEST_F(SchedulerTest, SequenceWaitsForFence) {
|
| - SequenceId sequence_id1 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kHighest);
|
| - SequenceId sequence_id2 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kNormal);
|
| -
|
| - CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
|
| - CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
|
| -
|
| - scoped_refptr<SyncPointClientState> release_state =
|
| - sync_point_manager()->CreateSyncPointClientState(
|
| - namespace_id, command_buffer_id, sequence_id2);
|
| -
|
| - uint64_t release = 1;
|
| - bool ran2 = false;
|
| - scheduler()->ScheduleTask(sequence_id2, GetClosure([&] {
|
| - release_state->ReleaseFenceSync(release);
|
| - ran2 = true;
|
| - }),
|
| - std::vector<SyncToken>());
|
| -
|
| - SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
|
| - command_buffer_id, release);
|
| -
|
| - bool ran1 = false;
|
| - scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
|
| - {sync_token});
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_FALSE(ran1);
|
| - EXPECT_TRUE(ran2);
|
| - EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran1);
|
| -
|
| - release_state->Destroy();
|
| -}
|
| -
|
| -TEST_F(SchedulerTest, SequenceDoesNotWaitForInvalidFence) {
|
| - SequenceId sequence_id1 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kNormal);
|
| -
|
| - SequenceId sequence_id2 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kNormal);
|
| - CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
|
| - CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
|
| - scoped_refptr<SyncPointClientState> release_state =
|
| - sync_point_manager()->CreateSyncPointClientState(
|
| - namespace_id, command_buffer_id, sequence_id2);
|
| -
|
| - uint64_t release = 1;
|
| - SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
|
| - command_buffer_id, release);
|
| -
|
| - bool ran1 = false;
|
| - scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
|
| - {sync_token});
|
| -
|
| - // Release task is scheduled after wait task so release is treated as non-
|
| - // existent.
|
| - bool ran2 = false;
|
| - scheduler()->ScheduleTask(sequence_id2, GetClosure([&] {
|
| - release_state->ReleaseFenceSync(release);
|
| - ran2 = true;
|
| - }),
|
| - std::vector<SyncToken>());
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran1);
|
| - EXPECT_FALSE(ran2);
|
| - EXPECT_FALSE(sync_point_manager()->IsSyncTokenReleased(sync_token));
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran2);
|
| - EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
|
| -
|
| - release_state->Destroy();
|
| -}
|
| -
|
| -TEST_F(SchedulerTest, ReleaseSequenceIsPrioritized) {
|
| - SequenceId sequence_id1 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kNormal);
|
| -
|
| - bool ran1 = false;
|
| - scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
|
| - std::vector<SyncToken>());
|
| -
|
| - SequenceId sequence_id2 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kLowest);
|
| - CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
|
| - CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
|
| - scoped_refptr<SyncPointClientState> release_state =
|
| - sync_point_manager()->CreateSyncPointClientState(
|
| - namespace_id, command_buffer_id, sequence_id2);
|
| -
|
| - uint64_t release = 1;
|
| - bool ran2 = false;
|
| - scheduler()->ScheduleTask(sequence_id2, GetClosure([&] {
|
| - release_state->ReleaseFenceSync(release);
|
| - ran2 = true;
|
| - }),
|
| - std::vector<SyncToken>());
|
| -
|
| - bool ran3 = false;
|
| - SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
|
| - command_buffer_id, release);
|
| - SequenceId sequence_id3 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kHighest);
|
| - scheduler()->ScheduleTask(sequence_id3, GetClosure([&] { ran3 = true; }),
|
| - {sync_token});
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_FALSE(ran1);
|
| - EXPECT_TRUE(ran2);
|
| - EXPECT_FALSE(ran3);
|
| - EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_FALSE(ran1);
|
| - EXPECT_TRUE(ran3);
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran1);
|
| -
|
| - release_state->Destroy();
|
| -}
|
| -
|
| -TEST_F(SchedulerTest, ReleaseSequenceShouldYield) {
|
| - SequenceId sequence_id1 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kLowest);
|
| - CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
|
| - CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
|
| - scoped_refptr<SyncPointClientState> release_state =
|
| - sync_point_manager()->CreateSyncPointClientState(
|
| - namespace_id, command_buffer_id, sequence_id1);
|
| -
|
| - uint64_t release = 1;
|
| - bool ran1 = false;
|
| - scheduler()->ScheduleTask(
|
| - sequence_id1, GetClosure([&] {
|
| - EXPECT_FALSE(scheduler()->ShouldYield(sequence_id1));
|
| - release_state->ReleaseFenceSync(release);
|
| - EXPECT_TRUE(scheduler()->ShouldYield(sequence_id1));
|
| - ran1 = true;
|
| - }),
|
| - std::vector<SyncToken>());
|
| -
|
| - bool ran2 = false;
|
| - SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
|
| - command_buffer_id, release);
|
| - SequenceId sequence_id2 =
|
| - scheduler()->CreateSequence(SchedulingPriority::kHighest);
|
| - scheduler()->ScheduleTask(sequence_id2, GetClosure([&] { ran2 = true; }),
|
| - {sync_token});
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran1);
|
| - EXPECT_FALSE(ran2);
|
| - EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
|
| -
|
| - task_runner()->RunPendingTasks();
|
| - EXPECT_TRUE(ran2);
|
| -
|
| - release_state->Destroy();
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace gpu
|
|
|