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

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

Issue 2881813002: Revert of gpu: GPU service scheduler. (Closed)
Patch Set: 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
« no previous file with comments | « gpu/command_buffer/service/scheduler.cc ('k') | gpu/ipc/client/command_buffer_proxy_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 release_state->Destroy();
204 }
205
206 TEST_F(SchedulerTest, SequenceDoesNotWaitForInvalidFence) {
207 SequenceId sequence_id1 =
208 scheduler()->CreateSequence(SchedulingPriority::kNormal);
209
210 SequenceId sequence_id2 =
211 scheduler()->CreateSequence(SchedulingPriority::kNormal);
212 CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
213 CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
214 scoped_refptr<SyncPointClientState> release_state =
215 sync_point_manager()->CreateSyncPointClientState(
216 namespace_id, command_buffer_id, sequence_id2);
217
218 uint64_t release = 1;
219 SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
220 command_buffer_id, release);
221
222 bool ran1 = false;
223 scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
224 {sync_token});
225
226 // Release task is scheduled after wait task so release is treated as non-
227 // existent.
228 bool ran2 = false;
229 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] {
230 release_state->ReleaseFenceSync(release);
231 ran2 = true;
232 }),
233 std::vector<SyncToken>());
234
235 task_runner()->RunPendingTasks();
236 EXPECT_TRUE(ran1);
237 EXPECT_FALSE(ran2);
238 EXPECT_FALSE(sync_point_manager()->IsSyncTokenReleased(sync_token));
239
240 task_runner()->RunPendingTasks();
241 EXPECT_TRUE(ran2);
242 EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
243
244 release_state->Destroy();
245 }
246
247 TEST_F(SchedulerTest, ReleaseSequenceIsPrioritized) {
248 SequenceId sequence_id1 =
249 scheduler()->CreateSequence(SchedulingPriority::kNormal);
250
251 bool ran1 = false;
252 scheduler()->ScheduleTask(sequence_id1, GetClosure([&] { ran1 = true; }),
253 std::vector<SyncToken>());
254
255 SequenceId sequence_id2 =
256 scheduler()->CreateSequence(SchedulingPriority::kLowest);
257 CommandBufferNamespace namespace_id = CommandBufferNamespace::GPU_IO;
258 CommandBufferId command_buffer_id = CommandBufferId::FromUnsafeValue(1);
259 scoped_refptr<SyncPointClientState> release_state =
260 sync_point_manager()->CreateSyncPointClientState(
261 namespace_id, command_buffer_id, sequence_id2);
262
263 uint64_t release = 1;
264 bool ran2 = false;
265 scheduler()->ScheduleTask(sequence_id2, GetClosure([&] {
266 release_state->ReleaseFenceSync(release);
267 ran2 = true;
268 }),
269 std::vector<SyncToken>());
270
271 bool ran3 = false;
272 SyncToken sync_token(namespace_id, 0 /* extra_data_field */,
273 command_buffer_id, release);
274 SequenceId sequence_id3 =
275 scheduler()->CreateSequence(SchedulingPriority::kHighest);
276 scheduler()->ScheduleTask(sequence_id3, GetClosure([&] { ran3 = true; }),
277 {sync_token});
278
279 task_runner()->RunPendingTasks();
280 EXPECT_FALSE(ran1);
281 EXPECT_TRUE(ran2);
282 EXPECT_FALSE(ran3);
283 EXPECT_TRUE(sync_point_manager()->IsSyncTokenReleased(sync_token));
284
285 task_runner()->RunPendingTasks();
286 EXPECT_FALSE(ran1);
287 EXPECT_TRUE(ran3);
288
289 task_runner()->RunPendingTasks();
290 EXPECT_TRUE(ran1);
291
292 release_state->Destroy();
293 }
294
295 TEST_F(SchedulerTest, ReleaseSequenceShouldYield) {
296 SequenceId sequence_id1 =
297 scheduler()->CreateSequence(SchedulingPriority::kLowest);
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(SchedulingPriority::kHighest);
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 release_state->Destroy();
332 }
333
334 } // namespace
335 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/scheduler.cc ('k') | gpu/ipc/client/command_buffer_proxy_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698