Index: gpu/command_buffer/service/indexed_buffer_binding_host_unittest.cc |
diff --git a/gpu/command_buffer/service/indexed_buffer_binding_host_unittest.cc b/gpu/command_buffer/service/indexed_buffer_binding_host_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f411ae0cdf8ece34e3b8ba1f5eba0be317d053f8 |
--- /dev/null |
+++ b/gpu/command_buffer/service/indexed_buffer_binding_host_unittest.cc |
@@ -0,0 +1,119 @@ |
+// Copyright (c) 2016 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 "gpu/command_buffer/service/buffer_manager.h" |
+#include "gpu/command_buffer/service/gpu_service_test.h" |
+#include "gpu/command_buffer/service/indexed_buffer_binding_host.h" |
+#include "ui/gl/gl_mock.h" |
+ |
+namespace gpu { |
+namespace gles2 { |
+ |
+namespace { |
+const uint32_t kMaxBindings = 16; |
+const GLuint kBufferClientId = 87; |
+const GLuint kBufferServiceId = 987; |
+} // namespace anonymous |
+ |
+class IndexedBufferBindingHostTest : public GpuServiceTest { |
+ public: |
+ IndexedBufferBindingHostTest() |
+ : host_(new IndexedBufferBindingHost(kMaxBindings, true)), |
+ buffer_manager_(new BufferManager(nullptr, nullptr)) { |
+ buffer_manager_->CreateBuffer(kBufferClientId, kBufferServiceId); |
+ buffer_ = buffer_manager_->GetBuffer(kBufferClientId); |
+ DCHECK(buffer_.get()); |
+ } |
+ |
+ ~IndexedBufferBindingHostTest() override {} |
+ |
+ protected: |
+ void SetUp() override { |
+ GpuServiceTest::SetUpWithGLVersion("4.1", ""); |
+ } |
+ |
+ void TearDown() override { |
+ host_->RemoveBoundBuffer(buffer_.get()); |
+ buffer_ = nullptr; |
+ buffer_manager_->MarkContextLost(); |
+ buffer_manager_->Destroy(); |
+ buffer_manager_.reset(); |
+ GpuServiceTest::TearDown(); |
+ } |
+ |
+ void SetBufferSize(GLenum target, GLsizeiptr size) { |
+ buffer_manager_->SetInfo( |
+ buffer_.get(), target, size, GL_STATIC_DRAW, false); |
+ } |
+ |
+ scoped_refptr<IndexedBufferBindingHost> host_; |
+ std::unique_ptr<BufferManager> buffer_manager_; |
+ scoped_refptr<Buffer> buffer_; |
+}; |
+ |
+TEST_F(IndexedBufferBindingHostTest, DoBindBufferRangeUninitializedBuffer) { |
+ const GLenum kTarget = GL_TRANSFORM_FEEDBACK_BUFFER; |
+ const GLuint kIndex = 2; |
+ const GLintptr kOffset = 4; |
+ const GLsizeiptr kSize = 8; |
+ |
+ EXPECT_CALL(*gl_, BindBufferBase(kTarget, kIndex, kBufferServiceId)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ |
+ host_->DoBindBufferRange(kTarget, kIndex, buffer_.get(), kOffset, kSize); |
+ |
+ for (uint32_t index = 0; index < kMaxBindings; ++index) { |
+ if (index != kIndex) { |
+ EXPECT_EQ(nullptr, host_->GetBufferBinding(index)); |
+ } else { |
+ EXPECT_EQ(buffer_.get(), host_->GetBufferBinding(index)); |
+ EXPECT_EQ(kSize, host_->GetBufferSize(index)); |
+ EXPECT_EQ(kOffset, host_->GetBufferStart(index)); |
+ } |
+ } |
+} |
+ |
+TEST_F(IndexedBufferBindingHostTest, DoBindBufferRangeBufferWithoutEnoughSize) { |
+ const GLenum kTarget = GL_TRANSFORM_FEEDBACK_BUFFER; |
+ const GLuint kIndex = 2; |
+ const GLintptr kOffset = 4; |
+ const GLsizeiptr kSize = 8; |
+ const GLsizeiptr kBufferSize = kOffset + kSize - 2; |
+ |
+ SetBufferSize(kTarget, kBufferSize); |
+ |
+ GLsizeiptr clamped_size = ((kBufferSize - kOffset) >> 2) << 2; |
+ |
+ EXPECT_CALL(*gl_, BindBufferRange(kTarget, kIndex, kBufferServiceId, kOffset, |
+ clamped_size)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ |
+ host_->DoBindBufferRange(kTarget, kIndex, buffer_.get(), kOffset, kSize); |
+ |
+ for (uint32_t index = 0; index < kMaxBindings; ++index) { |
+ if (index != kIndex) { |
+ EXPECT_EQ(nullptr, host_->GetBufferBinding(index)); |
+ } else { |
+ EXPECT_EQ(buffer_.get(), host_->GetBufferBinding(index)); |
+ EXPECT_EQ(kSize, host_->GetBufferSize(index)); |
+ EXPECT_EQ(kOffset, host_->GetBufferStart(index)); |
+ } |
+ } |
+ |
+ // Now adjust buffer size to be big enough. |
+ EXPECT_CALL(*gl_, BindBufferRange(kTarget, kIndex, kBufferServiceId, kOffset, |
+ kSize)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ |
+ SetBufferSize(kTarget, kOffset + kSize); |
+ host_->OnBufferData(kTarget, buffer_.get()); |
+} |
+ |
+} // namespace gles2 |
+} // namespace gpu |
+ |
+ |