Index: gpu/command_buffer/service/sync_point_manager_unittest.cc |
diff --git a/gpu/command_buffer/service/sync_point_manager_unittest.cc b/gpu/command_buffer/service/sync_point_manager_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8896eff409410273059b8f7c05e38aaed7fee1c7 |
--- /dev/null |
+++ b/gpu/command_buffer/service/sync_point_manager_unittest.cc |
@@ -0,0 +1,309 @@ |
+// Copyright (c) 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/bind.h" |
+#include "gpu/command_buffer/service/sync_point_manager.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace gpu { |
+ |
+class SyncPointManagerTest : public testing::Test { |
+ public: |
+ SyncPointManagerTest() { |
+ } |
+ |
+ ~SyncPointManagerTest() override {} |
+ |
+ protected: |
+ void SetUp() override { |
+ sync_point_manager_.reset(new SyncPointManager(false)); |
+ } |
+ |
+ void TearDown() override { |
+ sync_point_manager_.reset(); |
+ } |
+ |
+ // Simple static function which can be used to test callbacks. |
+ static void SetIntegerFunction(int* test, int value) { |
+ *test = value; |
+ } |
+ |
+ scoped_ptr<SyncPointManager> sync_point_manager_; |
+}; |
+ |
+struct SyncPointStream { |
+ scoped_refptr<SyncPointOrderData> order_data; |
+ scoped_ptr<SyncPointClient> client; |
+ uint32_t current_order_num; |
+ |
+ SyncPointStream(SyncPointManager* sync_point_manager, |
+ CommandBufferNamespace namespace_id, |
+ uint64_t command_buffer_id) |
+ : order_data(SyncPointOrderData::Create()), |
+ client(sync_point_manager->CreateSyncPointClient(order_data, |
+ namespace_id, |
+ command_buffer_id)), |
+ current_order_num(0) { |
+ } |
+ |
+ ~SyncPointStream() { |
+ order_data->Destroy(); |
+ order_data = nullptr; |
+ } |
+ |
+ void AllocateOrderNum(SyncPointManager* sync_point_manager) { |
+ ASSERT_EQ(0u, current_order_num); |
+ current_order_num = |
+ order_data->GenerateUnprocessedOrderNumber(sync_point_manager); |
+ } |
+ |
+ void BeginProcessing() { |
+ ASSERT_NE(0u, current_order_num); |
+ order_data->BeginProcessingOrderNumber(current_order_num); |
+ } |
+ |
+ void EndProcessing() { |
+ ASSERT_NE(0u, current_order_num); |
+ order_data->FinishProcessingOrderNumber(current_order_num); |
+ current_order_num = 0; |
+ } |
+}; |
+ |
+TEST_F(SyncPointManagerTest, BasicSyncPointOrderDataTest) { |
+ scoped_refptr<SyncPointOrderData> order_data = SyncPointOrderData::Create(); |
+ |
+ EXPECT_EQ(0u, order_data->current_order_num()); |
+ EXPECT_EQ(0u, order_data->processed_order_num()); |
+ EXPECT_EQ(0u, order_data->unprocessed_order_num()); |
+ |
+ const uint32_t order_num = |
+ order_data->GenerateUnprocessedOrderNumber(sync_point_manager_.get()); |
+ EXPECT_EQ(1u, order_num); |
+ |
+ EXPECT_EQ(0u, order_data->current_order_num()); |
+ EXPECT_EQ(0u, order_data->processed_order_num()); |
+ EXPECT_EQ(order_num, order_data->unprocessed_order_num()); |
+ |
+ order_data->BeginProcessingOrderNumber(order_num); |
+ EXPECT_EQ(order_num, order_data->current_order_num()); |
+ EXPECT_EQ(0u, order_data->processed_order_num()); |
+ EXPECT_EQ(order_num, order_data->unprocessed_order_num()); |
+ |
+ order_data->FinishProcessingOrderNumber(order_num); |
+ EXPECT_EQ(order_num, order_data->current_order_num()); |
+ EXPECT_EQ(order_num, order_data->processed_order_num()); |
+ EXPECT_EQ(order_num, order_data->unprocessed_order_num()); |
+} |
+ |
+TEST_F(SyncPointManagerTest, SyncPointClientRegistration) { |
+ const CommandBufferNamespace kNamespaceId = |
+ gpu::CommandBufferNamespace::GPU_IO; |
+ const uint64_t kBufferId = 0x123; |
+ |
+ scoped_refptr<SyncPointClientState> empty_state = |
+ sync_point_manager_->GetSyncPointClientState(kNamespaceId, kBufferId); |
+ EXPECT_FALSE(empty_state); |
+ |
+ scoped_refptr<SyncPointOrderData> order_data = SyncPointOrderData::Create(); |
+ |
+ scoped_ptr<SyncPointClient> client = |
+ sync_point_manager_->CreateSyncPointClient(order_data, |
+ kNamespaceId, |
+ kBufferId); |
+ |
+ EXPECT_EQ(order_data, client->client_state()->order_data()); |
+ EXPECT_EQ(client->client_state(), |
+ sync_point_manager_->GetSyncPointClientState(kNamespaceId, |
+ kBufferId)); |
+} |
+ |
+TEST_F(SyncPointManagerTest, BasicFenceSyncRelease) { |
+ const CommandBufferNamespace kNamespaceId = |
+ gpu::CommandBufferNamespace::GPU_IO; |
+ const uint64_t kBufferId = 0x123; |
+ |
+ scoped_refptr<SyncPointOrderData> order_data = SyncPointOrderData::Create(); |
+ scoped_ptr<SyncPointClient> client = |
+ sync_point_manager_->CreateSyncPointClient(order_data, |
+ kNamespaceId, |
+ kBufferId); |
+ scoped_refptr<SyncPointClientState> client_state = client->client_state(); |
+ |
+ EXPECT_EQ(0u, client_state->fence_sync_release()); |
+ EXPECT_FALSE(client_state->IsFenceSyncReleased(1)); |
+ |
+ client->ReleaseFenceSync(1); |
+ |
+ EXPECT_EQ(1u, client_state->fence_sync_release()); |
+ EXPECT_TRUE(client_state->IsFenceSyncReleased(1)); |
+} |
+ |
+TEST_F(SyncPointManagerTest, BasicFenceSyncWaitRelease) { |
+ const CommandBufferNamespace kNamespaceId = |
+ gpu::CommandBufferNamespace::GPU_IO; |
+ const uint64_t kBufferId1 = 0x123; |
+ const uint64_t kBufferId2 = 0x234; |
+ |
+ SyncPointStream release_stream(sync_point_manager_.get(), |
+ kNamespaceId, |
+ kBufferId1); |
+ SyncPointStream wait_stream(sync_point_manager_.get(), |
+ kNamespaceId, |
+ kBufferId2); |
+ |
+ release_stream.AllocateOrderNum(sync_point_manager_.get()); |
+ wait_stream.AllocateOrderNum(sync_point_manager_.get()); |
+ |
+ wait_stream.BeginProcessing(); |
+ int test_num = 10; |
+ const bool valid_wait = |
+ wait_stream.client->Wait( |
+ release_stream.client->client_state(), |
+ 1, |
+ base::Bind(&SyncPointManagerTest::SetIntegerFunction, |
+ &test_num, |
+ 123)); |
+ ASSERT_TRUE(valid_wait); |
+ EXPECT_EQ(10, test_num); |
+ |
+ release_stream.BeginProcessing(); |
+ release_stream.client->ReleaseFenceSync(1); |
+ EXPECT_EQ(123, test_num); |
+} |
+ |
+TEST_F(SyncPointManagerTest, OutOfOrderRelease) { |
+ const CommandBufferNamespace kNamespaceId = |
+ gpu::CommandBufferNamespace::GPU_IO; |
+ const uint64_t kBufferId1 = 0x123; |
+ const uint64_t kBufferId2 = 0x234; |
+ |
+ SyncPointStream release_stream(sync_point_manager_.get(), |
+ kNamespaceId, |
+ kBufferId1); |
+ SyncPointStream wait_stream(sync_point_manager_.get(), |
+ kNamespaceId, |
+ kBufferId2); |
+ |
+ // Generate wait order number first. |
+ wait_stream.AllocateOrderNum(sync_point_manager_.get()); |
+ release_stream.AllocateOrderNum(sync_point_manager_.get()); |
+ |
+ wait_stream.BeginProcessing(); |
+ int test_num = 10; |
+ const bool valid_wait = |
+ wait_stream.client->Wait( |
+ release_stream.client->client_state(), |
+ 1, |
+ base::Bind(&SyncPointManagerTest::SetIntegerFunction, |
+ &test_num, |
+ 123)); |
+ EXPECT_FALSE(valid_wait); |
+ EXPECT_EQ(10, test_num); |
+} |
+ |
+TEST_F(SyncPointManagerTest, HigherOrderNumberRelease) { |
+ const CommandBufferNamespace kNamespaceId = |
+ gpu::CommandBufferNamespace::GPU_IO; |
+ const uint64_t kBufferId1 = 0x123; |
+ const uint64_t kBufferId2 = 0x234; |
+ |
+ SyncPointStream release_stream(sync_point_manager_.get(), |
+ kNamespaceId, |
+ kBufferId1); |
+ SyncPointStream wait_stream(sync_point_manager_.get(), |
+ kNamespaceId, |
+ kBufferId2); |
+ |
+ // Generate wait order number first. |
+ wait_stream.AllocateOrderNum(sync_point_manager_.get()); |
+ release_stream.AllocateOrderNum(sync_point_manager_.get()); |
+ |
+ // Order number was higher but it was actually released. |
+ release_stream.BeginProcessing(); |
+ release_stream.client->ReleaseFenceSync(1); |
+ release_stream.EndProcessing(); |
+ |
+ wait_stream.BeginProcessing(); |
+ int test_num = 10; |
+ const bool valid_wait = |
+ wait_stream.client->Wait( |
+ release_stream.client->client_state(), |
+ 1, |
+ base::Bind(&SyncPointManagerTest::SetIntegerFunction, |
+ &test_num, |
+ 123)); |
+ EXPECT_TRUE(valid_wait); |
+ EXPECT_EQ(123, test_num); |
+} |
+ |
+TEST_F(SyncPointManagerTest, DestroyedClientRelease) { |
+ const CommandBufferNamespace kNamespaceId = |
+ gpu::CommandBufferNamespace::GPU_IO; |
+ const uint64_t kBufferId1 = 0x123; |
+ const uint64_t kBufferId2 = 0x234; |
+ |
+ SyncPointStream release_stream(sync_point_manager_.get(), |
+ kNamespaceId, |
+ kBufferId1); |
+ SyncPointStream wait_stream(sync_point_manager_.get(), |
+ kNamespaceId, |
+ kBufferId2); |
+ |
+ release_stream.AllocateOrderNum(sync_point_manager_.get()); |
+ wait_stream.AllocateOrderNum(sync_point_manager_.get()); |
+ |
+ wait_stream.BeginProcessing(); |
+ int test_num = 10; |
+ const bool valid_wait = |
+ wait_stream.client->Wait( |
+ release_stream.client->client_state(), |
+ 1, |
+ base::Bind(&SyncPointManagerTest::SetIntegerFunction, |
+ &test_num, |
+ 123)); |
+ EXPECT_TRUE(valid_wait); |
+ EXPECT_EQ(10, test_num); |
+ |
+ // Destroying the client should release the wait. |
+ release_stream.client.reset(); |
+ EXPECT_EQ(123, test_num); |
+} |
+ |
+TEST_F(SyncPointManagerTest, NonExistentRelease) { |
+ const CommandBufferNamespace kNamespaceId = |
+ gpu::CommandBufferNamespace::GPU_IO; |
+ const uint64_t kBufferId1 = 0x123; |
+ const uint64_t kBufferId2 = 0x234; |
+ |
+ SyncPointStream release_stream(sync_point_manager_.get(), |
+ kNamespaceId, |
+ kBufferId1); |
+ SyncPointStream wait_stream(sync_point_manager_.get(), |
+ kNamespaceId, |
+ kBufferId2); |
+ |
+ release_stream.AllocateOrderNum(sync_point_manager_.get()); |
+ wait_stream.AllocateOrderNum(sync_point_manager_.get()); |
+ |
+ wait_stream.BeginProcessing(); |
+ int test_num = 10; |
+ const bool valid_wait = |
+ wait_stream.client->Wait( |
+ release_stream.client->client_state(), |
+ 1, |
+ base::Bind(&SyncPointManagerTest::SetIntegerFunction, |
+ &test_num, |
+ 123)); |
+ EXPECT_TRUE(valid_wait); |
+ EXPECT_EQ(10, test_num); |
+ |
+ // No release but finishing the order number should automatically release. |
+ release_stream.BeginProcessing(); |
+ EXPECT_EQ(10, test_num); |
+ release_stream.EndProcessing(); |
+ EXPECT_EQ(123, test_num); |
+} |
+ |
+} // namespace gpu |
+ |