OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "gpu/command_buffer/service/buffer_manager.h" |
| 6 #include "gpu/command_buffer/service/gpu_service_test.h" |
| 7 #include "gpu/command_buffer/service/indexed_buffer_binding_host.h" |
| 8 #include "ui/gl/gl_context.h" |
| 9 #include "ui/gl/gl_mock.h" |
| 10 |
| 11 namespace gpu { |
| 12 namespace gles2 { |
| 13 |
| 14 namespace { |
| 15 const uint32_t kMaxBindings = 16; |
| 16 const GLuint kBufferClientId = 87; |
| 17 const GLuint kBufferServiceId = 987; |
| 18 } // namespace anonymous |
| 19 |
| 20 class IndexedBufferBindingHostTest : public GpuServiceTest { |
| 21 public: |
| 22 IndexedBufferBindingHostTest() |
| 23 : host_(new IndexedBufferBindingHost(kMaxBindings)), |
| 24 buffer_manager_(new BufferManager(nullptr, nullptr)) { |
| 25 buffer_manager_->CreateBuffer(kBufferClientId, kBufferServiceId); |
| 26 buffer_ = buffer_manager_->GetBuffer(kBufferClientId); |
| 27 DCHECK(buffer_.get()); |
| 28 } |
| 29 |
| 30 ~IndexedBufferBindingHostTest() override {} |
| 31 |
| 32 protected: |
| 33 void SetUp() override { |
| 34 // Use 4.1 to trigger the BindBufferRange emulation. |
| 35 GpuServiceTest::SetUpWithGLVersion("4.1", ""); |
| 36 } |
| 37 |
| 38 void TearDown() override { |
| 39 host_->RemoveBoundBuffer(buffer_.get()); |
| 40 buffer_ = nullptr; |
| 41 buffer_manager_->Destroy(false); |
| 42 buffer_manager_.reset(); |
| 43 GpuServiceTest::TearDown(); |
| 44 } |
| 45 |
| 46 const gfx::GLVersionInfo& GetGLVersionInfo() { |
| 47 return *(GetGLContext()->GetVersionInfo()); |
| 48 } |
| 49 |
| 50 void SetBufferSize(GLenum target, GLsizeiptr size) { |
| 51 buffer_manager_->SetInfo( |
| 52 buffer_.get(), target, size, GL_STATIC_DRAW, false); |
| 53 } |
| 54 |
| 55 scoped_refptr<IndexedBufferBindingHost> host_; |
| 56 std::unique_ptr<BufferManager> buffer_manager_; |
| 57 scoped_refptr<Buffer> buffer_; |
| 58 }; |
| 59 |
| 60 TEST_F(IndexedBufferBindingHostTest, DoBindBufferRangeUninitializedBuffer) { |
| 61 const GLenum kTarget = GL_TRANSFORM_FEEDBACK_BUFFER; |
| 62 const GLuint kIndex = 2; |
| 63 const GLintptr kOffset = 4; |
| 64 const GLsizeiptr kSize = 8; |
| 65 |
| 66 EXPECT_CALL(*gl_, BindBufferBase(kTarget, kIndex, 0)) |
| 67 .Times(1) |
| 68 .RetiresOnSaturation(); |
| 69 EXPECT_CALL(*gl_, BindBuffer(kTarget, kBufferServiceId)) |
| 70 .Times(1) |
| 71 .RetiresOnSaturation(); |
| 72 |
| 73 host_->DoBindBufferRange( |
| 74 GetGLVersionInfo(), kTarget, kIndex, buffer_.get(), kOffset, kSize); |
| 75 |
| 76 for (uint32_t index = 0; index < kMaxBindings; ++index) { |
| 77 if (index != kIndex) { |
| 78 EXPECT_EQ(nullptr, host_->GetBufferBinding(index)); |
| 79 } else { |
| 80 EXPECT_EQ(buffer_.get(), host_->GetBufferBinding(index)); |
| 81 EXPECT_EQ(kSize, host_->GetBufferSize(index)); |
| 82 EXPECT_EQ(kOffset, host_->GetBufferStart(index)); |
| 83 } |
| 84 } |
| 85 } |
| 86 |
| 87 TEST_F(IndexedBufferBindingHostTest, DoBindBufferRangeBufferWithoutEnoughSize) { |
| 88 const GLenum kTarget = GL_TRANSFORM_FEEDBACK_BUFFER; |
| 89 const GLuint kIndex = 2; |
| 90 const GLintptr kOffset = 4; |
| 91 const GLsizeiptr kSize = 8; |
| 92 const GLsizeiptr kBufferSize = kOffset + kSize - 2; |
| 93 |
| 94 SetBufferSize(kTarget, kBufferSize); |
| 95 |
| 96 GLsizeiptr clamped_size = ((kBufferSize - kOffset) >> 2) << 2; |
| 97 |
| 98 EXPECT_CALL(*gl_, BindBufferRange(kTarget, kIndex, kBufferServiceId, kOffset, |
| 99 clamped_size)) |
| 100 .Times(1) |
| 101 .RetiresOnSaturation(); |
| 102 |
| 103 host_->DoBindBufferRange( |
| 104 GetGLVersionInfo(), kTarget, kIndex, buffer_.get(), kOffset, kSize); |
| 105 |
| 106 for (uint32_t index = 0; index < kMaxBindings; ++index) { |
| 107 if (index != kIndex) { |
| 108 EXPECT_EQ(nullptr, host_->GetBufferBinding(index)); |
| 109 } else { |
| 110 EXPECT_EQ(buffer_.get(), host_->GetBufferBinding(index)); |
| 111 EXPECT_EQ(kSize, host_->GetBufferSize(index)); |
| 112 EXPECT_EQ(kOffset, host_->GetBufferStart(index)); |
| 113 } |
| 114 } |
| 115 |
| 116 // Now adjust buffer size to be big enough. |
| 117 EXPECT_CALL(*gl_, BindBufferRange(kTarget, kIndex, kBufferServiceId, kOffset, |
| 118 kSize)) |
| 119 .Times(1) |
| 120 .RetiresOnSaturation(); |
| 121 |
| 122 SetBufferSize(kTarget, kOffset + kSize); |
| 123 host_->OnBufferData(GetGLVersionInfo(), kTarget, buffer_.get()); |
| 124 } |
| 125 |
| 126 } // namespace gles2 |
| 127 } // namespace gpu |
| 128 |
| 129 |
OLD | NEW |