diff options
author | dyen <dyen@chromium.org> | 2016-01-08 13:58:23 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-08 21:59:16 +0000 |
commit | 563fb212fda4ad5ea477b754d628527e3f20010f (patch) | |
tree | 8816f97d0ff8eeed8d0f56feab117c834b9b1cec /gpu/command_buffer/service/sync_point_manager_unittest.cc | |
parent | 3dbaa6aed5697f9ec80ba8f19a997eb2162bded1 (diff) | |
download | chromium_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.cc | 16 |
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)); |