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

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

Issue 1331843005: Implemented new fence syncs which replaces the old sync points. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed memory leak Created 5 years, 2 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) 2015 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 "base/bind.h"
6 #include "gpu/command_buffer/service/sync_point_manager.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 namespace gpu {
10
11 class SyncPointManagerTest : public testing::Test {
12 public:
13 SyncPointManagerTest() {
14 }
15
16 ~SyncPointManagerTest() override {}
17
18 protected:
19 void SetUp() override {
20 sync_point_manager_.reset(new SyncPointManager(false));
21 }
22
23 void TearDown() override {
24 sync_point_manager_.reset();
25 }
26
27 // Simple static function which can be used to test callbacks.
28 static void SetIntegerFunction(int* test, int value) {
29 *test = value;
30 }
31
32 scoped_ptr<SyncPointManager> sync_point_manager_;
33 };
34
35 struct SyncPointStream {
36 scoped_refptr<SyncPointOrderData> order_data;
37 scoped_ptr<SyncPointClient> client;
38 uint32_t current_order_num;
39
40 SyncPointStream(SyncPointManager* sync_point_manager,
41 CommandBufferNamespace namespace_id,
42 uint64_t command_buffer_id)
43 : order_data(SyncPointOrderData::Create()),
44 client(sync_point_manager->CreateSyncPointClient(order_data,
45 namespace_id,
46 command_buffer_id)),
47 current_order_num(0) {
48 }
49
50 ~SyncPointStream() {
51 order_data->Destroy();
52 order_data = nullptr;
53 }
54
55 void AllocateOrderNum(SyncPointManager* sync_point_manager) {
56 ASSERT_EQ(0u, current_order_num);
57 current_order_num =
58 order_data->GenerateUnprocessedOrderNumber(sync_point_manager);
59 }
60
61 void BeginProcessing() {
62 ASSERT_NE(0u, current_order_num);
63 order_data->BeginProcessingOrderNumber(current_order_num);
64 }
65
66 void EndProcessing() {
67 ASSERT_NE(0u, current_order_num);
68 order_data->FinishProcessingOrderNumber(current_order_num);
69 current_order_num = 0;
70 }
71 };
72
73 TEST_F(SyncPointManagerTest, BasicSyncPointOrderDataTest) {
74 scoped_refptr<SyncPointOrderData> order_data = SyncPointOrderData::Create();
75
76 EXPECT_EQ(0u, order_data->current_order_num());
77 EXPECT_EQ(0u, order_data->processed_order_num());
78 EXPECT_EQ(0u, order_data->unprocessed_order_num());
79
80 const uint32_t order_num =
81 order_data->GenerateUnprocessedOrderNumber(sync_point_manager_.get());
82 EXPECT_EQ(1u, order_num);
83
84 EXPECT_EQ(0u, order_data->current_order_num());
85 EXPECT_EQ(0u, order_data->processed_order_num());
86 EXPECT_EQ(order_num, order_data->unprocessed_order_num());
87
88 order_data->BeginProcessingOrderNumber(order_num);
89 EXPECT_EQ(order_num, order_data->current_order_num());
90 EXPECT_EQ(0u, order_data->processed_order_num());
91 EXPECT_EQ(order_num, order_data->unprocessed_order_num());
92
93 order_data->FinishProcessingOrderNumber(order_num);
94 EXPECT_EQ(order_num, order_data->current_order_num());
95 EXPECT_EQ(order_num, order_data->processed_order_num());
96 EXPECT_EQ(order_num, order_data->unprocessed_order_num());
97 }
98
99 TEST_F(SyncPointManagerTest, SyncPointClientRegistration) {
100 const CommandBufferNamespace kNamespaceId =
101 gpu::CommandBufferNamespace::GPU_IO;
102 const uint64_t kBufferId = 0x123;
103
104 scoped_refptr<SyncPointClientState> empty_state =
105 sync_point_manager_->GetSyncPointClientState(kNamespaceId, kBufferId);
106 EXPECT_FALSE(empty_state);
107
108 scoped_refptr<SyncPointOrderData> order_data = SyncPointOrderData::Create();
109
110 scoped_ptr<SyncPointClient> client =
111 sync_point_manager_->CreateSyncPointClient(order_data,
112 kNamespaceId,
113 kBufferId);
114
115 EXPECT_EQ(order_data, client->client_state()->order_data());
116 EXPECT_EQ(client->client_state(),
117 sync_point_manager_->GetSyncPointClientState(kNamespaceId,
118 kBufferId));
119 }
120
121 TEST_F(SyncPointManagerTest, BasicFenceSyncRelease) {
122 const CommandBufferNamespace kNamespaceId =
123 gpu::CommandBufferNamespace::GPU_IO;
124 const uint64_t kBufferId = 0x123;
125
126 scoped_refptr<SyncPointOrderData> order_data = SyncPointOrderData::Create();
127 scoped_ptr<SyncPointClient> client =
128 sync_point_manager_->CreateSyncPointClient(order_data,
129 kNamespaceId,
130 kBufferId);
131 scoped_refptr<SyncPointClientState> client_state = client->client_state();
132
133 EXPECT_EQ(0u, client_state->fence_sync_release());
134 EXPECT_FALSE(client_state->IsFenceSyncReleased(1));
135
136 client->ReleaseFenceSync(1);
137
138 EXPECT_EQ(1u, client_state->fence_sync_release());
139 EXPECT_TRUE(client_state->IsFenceSyncReleased(1));
140 }
141
142 TEST_F(SyncPointManagerTest, BasicFenceSyncWaitRelease) {
143 const CommandBufferNamespace kNamespaceId =
144 gpu::CommandBufferNamespace::GPU_IO;
145 const uint64_t kBufferId1 = 0x123;
146 const uint64_t kBufferId2 = 0x234;
147
148 SyncPointStream release_stream(sync_point_manager_.get(),
149 kNamespaceId,
150 kBufferId1);
151 SyncPointStream wait_stream(sync_point_manager_.get(),
152 kNamespaceId,
153 kBufferId2);
154
155 release_stream.AllocateOrderNum(sync_point_manager_.get());
156 wait_stream.AllocateOrderNum(sync_point_manager_.get());
157
158 wait_stream.BeginProcessing();
159 int test_num = 10;
160 const bool valid_wait =
161 wait_stream.client->Wait(
162 release_stream.client->client_state(),
163 1,
164 base::Bind(&SyncPointManagerTest::SetIntegerFunction,
165 &test_num,
166 123));
167 ASSERT_TRUE(valid_wait);
168 EXPECT_EQ(10, test_num);
169
170 release_stream.BeginProcessing();
171 release_stream.client->ReleaseFenceSync(1);
172 EXPECT_EQ(123, test_num);
173 }
174
175 TEST_F(SyncPointManagerTest, OutOfOrderRelease) {
176 const CommandBufferNamespace kNamespaceId =
177 gpu::CommandBufferNamespace::GPU_IO;
178 const uint64_t kBufferId1 = 0x123;
179 const uint64_t kBufferId2 = 0x234;
180
181 SyncPointStream release_stream(sync_point_manager_.get(),
182 kNamespaceId,
183 kBufferId1);
184 SyncPointStream wait_stream(sync_point_manager_.get(),
185 kNamespaceId,
186 kBufferId2);
187
188 // Generate wait order number first.
189 wait_stream.AllocateOrderNum(sync_point_manager_.get());
190 release_stream.AllocateOrderNum(sync_point_manager_.get());
191
192 wait_stream.BeginProcessing();
193 int test_num = 10;
194 const bool valid_wait =
195 wait_stream.client->Wait(
196 release_stream.client->client_state(),
197 1,
198 base::Bind(&SyncPointManagerTest::SetIntegerFunction,
199 &test_num,
200 123));
201 EXPECT_FALSE(valid_wait);
202 EXPECT_EQ(10, test_num);
203 }
204
205 TEST_F(SyncPointManagerTest, HigherOrderNumberRelease) {
206 const CommandBufferNamespace kNamespaceId =
207 gpu::CommandBufferNamespace::GPU_IO;
208 const uint64_t kBufferId1 = 0x123;
209 const uint64_t kBufferId2 = 0x234;
210
211 SyncPointStream release_stream(sync_point_manager_.get(),
212 kNamespaceId,
213 kBufferId1);
214 SyncPointStream wait_stream(sync_point_manager_.get(),
215 kNamespaceId,
216 kBufferId2);
217
218 // Generate wait order number first.
219 wait_stream.AllocateOrderNum(sync_point_manager_.get());
220 release_stream.AllocateOrderNum(sync_point_manager_.get());
221
222 // Order number was higher but it was actually released.
223 release_stream.BeginProcessing();
224 release_stream.client->ReleaseFenceSync(1);
225 release_stream.EndProcessing();
226
227 wait_stream.BeginProcessing();
228 int test_num = 10;
229 const bool valid_wait =
230 wait_stream.client->Wait(
231 release_stream.client->client_state(),
232 1,
233 base::Bind(&SyncPointManagerTest::SetIntegerFunction,
234 &test_num,
235 123));
236 EXPECT_TRUE(valid_wait);
237 EXPECT_EQ(123, test_num);
238 }
239
240 TEST_F(SyncPointManagerTest, DestroyedClientRelease) {
241 const CommandBufferNamespace kNamespaceId =
242 gpu::CommandBufferNamespace::GPU_IO;
243 const uint64_t kBufferId1 = 0x123;
244 const uint64_t kBufferId2 = 0x234;
245
246 SyncPointStream release_stream(sync_point_manager_.get(),
247 kNamespaceId,
248 kBufferId1);
249 SyncPointStream wait_stream(sync_point_manager_.get(),
250 kNamespaceId,
251 kBufferId2);
252
253 release_stream.AllocateOrderNum(sync_point_manager_.get());
254 wait_stream.AllocateOrderNum(sync_point_manager_.get());
255
256 wait_stream.BeginProcessing();
257 int test_num = 10;
258 const bool valid_wait =
259 wait_stream.client->Wait(
260 release_stream.client->client_state(),
261 1,
262 base::Bind(&SyncPointManagerTest::SetIntegerFunction,
263 &test_num,
264 123));
265 EXPECT_TRUE(valid_wait);
266 EXPECT_EQ(10, test_num);
267
268 // Destroying the client should release the wait.
269 release_stream.client.reset();
270 EXPECT_EQ(123, test_num);
271 }
272
273 TEST_F(SyncPointManagerTest, NonExistentRelease) {
274 const CommandBufferNamespace kNamespaceId =
275 gpu::CommandBufferNamespace::GPU_IO;
276 const uint64_t kBufferId1 = 0x123;
277 const uint64_t kBufferId2 = 0x234;
278
279 SyncPointStream release_stream(sync_point_manager_.get(),
280 kNamespaceId,
281 kBufferId1);
282 SyncPointStream wait_stream(sync_point_manager_.get(),
283 kNamespaceId,
284 kBufferId2);
285
286 release_stream.AllocateOrderNum(sync_point_manager_.get());
287 wait_stream.AllocateOrderNum(sync_point_manager_.get());
288
289 wait_stream.BeginProcessing();
290 int test_num = 10;
291 const bool valid_wait =
292 wait_stream.client->Wait(
293 release_stream.client->client_state(),
294 1,
295 base::Bind(&SyncPointManagerTest::SetIntegerFunction,
296 &test_num,
297 123));
298 EXPECT_TRUE(valid_wait);
299 EXPECT_EQ(10, test_num);
300
301 // No release but finishing the order number should automatically release.
302 release_stream.BeginProcessing();
303 EXPECT_EQ(10, test_num);
304 release_stream.EndProcessing();
305 EXPECT_EQ(123, test_num);
306 }
307
308 } // namespace gpu
309
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698