OLD | NEW |
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 Loading... |
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 |
OLD | NEW |