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