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

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

Issue 2814843002: gpu: GPU service scheduler. (Closed)
Patch Set: rebase 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(GpuStreamPriority::NORMAL);
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(GpuStreamPriority::NORMAL);
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 = scheduler()->CreateSequence(GpuStreamPriority::LOW);
102 bool ran1 = false;
103 scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
104 std::vector<SyncToken>());
105
106 SequenceId sequence_id2 =
107 scheduler()->CreateSequence(GpuStreamPriority::NORMAL);
108 bool ran2 = false;
109 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] { ran2 = true; }),
110 std::vector<SyncToken>());
111
112 SequenceId sequence_id3 =
113 scheduler()->CreateSequence(GpuStreamPriority::HIGH);
114 bool ran3 = false;
115 scheduler()->ScheduleTask(sequence_id3, GetClosure([&] { ran3 = true; }),
116 std::vector<SyncToken>());
117
118 SequenceId sequence_id4 =
119 scheduler()->CreateSequence(GpuStreamPriority::REAL_TIME);
120 bool ran4 = false;
121 scheduler()->ScheduleTask(sequence_id4, GetClosure([&] { ran4 = true; }),
122 std::vector<SyncToken>());
123
124 task_runner()->RunPendingTasks();
125 EXPECT_TRUE(ran4);
126
127 task_runner()->RunPendingTasks();
128 EXPECT_TRUE(ran3);
129
130 task_runner()->RunPendingTasks();
131 EXPECT_TRUE(ran2);
132
133 task_runner()->RunPendingTasks();
134 EXPECT_TRUE(ran1);
135 }
136
137 TEST_F(SchedulerTest, SequencesOfSamePriorityRunInOrder) {
138 SequenceId sequence_id1 =
139 scheduler()->CreateSequence(GpuStreamPriority::NORMAL);
140 bool ran1 = false;
141 scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
142 std::vector<SyncToken>());
143
144 SequenceId sequence_id2 =
145 scheduler()->CreateSequence(GpuStreamPriority::NORMAL);
146 bool ran2 = false;
147 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] { ran2 = true; }),
148 std::vector<SyncToken>());
149
150 SequenceId sequence_id3 =
151 scheduler()->CreateSequence(GpuStreamPriority::NORMAL);
152 bool ran3 = false;
153 scheduler()->ScheduleTask(sequence_id3, GetClosure([&] { ran3 = true; }),
154 std::vector<SyncToken>());
155
156 SequenceId sequence_id4 =
157 scheduler()->CreateSequence(GpuStreamPriority::NORMAL);
158 bool ran4 = false;
159 scheduler()->ScheduleTask(sequence_id4, GetClosure([&] { ran4 = true; }),
160 std::vector<SyncToken>());
161
162 task_runner()->RunPendingTasks();
163 EXPECT_TRUE(ran1);
164
165 task_runner()->RunPendingTasks();
166 EXPECT_TRUE(ran2);
167
168 task_runner()->RunPendingTasks();
169 EXPECT_TRUE(ran3);
170
171 task_runner()->RunPendingTasks();
172 EXPECT_TRUE(ran4);
173 }
174
175 TEST_F(SchedulerTest, SequenceWaitsForFence) {
176 SequenceId sequence_id1 =
177 scheduler()->CreateSequence(GpuStreamPriority::REAL_TIME);
178 SequenceId sequence_id2 =
179 scheduler()->CreateSequence(GpuStreamPriority::NORMAL);
180
181 CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
182 CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
183
184 scoped_refptr<SyncPointClientState> release_state =
185 sync_point_manager()->CreateSyncPointClientState(
186 namespace_id, command_buffer_id, sequence_id2);
187
188 uint64_t release = 1;
189 bool ran2 = false;
190 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] {
191 release_state->ReleaseFenceSync(release);
192 ran2 = true;
193 }),
194 std::vector<SyncToken>());
195
196 SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
197 command_buffer_id, release);
198
199 bool ran1 = false;
200 scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
201 {sync_token});
202
203 task_runner()->RunPendingTasks();
204 EXPECT_FALSE(ran1);
205 EXPECT_TRUE(ran2);
206 EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
207
208 task_runner()->RunPendingTasks();
209 EXPECT_TRUE(ran1);
210 }
211
212 TEST_F(SchedulerTest, SequenceDoesNotWaitForInvalidFence) {
213 SequenceId sequence_id1 =
214 scheduler()->CreateSequence(GpuStreamPriority::NORMAL);
215
216 SequenceId sequence_id2 =
217 scheduler()->CreateSequence(GpuStreamPriority::NORMAL);
218 CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
219 CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
220 scoped_refptr<SyncPointClientState> release_state =
221 sync_point_manager()->CreateSyncPointClientState(
222 namespace_id, command_buffer_id, sequence_id2);
223
224 uint64_t release = 1;
225 SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
226 command_buffer_id, release);
227
228 bool ran1 = false;
229 scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
230 {sync_token});
231
232 // Release task is scheduled after wait task so release is treated as non-
233 // existent.
234 bool ran2 = false;
235 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] {
236 release_state->ReleaseFenceSync(release);
237 ran2 = true;
238 }),
239 std::vector<SyncToken>());
240
241 task_runner()->RunPendingTasks();
242 EXPECT_TRUE(ran1);
243 EXPECT_FALSE(ran2);
244 EXPECT_FALSE(sync_point_manager()->IsSyncTokenReleased(sync_token));
245
246 task_runner()->RunPendingTasks();
247 EXPECT_TRUE(ran2);
248 EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
249 }
250
251 TEST_F(SchedulerTest, ReleaseSequenceIsPrioritized) {
252 SequenceId sequence_id1 =
253 scheduler()->CreateSequence(GpuStreamPriority::NORMAL);
254
255 bool ran1 = false;
256 scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
257 std::vector<SyncToken>());
258
259 SequenceId sequence_id2 = scheduler()->CreateSequence(GpuStreamPriority::LOW);
260 CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
261 CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
262 scoped_refptr<SyncPointClientState> release_state =
263 sync_point_manager()->CreateSyncPointClientState(
264 namespace_id, command_buffer_id, sequence_id2);
265
266 uint64_t release = 1;
267 bool ran2 = false;
268 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] {
269 release_state->ReleaseFenceSync(release);
270 ran2 = true;
271 }),
272 std::vector<SyncToken>());
273
274 bool ran3 = false;
275 SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
276 command_buffer_id, release);
277 SequenceId sequence_id3 =
278 scheduler()->CreateSequence(GpuStreamPriority::REAL_TIME);
279 scheduler()->ScheduleTask(sequence_id3, GetClosure([&] { ran3 = true; }),
280 {sync_token});
281
282 task_runner()->RunPendingTasks();
283 EXPECT_FALSE(ran1);
284 EXPECT_TRUE(ran2);
285 EXPECT_FALSE(ran3);
286 EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
287
288 task_runner()->RunPendingTasks();
289 EXPECT_FALSE(ran1);
290 EXPECT_TRUE(ran3);
291
292 task_runner()->RunPendingTasks();
293 EXPECT_TRUE(ran1);
294 }
295
296 TEST_F(SchedulerTest, ReleaseSequenceShouldYield) {
297 SequenceId sequence_id1 = scheduler()->CreateSequence(GpuStreamPriority::LOW);
298 CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
299 CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
300 scoped_refptr<SyncPointClientState> release_state =
301 sync_point_manager()->CreateSyncPointClientState(
302 namespace_id, command_buffer_id, sequence_id1);
303
304 uint64_t release = 1;
305 bool ran1 = false;
306 scheduler()->ScheduleTask(
307 sequence_id1, GetClosure([&] {
308 EXPECT_FALSE(scheduler()->ShouldYield(sequence_id1));
309 release_state->ReleaseFenceSync(release);
310 EXPECT_TRUE(scheduler()->ShouldYield(sequence_id1));
311 ran1 = true;
312 }),
313 std::vector<SyncToken>());
314
315 bool ran2 = false;
316 SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
317 command_buffer_id, release);
318 SequenceId sequence_id2 =
319 scheduler()->CreateSequence(GpuStreamPriority::REAL_TIME);
320 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] { ran2 = true; }),
321 {sync_token});
322
323 task_runner()->RunPendingTasks();
324 EXPECT_TRUE(ran1);
325 EXPECT_FALSE(ran2);
326 EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
327
328 task_runner()->RunPendingTasks();
329 EXPECT_TRUE(ran2);
330 }
331
332 } // namespace
333 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698