Index: gpu/command_buffer/client/ring_buffer_test.cc |
diff --git a/gpu/command_buffer/client/ring_buffer_test.cc b/gpu/command_buffer/client/ring_buffer_test.cc |
index ac5634aa23645f7a0a5c7da0f8c8f4c3b6ad9e14..68d2aaa865ac2786a765a0a31903ec574e56f1c7 100644 |
--- a/gpu/command_buffer/client/ring_buffer_test.cc |
+++ b/gpu/command_buffer/client/ring_buffer_test.cc |
@@ -204,4 +204,229 @@ TEST_F(RingBufferTest, TestFreeBug) { |
allocator_->FreePendingToken(pointer, helper_.get()->InsertToken()); |
} |
+// Test that discarding a single allocation clears the block. |
+TEST_F(RingBufferTest, DiscardTest) { |
+ const unsigned int kAlloc1 = 3*kAlignment; |
+ void* ptr = allocator_->Alloc(kAlloc1); |
+ EXPECT_EQ(kBufferSize - kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->DiscardBlock(ptr); |
+ EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeSizeNoWaiting()); |
+} |
+ |
+// Test that discarding front of the buffer effectively frees the block. |
+TEST_F(RingBufferTest, DiscardFrontTest) { |
+ const unsigned int kAlloc1 = 3*kAlignment; |
+ const unsigned int kAlloc2 = 2*kAlignment; |
+ const unsigned int kAlloc3 = kBufferSize - kAlloc1 - kAlloc2; |
+ void* ptr1 = allocator_->Alloc(kAlloc1); |
+ EXPECT_EQ(kBufferSize - kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr1, helper_.get()->InsertToken()); |
+ |
+ void* ptr2 = allocator_->Alloc(kAlloc2); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr1) + kAlloc1, |
+ static_cast<uint8_t*>(ptr2)); |
+ EXPECT_EQ(kBufferSize - kAlloc1 - kAlloc2, |
+ allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr2, helper_.get()->InsertToken()); |
+ |
+ void* ptr3 = allocator_->Alloc(kAlloc3); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr2) + kAlloc2, |
+ static_cast<uint8_t*>(ptr3)); |
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); |
+ |
+ // Discard first block should free it up upon GetLargestFreeSizeNoWaiting(). |
+ allocator_->DiscardBlock(ptr1); |
+ EXPECT_EQ(kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr3, helper_.get()->InsertToken()); |
+} |
+ |
+// Test that discarding middle of the buffer merely marks it as padding. |
+TEST_F(RingBufferTest, DiscardMiddleTest) { |
+ const unsigned int kAlloc1 = 3*kAlignment; |
+ const unsigned int kAlloc2 = 2*kAlignment; |
+ const unsigned int kAlloc3 = kBufferSize - kAlloc1 - kAlloc2; |
+ void* ptr1 = allocator_->Alloc(kAlloc1); |
+ EXPECT_EQ(kBufferSize - kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr1, helper_.get()->InsertToken()); |
+ |
+ void* ptr2 = allocator_->Alloc(kAlloc2); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr1) + kAlloc1, |
+ static_cast<uint8_t*>(ptr2)); |
+ EXPECT_EQ(kBufferSize - kAlloc1 - kAlloc2, |
+ allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr2, helper_.get()->InsertToken()); |
+ |
+ void* ptr3 = allocator_->Alloc(kAlloc3); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr2) + kAlloc2, |
+ static_cast<uint8_t*>(ptr3)); |
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); |
+ |
+ // Discard middle block should just set it as padding. |
+ allocator_->DiscardBlock(ptr2); |
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr3, helper_.get()->InsertToken()); |
+} |
+ |
+// Test that discarding end of the buffer frees it for no waiting. |
+TEST_F(RingBufferTest, DiscardEndTest) { |
+ const unsigned int kAlloc1 = 3*kAlignment; |
+ const unsigned int kAlloc2 = 2*kAlignment; |
+ const unsigned int kAlloc3 = kBufferSize - kAlloc1 - kAlloc2; |
+ void* ptr1 = allocator_->Alloc(kAlloc1); |
+ EXPECT_EQ(kBufferSize - kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr1, helper_.get()->InsertToken()); |
+ |
+ void* ptr2 = allocator_->Alloc(kAlloc2); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr1) + kAlloc1, |
+ static_cast<uint8_t*>(ptr2)); |
+ EXPECT_EQ(kBufferSize - kAlloc1 - kAlloc2, |
+ allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr2, helper_.get()->InsertToken()); |
+ |
+ void* ptr3 = allocator_->Alloc(kAlloc3); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr2) + kAlloc2, |
+ static_cast<uint8_t*>(ptr3)); |
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); |
+ |
+ // Discard end block should discard it. |
+ allocator_->DiscardBlock(ptr3); |
+ EXPECT_EQ(kAlloc3, allocator_->GetLargestFreeSizeNoWaiting()); |
+} |
+ |
+// Test discard end of the buffer that has looped around. |
+TEST_F(RingBufferTest, DiscardLoopedEndTest) { |
+ const unsigned int kAlloc1 = 3*kAlignment; |
+ const unsigned int kAlloc2 = 2*kAlignment; |
+ const unsigned int kAlloc3 = kBufferSize - kAlloc1 - kAlloc2; |
+ void* ptr1 = allocator_->Alloc(kAlloc1); |
+ EXPECT_EQ(kBufferSize - kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr1, helper_.get()->InsertToken()); |
+ |
+ void* ptr2 = allocator_->Alloc(kAlloc2); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr1) + kAlloc1, |
+ static_cast<uint8_t*>(ptr2)); |
+ EXPECT_EQ(kBufferSize - kAlloc1 - kAlloc2, |
+ allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr2, helper_.get()->InsertToken()); |
+ |
+ void* ptr3 = allocator_->Alloc(kAlloc3); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr2) + kAlloc2, |
+ static_cast<uint8_t*>(ptr3)); |
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr3, helper_.get()->InsertToken()); |
+ |
+ // This allocation should be at the beginning again, we need to utilize |
+ // DiscardBlock here to discard the first item so that we can allocate |
+ // at the beginning without the FreeOldestBlock() getting called and freeing |
+ // the whole ring buffer. |
+ allocator_->DiscardBlock(ptr1); |
+ void* ptr4 = allocator_->Alloc(kAlloc1); |
+ EXPECT_EQ(ptr1, ptr4); |
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); |
+ |
+ // Discard end block should work properly still. |
+ allocator_->DiscardBlock(ptr4); |
+ EXPECT_EQ(kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); |
+} |
+ |
+// Test discard end of the buffer that has looped around with padding. |
+TEST_F(RingBufferTest, DiscardEndWithPaddingTest) { |
+ const unsigned int kAlloc1 = 3*kAlignment; |
+ const unsigned int kAlloc2 = 2*kAlignment; |
+ const unsigned int kPadding = kAlignment; |
+ const unsigned int kAlloc3 = kBufferSize - kAlloc1 - kAlloc2 - kPadding; |
+ void* ptr1 = allocator_->Alloc(kAlloc1); |
+ EXPECT_EQ(kBufferSize - kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr1, helper_.get()->InsertToken()); |
+ |
+ void* ptr2 = allocator_->Alloc(kAlloc2); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr1) + kAlloc1, |
+ static_cast<uint8_t*>(ptr2)); |
+ EXPECT_EQ(kBufferSize - kAlloc1 - kAlloc2, |
+ allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr2, helper_.get()->InsertToken()); |
+ |
+ void* ptr3 = allocator_->Alloc(kAlloc3); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr2) + kAlloc2, |
+ static_cast<uint8_t*>(ptr3)); |
+ EXPECT_EQ(kPadding, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr3, helper_.get()->InsertToken()); |
+ |
+ // Cause it to loop around with padding at the end of ptr3. |
+ allocator_->DiscardBlock(ptr1); |
+ void* ptr4 = allocator_->Alloc(kAlloc1); |
+ EXPECT_EQ(ptr1, ptr4); |
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); |
+ |
+ // Discard end block should also discard the padding. |
+ allocator_->DiscardBlock(ptr4); |
+ EXPECT_EQ(kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); |
+ |
+ // We can test that there is padding by attempting to allocate the padding. |
+ void* padding = allocator_->Alloc(kPadding); |
+ EXPECT_EQ(kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(padding, helper_.get()->InsertToken()); |
+} |
+ |
+// Test that discard will effectively remove all padding at the end. |
+TEST_F(RingBufferTest, DiscardAllPaddingFromEndTest) { |
+ const unsigned int kAlloc1 = 3*kAlignment; |
+ const unsigned int kAlloc2 = 2*kAlignment; |
+ const unsigned int kAlloc3 = kBufferSize - kAlloc1 - kAlloc2; |
+ void* ptr1 = allocator_->Alloc(kAlloc1); |
+ EXPECT_EQ(kBufferSize - kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr1, helper_.get()->InsertToken()); |
+ |
+ void* ptr2 = allocator_->Alloc(kAlloc2); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr1) + kAlloc1, |
+ static_cast<uint8_t*>(ptr2)); |
+ EXPECT_EQ(kBufferSize - kAlloc1 - kAlloc2, |
+ allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr2, helper_.get()->InsertToken()); |
+ |
+ void* ptr3 = allocator_->Alloc(kAlloc3); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr2) + kAlloc2, |
+ static_cast<uint8_t*>(ptr3)); |
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); |
+ |
+ // Discarding the middle allocation should turn it into padding. |
+ allocator_->DiscardBlock(ptr2); |
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); |
+ |
+ // Discarding the last allocation should discard the middle padding as well. |
+ allocator_->DiscardBlock(ptr3); |
+ EXPECT_EQ(kAlloc2 + kAlloc3, allocator_->GetLargestFreeSizeNoWaiting()); |
+} |
+ |
+// Test that discard will effectively remove all padding from the beginning. |
+TEST_F(RingBufferTest, DiscardAllPaddingFromBeginningTest) { |
+ const unsigned int kAlloc1 = 3*kAlignment; |
+ const unsigned int kAlloc2 = 2*kAlignment; |
+ const unsigned int kAlloc3 = kBufferSize - kAlloc1 - kAlloc2; |
+ void* ptr1 = allocator_->Alloc(kAlloc1); |
+ EXPECT_EQ(kBufferSize - kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr1, helper_.get()->InsertToken()); |
+ |
+ void* ptr2 = allocator_->Alloc(kAlloc2); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr1) + kAlloc1, |
+ static_cast<uint8_t*>(ptr2)); |
+ EXPECT_EQ(kBufferSize - kAlloc1 - kAlloc2, |
+ allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr2, helper_.get()->InsertToken()); |
+ |
+ void* ptr3 = allocator_->Alloc(kAlloc3); |
+ EXPECT_EQ(static_cast<uint8_t*>(ptr2) + kAlloc2, |
+ static_cast<uint8_t*>(ptr3)); |
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); |
+ allocator_->FreePendingToken(ptr3, helper_.get()->InsertToken()); |
+ |
+ // Discarding the middle allocation should turn it into padding. |
+ allocator_->DiscardBlock(ptr2); |
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); |
+ |
+ // Discarding the first allocation should discard the middle padding as well. |
+ allocator_->DiscardBlock(ptr1); |
+ EXPECT_EQ(kAlloc1 + kAlloc2, allocator_->GetLargestFreeSizeNoWaiting()); |
+} |
+ |
} // namespace gpu |