| Index: gpu/command_buffer/client/fenced_allocator_test.cc
|
| ===================================================================
|
| --- gpu/command_buffer/client/fenced_allocator_test.cc (revision 52147)
|
| +++ gpu/command_buffer/client/fenced_allocator_test.cc (working copy)
|
| @@ -206,6 +206,66 @@
|
| }
|
| }
|
|
|
| +// Checks the free-pending-token mechanism using FreeUnused
|
| +TEST_F(FencedAllocatorTest, FreeUnused) {
|
| + EXPECT_TRUE(allocator_->CheckConsistency());
|
| +
|
| + const unsigned int kSize = 16;
|
| + const unsigned int kAllocCount = kBufferSize / kSize;
|
| + CHECK(kAllocCount * kSize == kBufferSize);
|
| +
|
| + // Allocate several buffers to fill in the memory.
|
| + FencedAllocator::Offset offsets[kAllocCount];
|
| + for (unsigned int i = 0; i < kAllocCount; ++i) {
|
| + offsets[i] = allocator_->Alloc(kSize);
|
| + EXPECT_NE(FencedAllocator::kInvalidOffset, offsets[i]);
|
| + EXPECT_GE(kBufferSize, offsets[i]+kSize);
|
| + EXPECT_TRUE(allocator_->CheckConsistency());
|
| + }
|
| +
|
| + // No memory should be available.
|
| + EXPECT_EQ(0u, allocator_->GetLargestFreeSize());
|
| +
|
| + // Free one successful allocation, pending fence.
|
| + int32 token = helper_.get()->InsertToken();
|
| + allocator_->FreePendingToken(offsets[0], token);
|
| + EXPECT_TRUE(allocator_->CheckConsistency());
|
| +
|
| + // Force the command buffer to process the token.
|
| + helper_->Finish();
|
| +
|
| + // Tell the allocator to update what's available based on the current token.
|
| + allocator_->FreeUnused();
|
| +
|
| + // Check that the new largest free size takes into account the unused block.
|
| + EXPECT_EQ(kSize, allocator_->GetLargestFreeSize());
|
| +
|
| + // Free two more.
|
| + token = helper_.get()->InsertToken();
|
| + allocator_->FreePendingToken(offsets[1], token);
|
| + token = helper_.get()->InsertToken();
|
| + allocator_->FreePendingToken(offsets[2], token);
|
| + EXPECT_TRUE(allocator_->CheckConsistency());
|
| +
|
| + // Check that nothing has changed.
|
| + EXPECT_EQ(kSize, allocator_->GetLargestFreeSize());
|
| +
|
| + // Force the command buffer to process the token.
|
| + helper_->Finish();
|
| +
|
| + // Tell the allocator to update what's available based on the current token.
|
| + allocator_->FreeUnused();
|
| +
|
| + // Check that the new largest free size takes into account the unused blocks.
|
| + EXPECT_EQ(kSize * 3, allocator_->GetLargestFreeSize());
|
| +
|
| + // Free up everything.
|
| + for (unsigned int i = 3; i < kAllocCount; ++i) {
|
| + allocator_->Free(offsets[i]);
|
| + EXPECT_TRUE(allocator_->CheckConsistency());
|
| + }
|
| +}
|
| +
|
| // Tests GetLargestFreeSize
|
| TEST_F(FencedAllocatorTest, TestGetLargestFreeSize) {
|
| EXPECT_TRUE(allocator_->CheckConsistency());
|
|
|