Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(288)

Side by Side Diff: gpu/command_buffer/service/scheduler_unittest.cc

Issue 2814843002: gpu: GPU service scheduler. (Closed)
Patch Set: enum -> enum class Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "gpu/command_buffer/service/scheduler.h"
6
7 #include <algorithm>
8
9 #include "base/bind.h"
10 #include "base/memory/ptr_util.h"
11 #include "base/test/test_simple_task_runner.h"
12 #include "gpu/command_buffer/service/sync_point_manager.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace gpu {
16 namespace {
17
18 template <typename T>
19 void RunFunctor(T functor) {
20 functor();
21 }
22
23 template <typename T>
24 base::OnceClosure GetClosure(T functor) {
25 return base::BindOnce(&RunFunctor<T>, functor);
26 }
27
28 class SchedulerTest : public testing::Test {
29 public:
30 SchedulerTest()
31 : task_runner_(new base::TestSimpleTaskRunner()),
32 sync_point_manager_(new SyncPointManager),
33 scheduler_(new Scheduler(task_runner_, sync_point_manager_.get())) {}
34
35 protected:
36 base::TestSimpleTaskRunner* task_runner() const { return task_runner_.get(); }
37
38 SyncPointManager* sync_point_manager() const {
39 return sync_point_manager_.get();
40 }
41
42 Scheduler* scheduler() const { return scheduler_.get(); }
43
44 private:
45 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
46 std::unique_ptr<SyncPointManager> sync_point_manager_;
47 std::unique_ptr<Scheduler> scheduler_;
48 };
49
50 TEST_F(SchedulerTest, ScheduledTasksRunInOrder) {
51 SequenceId sequence_id =
52 scheduler()->CreateSequence(SchedulingPriority::kNormal);
53
54 bool ran1 = false;
55 scheduler()->ScheduleTask(sequence_id, GetClosure([&] { ran1 = true; }),
56 std::vector<SyncToken>());
57
58 bool ran2 = false;
59 scheduler()->ScheduleTask(sequence_id, GetClosure([&] { ran2 = true; }),
60 std::vector<SyncToken>());
61
62 task_runner()->RunPendingTasks();
63 EXPECT_TRUE(ran1);
64
65 task_runner()->RunPendingTasks();
66 EXPECT_TRUE(ran2);
67 }
68
69 TEST_F(SchedulerTest, ContinuedTasksRunFirst) {
70 SequenceId sequence_id =
71 scheduler()->CreateSequence(SchedulingPriority::kNormal);
72
73 bool ran1 = false;
74 bool continued1 = false;
75 scheduler()->ScheduleTask(sequence_id, GetClosure([&] {
76 scheduler()->ContinueTask(
77 sequence_id,
78 GetClosure([&] { continued1 = true; }));
79 ran1 = true;
80 }),
81 std::vector<SyncToken>());
82
83 bool ran2 = false;
84 scheduler()->ScheduleTask(sequence_id, GetClosure([&] { ran2 = true; }),
85 std::vector<SyncToken>());
86
87 task_runner()->RunPendingTasks();
88 EXPECT_TRUE(ran1);
89 EXPECT_FALSE(continued1);
90 EXPECT_FALSE(ran2);
91
92 task_runner()->RunPendingTasks();
93 EXPECT_TRUE(continued1);
94 EXPECT_FALSE(ran2);
95
96 task_runner()->RunPendingTasks();
97 EXPECT_TRUE(ran2);
98 }
99
100 TEST_F(SchedulerTest, SequencesRunInPriorityOrder) {
101 SequenceId sequence_id1 =
102 scheduler()->CreateSequence(SchedulingPriority::kLowest);
103 bool ran1 = false;
104 scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
105 std::vector<SyncToken>());
106
107 SequenceId sequence_id2 =
108 scheduler()->CreateSequence(SchedulingPriority::kNormal);
109 bool ran2 = false;
110 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] { ran2 = true; }),
111 std::vector<SyncToken>());
112
113 SequenceId sequence_id3 =
114 scheduler()->CreateSequence(SchedulingPriority::kHighest);
115 bool ran3 = false;
116 scheduler()->ScheduleTask(sequence_id3, GetClosure([&] { ran3 = true; }),
117 std::vector<SyncToken>());
118
119 task_runner()->RunPendingTasks();
120 EXPECT_TRUE(ran3);
121
122 task_runner()->RunPendingTasks();
123 EXPECT_TRUE(ran2);
124
125 task_runner()->RunPendingTasks();
126 EXPECT_TRUE(ran1);
127 }
128
129 TEST_F(SchedulerTest, SequencesOfSamePriorityRunInOrder) {
130 SequenceId sequence_id1 =
131 scheduler()->CreateSequence(SchedulingPriority::kNormal);
132 bool ran1 = false;
133 scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
134 std::vector<SyncToken>());
135
136 SequenceId sequence_id2 =
137 scheduler()->CreateSequence(SchedulingPriority::kNormal);
138 bool ran2 = false;
139 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] { ran2 = true; }),
140 std::vector<SyncToken>());
141
142 SequenceId sequence_id3 =
143 scheduler()->CreateSequence(SchedulingPriority::kNormal);
144 bool ran3 = false;
145 scheduler()->ScheduleTask(sequence_id3, GetClosure([&] { ran3 = true; }),
146 std::vector<SyncToken>());
147
148 SequenceId sequence_id4 =
149 scheduler()->CreateSequence(SchedulingPriority::kNormal);
150 bool ran4 = false;
151 scheduler()->ScheduleTask(sequence_id4, GetClosure([&] { ran4 = true; }),
152 std::vector<SyncToken>());
153
154 task_runner()->RunPendingTasks();
155 EXPECT_TRUE(ran1);
156
157 task_runner()->RunPendingTasks();
158 EXPECT_TRUE(ran2);
159
160 task_runner()->RunPendingTasks();
161 EXPECT_TRUE(ran3);
162
163 task_runner()->RunPendingTasks();
164 EXPECT_TRUE(ran4);
165 }
166
167 TEST_F(SchedulerTest, SequenceWaitsForFence) {
168 SequenceId sequence_id1 =
169 scheduler()->CreateSequence(SchedulingPriority::kHighest);
170 SequenceId sequence_id2 =
171 scheduler()->CreateSequence(SchedulingPriority::kNormal);
172
173 CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
174 CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
175
176 scoped_refptr<SyncPointClientState> release_state =
177 sync_point_manager()->CreateSyncPointClientState(
178 namespace_id, command_buffer_id, sequence_id2);
179
180 uint64_t release = 1;
181 bool ran2 = false;
182 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] {
183 release_state->ReleaseFenceSync(release);
184 ran2 = true;
185 }),
186 std::vector<SyncToken>());
187
188 SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
189 command_buffer_id, release);
190
191 bool ran1 = false;
192 scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
193 {sync_token});
194
195 task_runner()->RunPendingTasks();
196 EXPECT_FALSE(ran1);
197 EXPECT_TRUE(ran2);
198 EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
199
200 task_runner()->RunPendingTasks();
201 EXPECT_TRUE(ran1);
202 }
203
204 TEST_F(SchedulerTest, SequenceDoesNotWaitForInvalidFence) {
205 SequenceId sequence_id1 =
206 scheduler()->CreateSequence(SchedulingPriority::kNormal);
207
208 SequenceId sequence_id2 =
209 scheduler()->CreateSequence(SchedulingPriority::kNormal);
210 CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
211 CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
212 scoped_refptr<SyncPointClientState> release_state =
213 sync_point_manager()->CreateSyncPointClientState(
214 namespace_id, command_buffer_id, sequence_id2);
215
216 uint64_t release = 1;
217 SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
218 command_buffer_id, release);
219
220 bool ran1 = false;
221 scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
222 {sync_token});
223
224 // Release task is scheduled after wait task so release is treated as non-
225 // existent.
226 bool ran2 = false;
227 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] {
228 release_state->ReleaseFenceSync(release);
229 ran2 = true;
230 }),
231 std::vector<SyncToken>());
232
233 task_runner()->RunPendingTasks();
234 EXPECT_TRUE(ran1);
235 EXPECT_FALSE(ran2);
236 EXPECT_FALSE(sync_point_manager()->IsSyncTokenReleased(sync_token));
237
238 task_runner()->RunPendingTasks();
239 EXPECT_TRUE(ran2);
240 EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
241 }
242
243 TEST_F(SchedulerTest, ReleaseSequenceIsPrioritized) {
244 SequenceId sequence_id1 =
245 scheduler()->CreateSequence(SchedulingPriority::kNormal);
246
247 bool ran1 = false;
248 scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
249 std::vector<SyncToken>());
250
251 SequenceId sequence_id2 =
252 scheduler()->CreateSequence(SchedulingPriority::kLowest);
253 CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
254 CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
255 scoped_refptr<SyncPointClientState> release_state =
256 sync_point_manager()->CreateSyncPointClientState(
257 namespace_id, command_buffer_id, sequence_id2);
258
259 uint64_t release = 1;
260 bool ran2 = false;
261 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] {
262 release_state->ReleaseFenceSync(release);
263 ran2 = true;
264 }),
265 std::vector<SyncToken>());
266
267 bool ran3 = false;
268 SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
269 command_buffer_id, release);
270 SequenceId sequence_id3 =
271 scheduler()->CreateSequence(SchedulingPriority::kHighest);
272 scheduler()->ScheduleTask(sequence_id3, GetClosure([&] { ran3 = true; }),
273 {sync_token});
274
275 task_runner()->RunPendingTasks();
276 EXPECT_FALSE(ran1);
277 EXPECT_TRUE(ran2);
278 EXPECT_FALSE(ran3);
279 EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
280
281 task_runner()->RunPendingTasks();
282 EXPECT_FALSE(ran1);
283 EXPECT_TRUE(ran3);
284
285 task_runner()->RunPendingTasks();
286 EXPECT_TRUE(ran1);
287 }
288
289 TEST_F(SchedulerTest, ReleaseSequenceShouldYield) {
290 SequenceId sequence_id1 =
291 scheduler()->CreateSequence(SchedulingPriority::kLowest);
292 CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
293 CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
294 scoped_refptr<SyncPointClientState> release_state =
295 sync_point_manager()->CreateSyncPointClientState(
296 namespace_id, command_buffer_id, sequence_id1);
297
298 uint64_t release = 1;
299 bool ran1 = false;
300 scheduler()->ScheduleTask(
301 sequence_id1, GetClosure([&] {
302 EXPECT_FALSE(scheduler()->ShouldYield(sequence_id1));
303 release_state->ReleaseFenceSync(release);
304 EXPECT_TRUE(scheduler()->ShouldYield(sequence_id1));
305 ran1 = true;
306 }),
307 std::vector<SyncToken>());
308
309 bool ran2 = false;
310 SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
311 command_buffer_id, release);
312 SequenceId sequence_id2 =
313 scheduler()->CreateSequence(SchedulingPriority::kHighest);
314 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] { ran2 = true; }),
315 {sync_token});
316
317 task_runner()->RunPendingTasks();
318 EXPECT_TRUE(ran1);
319 EXPECT_FALSE(ran2);
320 EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
321
322 task_runner()->RunPendingTasks();
323 EXPECT_TRUE(ran2);
324 }
325
326 } // namespace
327 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698