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

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

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