summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service/sync_point_manager_unittest.cc
diff options
context:
space:
mode:
authordyen <dyen@chromium.org>2016-01-08 13:58:23 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-08 21:59:16 +0000
commit563fb212fda4ad5ea477b754d628527e3f20010f (patch)
tree8816f97d0ff8eeed8d0f56feab117c834b9b1cec /gpu/command_buffer/service/sync_point_manager_unittest.cc
parent3dbaa6aed5697f9ec80ba8f19a997eb2162bded1 (diff)
downloadchromium_src-563fb212fda4ad5ea477b754d628527e3f20010f.zip
chromium_src-563fb212fda4ad5ea477b754d628527e3f20010f.tar.gz
chromium_src-563fb212fda4ad5ea477b754d628527e3f20010f.tar.bz2
Added a way for sync point clients to issue out of order waits.
This patch fixes a subtle bug that could occur if a sync point client is waiting without a corresponding order number. This can occur for any wait that is not done within the usual command buffer processing loop. An example is the command buffer stub OnSignalSyncToken() function which issues a wait directly on the IO thread. Previously, a similar concept was introduced in SyncPointClientWaiter which was used to wait out of order when a Gpu Memory Buffer was destroyed. Because of the need for this functionality in the regular SyncPointClient, I have folded the SyncPointClientWaiter functions into SyncPointClient under WaitOutOfOrder() & WaitOutOfOrderNonThreadSafe(). Because of how subtle this bug is, further state tracking is now done so we can test whether or not an order number is processing or not. Using that test, DCHECKs have been added so Wait()/WaitNonThreadSafe can only be called when processing an order number, and the the out of order variants can only be called when not processing an order number. BUG=514815 TEST=Added unit tests to test SignalSyncToken(). Review URL: https://codereview.chromium.org/1568563002 Cr-Commit-Position: refs/heads/master@{#368441}
Diffstat (limited to 'gpu/command_buffer/service/sync_point_manager_unittest.cc')
-rw-r--r--gpu/command_buffer/service/sync_point_manager_unittest.cc16
1 files changed, 16 insertions, 0 deletions
diff --git a/gpu/command_buffer/service/sync_point_manager_unittest.cc b/gpu/command_buffer/service/sync_point_manager_unittest.cc
index 28321c4..cc67ff9 100644
--- a/gpu/command_buffer/service/sync_point_manager_unittest.cc
+++ b/gpu/command_buffer/service/sync_point_manager_unittest.cc
@@ -85,11 +85,19 @@ TEST_F(SyncPointManagerTest, BasicSyncPointOrderDataTest) {
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());
+ EXPECT_TRUE(order_data->IsProcessingOrderNumber());
+
+ order_data->PauseProcessingOrderNumber(order_num);
+ EXPECT_FALSE(order_data->IsProcessingOrderNumber());
+
+ order_data->BeginProcessingOrderNumber(order_num);
+ EXPECT_TRUE(order_data->IsProcessingOrderNumber());
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());
+ EXPECT_FALSE(order_data->IsProcessingOrderNumber());
}
TEST_F(SyncPointManagerTest, SyncPointClientRegistration) {
@@ -127,7 +135,11 @@ TEST_F(SyncPointManagerTest, BasicFenceSyncRelease) {
EXPECT_EQ(0u, client_state->fence_sync_release());
EXPECT_FALSE(client_state->IsFenceSyncReleased(1));
+ const uint32_t order_num =
+ order_data->GenerateUnprocessedOrderNumber(sync_point_manager_.get());
+ order_data->BeginProcessingOrderNumber(order_num);
client->ReleaseFenceSync(1);
+ order_data->FinishProcessingOrderNumber(order_num);
EXPECT_EQ(1u, client_state->fence_sync_release());
EXPECT_TRUE(client_state->IsFenceSyncReleased(1));
@@ -150,7 +162,11 @@ TEST_F(SyncPointManagerTest, MultipleClientsPerOrderData) {
scoped_refptr<SyncPointClientState> client_state1 = client1->client_state();
scoped_refptr<SyncPointClientState> client_state2 = client2->client_state();
+ const uint32_t order_num =
+ order_data->GenerateUnprocessedOrderNumber(sync_point_manager_.get());
+ order_data->BeginProcessingOrderNumber(order_num);
client1->ReleaseFenceSync(1);
+ order_data->FinishProcessingOrderNumber(order_num);
EXPECT_TRUE(client_state1->IsFenceSyncReleased(1));
EXPECT_FALSE(client_state2->IsFenceSyncReleased(1));