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

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

Issue 2752393002: gpu: Add SequenceId for identifying sync point sequences. (Closed)
Patch Set: piman's review 3 Created 3 years, 9 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
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdint.h> 5 #include <stdint.h>
6 6
7 #include <memory> 7 #include <memory>
8 #include <queue> 8 #include <queue>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 10 matching lines...) Expand all
21 21
22 protected: 22 protected:
23 // Simple static function which can be used to test callbacks. 23 // Simple static function which can be used to test callbacks.
24 static void SetIntegerFunction(int* test, int value) { *test = value; } 24 static void SetIntegerFunction(int* test, int value) { *test = value; }
25 25
26 std::unique_ptr<SyncPointManager> sync_point_manager_; 26 std::unique_ptr<SyncPointManager> sync_point_manager_;
27 }; 27 };
28 28
29 struct SyncPointStream { 29 struct SyncPointStream {
30 scoped_refptr<SyncPointOrderData> order_data; 30 scoped_refptr<SyncPointOrderData> order_data;
31 std::unique_ptr<SyncPointClient> client; 31 scoped_refptr<SyncPointClientState> client_state;
32 std::queue<uint32_t> order_numbers; 32 std::queue<uint32_t> order_numbers;
33 33
34 SyncPointStream(SyncPointManager* sync_point_manager, 34 SyncPointStream(SyncPointManager* sync_point_manager,
35 CommandBufferNamespace namespace_id, 35 CommandBufferNamespace namespace_id,
36 CommandBufferId command_buffer_id) 36 CommandBufferId command_buffer_id)
37 : order_data(SyncPointOrderData::Create()), 37 : order_data(sync_point_manager->CreateSyncPointOrderData()),
38 client(base::MakeUnique<SyncPointClient>(sync_point_manager, 38 client_state(sync_point_manager->CreateSyncPointClientState(
39 order_data, 39 namespace_id,
40 namespace_id, 40 command_buffer_id,
41 command_buffer_id)) {} 41 order_data->sequence_id())) {}
42 42
43 ~SyncPointStream() { 43 ~SyncPointStream() {
44 order_data->Destroy(); 44 if (order_data)
45 order_data = nullptr; 45 order_data->Destroy();
46 if (client_state)
47 client_state->Destroy();
46 } 48 }
47 49
48 void AllocateOrderNum(SyncPointManager* sync_point_manager) { 50 void AllocateOrderNum() {
49 order_numbers.push( 51 order_numbers.push(order_data->GenerateUnprocessedOrderNumber());
50 order_data->GenerateUnprocessedOrderNumber(sync_point_manager));
51 } 52 }
52 53
53 void BeginProcessing() { 54 void BeginProcessing() {
54 ASSERT_FALSE(order_numbers.empty()); 55 ASSERT_FALSE(order_numbers.empty());
55 order_data->BeginProcessingOrderNumber(order_numbers.front()); 56 order_data->BeginProcessingOrderNumber(order_numbers.front());
56 } 57 }
57 58
58 void EndProcessing() { 59 void EndProcessing() {
59 ASSERT_FALSE(order_numbers.empty()); 60 ASSERT_FALSE(order_numbers.empty());
60 order_data->FinishProcessingOrderNumber(order_numbers.front()); 61 order_data->FinishProcessingOrderNumber(order_numbers.front());
61 order_numbers.pop(); 62 order_numbers.pop();
62 } 63 }
63 }; 64 };
64 65
65 TEST_F(SyncPointManagerTest, BasicSyncPointOrderDataTest) { 66 TEST_F(SyncPointManagerTest, BasicSyncPointOrderDataTest) {
66 scoped_refptr<SyncPointOrderData> order_data = SyncPointOrderData::Create(); 67 scoped_refptr<SyncPointOrderData> order_data =
68 sync_point_manager_->CreateSyncPointOrderData();
67 69
68 EXPECT_EQ(0u, order_data->current_order_num()); 70 EXPECT_EQ(0u, order_data->current_order_num());
69 EXPECT_EQ(0u, order_data->processed_order_num()); 71 EXPECT_EQ(0u, order_data->processed_order_num());
70 EXPECT_EQ(0u, order_data->unprocessed_order_num()); 72 EXPECT_EQ(0u, order_data->unprocessed_order_num());
71 73
72 uint32_t order_num = 74 uint32_t order_num = order_data->GenerateUnprocessedOrderNumber();
73 order_data->GenerateUnprocessedOrderNumber(sync_point_manager_.get());
74 EXPECT_EQ(1u, order_num); 75 EXPECT_EQ(1u, order_num);
75 76
76 EXPECT_EQ(0u, order_data->current_order_num()); 77 EXPECT_EQ(0u, order_data->current_order_num());
77 EXPECT_EQ(0u, order_data->processed_order_num()); 78 EXPECT_EQ(0u, order_data->processed_order_num());
78 EXPECT_EQ(order_num, order_data->unprocessed_order_num()); 79 EXPECT_EQ(order_num, order_data->unprocessed_order_num());
79 80
80 order_data->BeginProcessingOrderNumber(order_num); 81 order_data->BeginProcessingOrderNumber(order_num);
81 EXPECT_EQ(order_num, order_data->current_order_num()); 82 EXPECT_EQ(order_num, order_data->current_order_num());
82 EXPECT_EQ(0u, order_data->processed_order_num()); 83 EXPECT_EQ(0u, order_data->processed_order_num());
83 EXPECT_EQ(order_num, order_data->unprocessed_order_num()); 84 EXPECT_EQ(order_num, order_data->unprocessed_order_num());
84 EXPECT_TRUE(order_data->IsProcessingOrderNumber()); 85 EXPECT_TRUE(order_data->IsProcessingOrderNumber());
85 86
86 order_data->PauseProcessingOrderNumber(order_num); 87 order_data->PauseProcessingOrderNumber(order_num);
87 EXPECT_FALSE(order_data->IsProcessingOrderNumber()); 88 EXPECT_FALSE(order_data->IsProcessingOrderNumber());
88 89
89 order_data->BeginProcessingOrderNumber(order_num); 90 order_data->BeginProcessingOrderNumber(order_num);
90 EXPECT_TRUE(order_data->IsProcessingOrderNumber()); 91 EXPECT_TRUE(order_data->IsProcessingOrderNumber());
91 92
92 order_data->FinishProcessingOrderNumber(order_num); 93 order_data->FinishProcessingOrderNumber(order_num);
93 EXPECT_EQ(order_num, order_data->current_order_num()); 94 EXPECT_EQ(order_num, order_data->current_order_num());
94 EXPECT_EQ(order_num, order_data->processed_order_num()); 95 EXPECT_EQ(order_num, order_data->processed_order_num());
95 EXPECT_EQ(order_num, order_data->unprocessed_order_num()); 96 EXPECT_EQ(order_num, order_data->unprocessed_order_num());
96 EXPECT_FALSE(order_data->IsProcessingOrderNumber()); 97 EXPECT_FALSE(order_data->IsProcessingOrderNumber());
98
99 order_data->Destroy();
97 } 100 }
98 101
99 TEST_F(SyncPointManagerTest, BasicFenceSyncRelease) { 102 TEST_F(SyncPointManagerTest, BasicFenceSyncRelease) {
100 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO; 103 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO;
101 CommandBufferId kBufferId = CommandBufferId::FromUnsafeValue(0x123); 104 CommandBufferId kBufferId = CommandBufferId::FromUnsafeValue(0x123);
102 105
103 uint64_t release_count = 1; 106 uint64_t release_count = 1;
104 SyncToken sync_token(kNamespaceId, 0, kBufferId, release_count); 107 SyncToken sync_token(kNamespaceId, 0, kBufferId, release_count);
105 108
106 // Can't wait for sync token before client is registered. 109 // Can't wait for sync token before client is registered.
107 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 110 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token));
108 111
109 SyncPointStream stream(sync_point_manager_.get(), kNamespaceId, kBufferId); 112 SyncPointStream stream(sync_point_manager_.get(), kNamespaceId, kBufferId);
110 113
111 stream.AllocateOrderNum(sync_point_manager_.get()); 114 stream.AllocateOrderNum();
112 115
113 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 116 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token));
114 117
115 stream.order_data->BeginProcessingOrderNumber(1); 118 stream.order_data->BeginProcessingOrderNumber(1);
116 stream.client->ReleaseFenceSync(release_count); 119 stream.client_state->ReleaseFenceSync(release_count);
117 stream.order_data->FinishProcessingOrderNumber(1); 120 stream.order_data->FinishProcessingOrderNumber(1);
118 121
119 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 122 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token));
120 } 123 }
121 124
122 TEST_F(SyncPointManagerTest, MultipleClientsPerOrderData) { 125 TEST_F(SyncPointManagerTest, MultipleClientsPerOrderData) {
123 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO; 126 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO;
124 CommandBufferId kCmdBufferId1 = CommandBufferId::FromUnsafeValue(0x123); 127 CommandBufferId kCmdBufferId1 = CommandBufferId::FromUnsafeValue(0x123);
125 CommandBufferId kCmdBufferId2 = CommandBufferId::FromUnsafeValue(0x234); 128 CommandBufferId kCmdBufferId2 = CommandBufferId::FromUnsafeValue(0x234);
126 129
127 SyncPointStream stream1(sync_point_manager_.get(), kNamespaceId, 130 SyncPointStream stream1(sync_point_manager_.get(), kNamespaceId,
128 kCmdBufferId1); 131 kCmdBufferId1);
129 SyncPointStream stream2(sync_point_manager_.get(), kNamespaceId, 132 SyncPointStream stream2(sync_point_manager_.get(), kNamespaceId,
130 kCmdBufferId2); 133 kCmdBufferId2);
131 134
132 uint64_t release_count = 1; 135 uint64_t release_count = 1;
133 SyncToken sync_token1(kNamespaceId, 0, kCmdBufferId1, release_count); 136 SyncToken sync_token1(kNamespaceId, 0, kCmdBufferId1, release_count);
134 stream1.AllocateOrderNum(sync_point_manager_.get()); 137 stream1.AllocateOrderNum();
135 138
136 SyncToken sync_token2(kNamespaceId, 0, kCmdBufferId2, release_count); 139 SyncToken sync_token2(kNamespaceId, 0, kCmdBufferId2, release_count);
137 stream2.AllocateOrderNum(sync_point_manager_.get()); 140 stream2.AllocateOrderNum();
138 141
139 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token1)); 142 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token1));
140 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token2)); 143 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token2));
141 144
142 stream1.order_data->BeginProcessingOrderNumber(1); 145 stream1.order_data->BeginProcessingOrderNumber(1);
143 stream1.client->ReleaseFenceSync(release_count); 146 stream1.client_state->ReleaseFenceSync(release_count);
144 stream1.order_data->FinishProcessingOrderNumber(1); 147 stream1.order_data->FinishProcessingOrderNumber(1);
145 148
146 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token1)); 149 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token1));
147 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token2)); 150 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token2));
148 } 151 }
149 152
150 TEST_F(SyncPointManagerTest, BasicFenceSyncWaitRelease) { 153 TEST_F(SyncPointManagerTest, BasicFenceSyncWaitRelease) {
151 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO; 154 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO;
152 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123); 155 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123);
153 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234); 156 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234);
154 157
155 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId, 158 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId,
156 kReleaseCmdBufferId); 159 kReleaseCmdBufferId);
157 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId, 160 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId,
158 kWaitCmdBufferId); 161 kWaitCmdBufferId);
159 162
160 release_stream.AllocateOrderNum(sync_point_manager_.get()); 163 release_stream.AllocateOrderNum();
161 wait_stream.AllocateOrderNum(sync_point_manager_.get()); 164 wait_stream.AllocateOrderNum();
162 165
163 uint64_t release_count = 1; 166 uint64_t release_count = 1;
164 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count); 167 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count);
165 168
166 wait_stream.BeginProcessing(); 169 wait_stream.BeginProcessing();
167 int test_num = 10; 170 int test_num = 10;
168 bool valid_wait = wait_stream.client->Wait( 171 bool valid_wait = wait_stream.client_state->Wait(
169 sync_token, 172 sync_token,
170 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123)); 173 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123));
171 EXPECT_TRUE(valid_wait); 174 EXPECT_TRUE(valid_wait);
172 EXPECT_EQ(10, test_num); 175 EXPECT_EQ(10, test_num);
173 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 176 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token));
174 177
175 release_stream.BeginProcessing(); 178 release_stream.BeginProcessing();
176 release_stream.client->ReleaseFenceSync(release_count); 179 release_stream.client_state->ReleaseFenceSync(release_count);
177 EXPECT_EQ(123, test_num); 180 EXPECT_EQ(123, test_num);
178 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 181 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token));
179 } 182 }
180 183
181 TEST_F(SyncPointManagerTest, WaitOnSelfFails) { 184 TEST_F(SyncPointManagerTest, WaitOnSelfFails) {
182 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO; 185 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO;
183 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123); 186 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123);
184 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234); 187 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234);
185 188
186 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId, 189 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId,
187 kReleaseCmdBufferId); 190 kReleaseCmdBufferId);
188 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId, 191 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId,
189 kWaitCmdBufferId); 192 kWaitCmdBufferId);
190 193
191 release_stream.AllocateOrderNum(sync_point_manager_.get()); 194 release_stream.AllocateOrderNum();
192 wait_stream.AllocateOrderNum(sync_point_manager_.get()); 195 wait_stream.AllocateOrderNum();
193 196
194 uint64_t release_count = 1; 197 uint64_t release_count = 1;
195 SyncToken sync_token(kNamespaceId, 0, kWaitCmdBufferId, release_count); 198 SyncToken sync_token(kNamespaceId, 0, kWaitCmdBufferId, release_count);
196 199
197 wait_stream.BeginProcessing(); 200 wait_stream.BeginProcessing();
198 int test_num = 10; 201 int test_num = 10;
199 bool valid_wait = wait_stream.client->Wait( 202 bool valid_wait = wait_stream.client_state->Wait(
200 sync_token, 203 sync_token,
201 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123)); 204 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123));
202 EXPECT_FALSE(valid_wait); 205 EXPECT_FALSE(valid_wait);
203 EXPECT_EQ(10, test_num); 206 EXPECT_EQ(10, test_num);
204 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 207 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token));
205 } 208 }
206 209
207 TEST_F(SyncPointManagerTest, OutOfOrderRelease) { 210 TEST_F(SyncPointManagerTest, OutOfOrderRelease) {
208 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO; 211 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO;
209 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123); 212 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123);
210 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234); 213 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234);
211 214
212 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId, 215 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId,
213 kReleaseCmdBufferId); 216 kReleaseCmdBufferId);
214 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId, 217 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId,
215 kWaitCmdBufferId); 218 kWaitCmdBufferId);
216 219
217 // Generate wait order number first. 220 // Generate wait order number first.
218 wait_stream.AllocateOrderNum(sync_point_manager_.get()); 221 wait_stream.AllocateOrderNum();
219 release_stream.AllocateOrderNum(sync_point_manager_.get()); 222 release_stream.AllocateOrderNum();
220 223
221 uint64_t release_count = 1; 224 uint64_t release_count = 1;
222 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count); 225 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count);
223 226
224 wait_stream.BeginProcessing(); 227 wait_stream.BeginProcessing();
225 int test_num = 10; 228 int test_num = 10;
226 bool valid_wait = wait_stream.client->Wait( 229 bool valid_wait = wait_stream.client_state->Wait(
227 sync_token, 230 sync_token,
228 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123)); 231 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123));
229 EXPECT_FALSE(valid_wait); 232 EXPECT_FALSE(valid_wait);
230 EXPECT_EQ(10, test_num); 233 EXPECT_EQ(10, test_num);
231 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 234 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token));
232 } 235 }
233 236
234 TEST_F(SyncPointManagerTest, HigherOrderNumberRelease) { 237 TEST_F(SyncPointManagerTest, HigherOrderNumberRelease) {
235 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO; 238 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO;
236 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123); 239 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123);
237 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234); 240 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234);
238 241
239 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId, 242 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId,
240 kReleaseCmdBufferId); 243 kReleaseCmdBufferId);
241 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId, 244 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId,
242 kWaitCmdBufferId); 245 kWaitCmdBufferId);
243 246
244 // Generate wait order number first. 247 // Generate wait order number first.
245 wait_stream.AllocateOrderNum(sync_point_manager_.get()); 248 wait_stream.AllocateOrderNum();
246 release_stream.AllocateOrderNum(sync_point_manager_.get()); 249 release_stream.AllocateOrderNum();
247 250
248 uint64_t release_count = 1; 251 uint64_t release_count = 1;
249 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count); 252 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count);
250 253
251 // Order number was higher but it was actually released. 254 // Order number was higher but it was actually released.
252 release_stream.BeginProcessing(); 255 release_stream.BeginProcessing();
253 release_stream.client->ReleaseFenceSync(release_count); 256 release_stream.client_state->ReleaseFenceSync(release_count);
254 release_stream.EndProcessing(); 257 release_stream.EndProcessing();
255 258
256 // Release stream has already released so there's no need to wait. 259 // Release stream has already released so there's no need to wait.
257 wait_stream.BeginProcessing(); 260 wait_stream.BeginProcessing();
258 int test_num = 10; 261 int test_num = 10;
259 bool valid_wait = wait_stream.client->Wait( 262 bool valid_wait = wait_stream.client_state->Wait(
260 sync_token, 263 sync_token,
261 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123)); 264 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123));
262 EXPECT_FALSE(valid_wait); 265 EXPECT_FALSE(valid_wait);
263 EXPECT_EQ(10, test_num); 266 EXPECT_EQ(10, test_num);
264 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 267 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token));
265 } 268 }
266 269
267 TEST_F(SyncPointManagerTest, DestroyedClientRelease) { 270 TEST_F(SyncPointManagerTest, DestroyedClientRelease) {
268 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO; 271 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO;
269 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123); 272 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123);
270 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234); 273 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234);
271 274
272 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId, 275 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId,
273 kReleaseCmdBufferId); 276 kReleaseCmdBufferId);
274 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId, 277 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId,
275 kWaitCmdBufferId); 278 kWaitCmdBufferId);
276 279
277 release_stream.AllocateOrderNum(sync_point_manager_.get()); 280 release_stream.AllocateOrderNum();
278 wait_stream.AllocateOrderNum(sync_point_manager_.get()); 281 wait_stream.AllocateOrderNum();
279 282
280 uint64_t release_count = 1; 283 uint64_t release_count = 1;
281 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count); 284 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count);
282 285
283 wait_stream.BeginProcessing(); 286 wait_stream.BeginProcessing();
284 287
285 int test_num = 10; 288 int test_num = 10;
286 bool valid_wait = wait_stream.client->Wait( 289 bool valid_wait = wait_stream.client_state->Wait(
287 sync_token, 290 sync_token,
288 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123)); 291 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123));
289 EXPECT_TRUE(valid_wait); 292 EXPECT_TRUE(valid_wait);
290 EXPECT_EQ(10, test_num); 293 EXPECT_EQ(10, test_num);
291 294
292 // Destroying the client should release the wait. 295 // Destroying the client should release the wait.
293 release_stream.client.reset(); 296 release_stream.client_state->Destroy();
297 release_stream.client_state = nullptr;
298
294 EXPECT_EQ(123, test_num); 299 EXPECT_EQ(123, test_num);
295 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 300 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token));
296 } 301 }
297 302
298 TEST_F(SyncPointManagerTest, NonExistentRelease) { 303 TEST_F(SyncPointManagerTest, NonExistentRelease) {
299 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO; 304 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO;
300 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123); 305 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123);
301 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234); 306 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234);
302 307
303 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId, 308 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId,
304 kReleaseCmdBufferId); 309 kReleaseCmdBufferId);
305 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId, 310 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId,
306 kWaitCmdBufferId); 311 kWaitCmdBufferId);
307 312
308 // Assign release stream order [1] and wait stream order [2]. 313 // Assign release stream order [1] and wait stream order [2].
309 // This test simply tests that a wait stream of order [2] waiting on 314 // This test simply tests that a wait stream of order [2] waiting on
310 // release stream of order [1] will still release the fence sync even 315 // release stream of order [1] will still release the fence sync even
311 // though nothing was released. 316 // though nothing was released.
312 release_stream.AllocateOrderNum(sync_point_manager_.get()); 317 release_stream.AllocateOrderNum();
313 wait_stream.AllocateOrderNum(sync_point_manager_.get()); 318 wait_stream.AllocateOrderNum();
314 319
315 uint64_t release_count = 1; 320 uint64_t release_count = 1;
316 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count); 321 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count);
317 322
318 wait_stream.BeginProcessing(); 323 wait_stream.BeginProcessing();
319 int test_num = 10; 324 int test_num = 10;
320 bool valid_wait = wait_stream.client->Wait( 325 bool valid_wait = wait_stream.client_state->Wait(
321 sync_token, 326 sync_token,
322 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123)); 327 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123));
323 EXPECT_TRUE(valid_wait); 328 EXPECT_TRUE(valid_wait);
324 EXPECT_EQ(10, test_num); 329 EXPECT_EQ(10, test_num);
325 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 330 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token));
326 331
327 // No release but finishing the order number should automatically release. 332 // No release but finishing the order number should automatically release.
328 release_stream.BeginProcessing(); 333 release_stream.BeginProcessing();
329 EXPECT_EQ(10, test_num); 334 EXPECT_EQ(10, test_num);
330 release_stream.EndProcessing(); 335 release_stream.EndProcessing();
(...skipping 10 matching lines...) Expand all
341 kReleaseCmdBufferId); 346 kReleaseCmdBufferId);
342 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId, 347 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId,
343 kWaitCmdBufferId); 348 kWaitCmdBufferId);
344 349
345 // Assign Release stream order [1] and assign Wait stream orders [2, 3]. 350 // Assign Release stream order [1] and assign Wait stream orders [2, 3].
346 // This test is similar to the NonExistentRelease case except 351 // This test is similar to the NonExistentRelease case except
347 // we place an extra order number in between the release and wait. 352 // we place an extra order number in between the release and wait.
348 // The wait stream [3] is waiting on release stream [1] even though 353 // The wait stream [3] is waiting on release stream [1] even though
349 // order [2] was also generated. Although order [2] only exists on the 354 // order [2] was also generated. Although order [2] only exists on the
350 // wait stream so the release stream should only know about order [1]. 355 // wait stream so the release stream should only know about order [1].
351 release_stream.AllocateOrderNum(sync_point_manager_.get()); 356 release_stream.AllocateOrderNum();
352 wait_stream.AllocateOrderNum(sync_point_manager_.get()); 357 wait_stream.AllocateOrderNum();
353 wait_stream.AllocateOrderNum(sync_point_manager_.get()); 358 wait_stream.AllocateOrderNum();
354 359
355 uint64_t release_count = 1; 360 uint64_t release_count = 1;
356 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count); 361 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count);
357 362
358 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 363 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token));
359 // Have wait with order [3] to wait on release. 364 // Have wait with order [3] to wait on release.
360 wait_stream.BeginProcessing(); 365 wait_stream.BeginProcessing();
361 EXPECT_EQ(2u, wait_stream.order_data->current_order_num()); 366 EXPECT_EQ(2u, wait_stream.order_data->current_order_num());
362 wait_stream.EndProcessing(); 367 wait_stream.EndProcessing();
363 wait_stream.BeginProcessing(); 368 wait_stream.BeginProcessing();
364 EXPECT_EQ(3u, wait_stream.order_data->current_order_num()); 369 EXPECT_EQ(3u, wait_stream.order_data->current_order_num());
365 int test_num = 10; 370 int test_num = 10;
366 bool valid_wait = wait_stream.client->Wait( 371 bool valid_wait = wait_stream.client_state->Wait(
367 sync_token, 372 sync_token,
368 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123)); 373 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123));
369 EXPECT_TRUE(valid_wait); 374 EXPECT_TRUE(valid_wait);
370 EXPECT_EQ(10, test_num); 375 EXPECT_EQ(10, test_num);
371 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 376 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token));
372 377
373 // Even though release stream order [1] did not have a release, it 378 // Even though release stream order [1] did not have a release, it
374 // should have changed test_num although the fence sync is still not released. 379 // should have changed test_num although the fence sync is still not released.
375 release_stream.BeginProcessing(); 380 release_stream.BeginProcessing();
376 EXPECT_EQ(1u, release_stream.order_data->current_order_num()); 381 EXPECT_EQ(1u, release_stream.order_data->current_order_num());
377 release_stream.EndProcessing(); 382 release_stream.EndProcessing();
378 EXPECT_EQ(123, test_num); 383 EXPECT_EQ(123, test_num);
379 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 384 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token));
380 385
381 // Ensure that the wait callback does not get triggered again when it is 386 // Ensure that the wait callback does not get triggered again when it is
382 // actually released. 387 // actually released.
383 test_num = 1; 388 test_num = 1;
384 release_stream.AllocateOrderNum(sync_point_manager_.get()); 389 release_stream.AllocateOrderNum();
385 release_stream.BeginProcessing(); 390 release_stream.BeginProcessing();
386 release_stream.client->ReleaseFenceSync(release_count); 391 release_stream.client_state->ReleaseFenceSync(release_count);
387 release_stream.EndProcessing(); 392 release_stream.EndProcessing();
388 EXPECT_EQ(1, test_num); 393 EXPECT_EQ(1, test_num);
389 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 394 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token));
390 } 395 }
391 396
392 TEST_F(SyncPointManagerTest, NonExistentOrderNumRelease) { 397 TEST_F(SyncPointManagerTest, NonExistentOrderNumRelease) {
393 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO; 398 CommandBufferNamespace kNamespaceId = gpu::CommandBufferNamespace::GPU_IO;
394 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123); 399 CommandBufferId kReleaseCmdBufferId = CommandBufferId::FromUnsafeValue(0x123);
395 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234); 400 CommandBufferId kWaitCmdBufferId = CommandBufferId::FromUnsafeValue(0x234);
396 401
397 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId, 402 SyncPointStream release_stream(sync_point_manager_.get(), kNamespaceId,
398 kReleaseCmdBufferId); 403 kReleaseCmdBufferId);
399 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId, 404 SyncPointStream wait_stream(sync_point_manager_.get(), kNamespaceId,
400 kWaitCmdBufferId); 405 kWaitCmdBufferId);
401 406
402 // Assign Release stream orders [1, 4] and assign Wait stream orders [2, 3]. 407 // Assign Release stream orders [1, 4] and assign Wait stream orders [2, 3].
403 // Here we are testing that wait order [3] will wait on a fence sync 408 // Here we are testing that wait order [3] will wait on a fence sync
404 // in either order [1] or order [2]. Order [2] was not actually assigned 409 // in either order [1] or order [2]. Order [2] was not actually assigned
405 // to the release stream so it is essentially non-existent to the release 410 // to the release stream so it is essentially non-existent to the release
406 // stream's point of view. Once the release stream begins processing the next 411 // stream's point of view. Once the release stream begins processing the next
407 // order [3], it should realize order [2] didn't exist and release the fence. 412 // order [3], it should realize order [2] didn't exist and release the fence.
408 release_stream.AllocateOrderNum(sync_point_manager_.get()); 413 release_stream.AllocateOrderNum();
409 wait_stream.AllocateOrderNum(sync_point_manager_.get()); 414 wait_stream.AllocateOrderNum();
410 wait_stream.AllocateOrderNum(sync_point_manager_.get()); 415 wait_stream.AllocateOrderNum();
411 release_stream.AllocateOrderNum(sync_point_manager_.get()); 416 release_stream.AllocateOrderNum();
412 417
413 uint64_t release_count = 1; 418 uint64_t release_count = 1;
414 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count); 419 SyncToken sync_token(kNamespaceId, 0, kReleaseCmdBufferId, release_count);
415 420
416 // Have wait with order [3] to wait on release order [1] or [2]. 421 // Have wait with order [3] to wait on release order [1] or [2].
417 wait_stream.BeginProcessing(); 422 wait_stream.BeginProcessing();
418 EXPECT_EQ(2u, wait_stream.order_data->current_order_num()); 423 EXPECT_EQ(2u, wait_stream.order_data->current_order_num());
419 wait_stream.EndProcessing(); 424 wait_stream.EndProcessing();
420 wait_stream.BeginProcessing(); 425 wait_stream.BeginProcessing();
421 EXPECT_EQ(3u, wait_stream.order_data->current_order_num()); 426 EXPECT_EQ(3u, wait_stream.order_data->current_order_num());
422 int test_num = 10; 427 int test_num = 10;
423 bool valid_wait = wait_stream.client->Wait( 428 bool valid_wait = wait_stream.client_state->Wait(
424 sync_token, 429 sync_token,
425 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123)); 430 base::Bind(&SyncPointManagerTest::SetIntegerFunction, &test_num, 123));
426 EXPECT_TRUE(valid_wait); 431 EXPECT_TRUE(valid_wait);
427 EXPECT_EQ(10, test_num); 432 EXPECT_EQ(10, test_num);
428 433
429 // Release stream should know it should release fence sync by order [3], 434 // Release stream should know it should release fence sync by order [3],
430 // so going through order [1] should not release it yet. 435 // so going through order [1] should not release it yet.
431 release_stream.BeginProcessing(); 436 release_stream.BeginProcessing();
432 EXPECT_EQ(1u, release_stream.order_data->current_order_num()); 437 EXPECT_EQ(1u, release_stream.order_data->current_order_num());
433 release_stream.EndProcessing(); 438 release_stream.EndProcessing();
434 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 439 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token));
435 EXPECT_EQ(10, test_num); 440 EXPECT_EQ(10, test_num);
436 441
437 // Beginning order [4] should immediately trigger the wait although the fence 442 // Beginning order [4] should immediately trigger the wait although the fence
438 // sync is still not released yet. 443 // sync is still not released yet.
439 release_stream.BeginProcessing(); 444 release_stream.BeginProcessing();
440 EXPECT_EQ(4u, release_stream.order_data->current_order_num()); 445 EXPECT_EQ(4u, release_stream.order_data->current_order_num());
441 EXPECT_EQ(123, test_num); 446 EXPECT_EQ(123, test_num);
442 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 447 EXPECT_FALSE(sync_point_manager_->IsSyncTokenReleased(sync_token));
443 448
444 // Ensure that the wait callback does not get triggered again when it is 449 // Ensure that the wait callback does not get triggered again when it is
445 // actually released. 450 // actually released.
446 test_num = 1; 451 test_num = 1;
447 release_stream.client->ReleaseFenceSync(1); 452 release_stream.client_state->ReleaseFenceSync(1);
448 EXPECT_EQ(1, test_num); 453 EXPECT_EQ(1, test_num);
449 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token)); 454 EXPECT_TRUE(sync_point_manager_->IsSyncTokenReleased(sync_token));
450 } 455 }
451 456
452 } // namespace gpu 457 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/sync_point_manager.cc ('k') | gpu/command_buffer/tests/fuzzer_main.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698