| Index: gpu/command_buffer/client/gles2_implementation_unittest.cc
|
| diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
|
| index 33098d18c25bb21837346de39b8c52797b083c31..5ce2a8b52a9603273cc1bd7bc1bf9fa57b50cea2 100644
|
| --- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
|
| +++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
|
| @@ -188,8 +188,7 @@ struct Str7 {
|
| };
|
| #pragma pack(pop)
|
|
|
| -// Test fixture for CommandBufferHelper test.
|
| -class GLES2ImplementationTest : public testing::Test {
|
| +class GLES2CommandBufferTestBase : public testing::Test {
|
| protected:
|
| static const int32 kNumCommandEntries = 400;
|
| static const int32 kCommandBufferSizeBytes =
|
| @@ -198,6 +197,196 @@ class GLES2ImplementationTest : public testing::Test {
|
| static const int32 kTransferBufferId =
|
| GLES2MockCommandBufferHelper::kTransferBufferId;
|
| static const uint8 kInitialValue = 0xBD;
|
| +
|
| + GLES2CommandBufferTestBase()
|
| + : commands_(NULL),
|
| + token_(0),
|
| + offset_(0),
|
| + initial_offset_(0),
|
| + alignment_(0) {
|
| + }
|
| +
|
| + void SetupCommandBuffer(unsigned int offset, unsigned alignment) {
|
| + initial_offset_ = offset;
|
| + offset_ = offset;
|
| + alignment_ = alignment;
|
| +
|
| + command_buffer_.reset(new MockGLES2CommandBuffer());
|
| + command_buffer_->Initialize(kCommandBufferSizeBytes);
|
| +
|
| + EXPECT_EQ(kTransferBufferId,
|
| + command_buffer_->CreateTransferBuffer(kTransferBufferSize, -1));
|
| + transfer_buffer_ = command_buffer_->GetTransferBuffer(kTransferBufferId);
|
| + ClearTransferBuffer();
|
| +
|
| + helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
|
| + helper_->Initialize(kCommandBufferSizeBytes);
|
| + }
|
| +
|
| + const void* GetPut() {
|
| + return helper_->GetSpace(0);
|
| + }
|
| +
|
| + size_t MaxTransferBufferSize() {
|
| + return kTransferBufferSize - initial_offset_;
|
| + }
|
| +
|
| + void ClearCommands() {
|
| + Buffer ring_buffer = command_buffer_->GetRingBuffer();
|
| + memset(ring_buffer.ptr, kInitialValue, ring_buffer.size);
|
| + }
|
| +
|
| + bool NoCommandsWritten() {
|
| + return static_cast<const uint8*>(static_cast<const void*>(commands_))[0] ==
|
| + kInitialValue;
|
| + }
|
| +
|
| + void ClearTransferBuffer() {
|
| + memset(transfer_buffer_.ptr, kInitialValue, kTransferBufferSize);
|
| + }
|
| +
|
| + unsigned int RoundToAlignment(unsigned int size) {
|
| + return (size + alignment_ - 1) & ~(alignment_ - 1);
|
| + }
|
| +
|
| + int GetNextToken() {
|
| + return ++token_;
|
| + }
|
| +
|
| + uint32 AllocateTransferBuffer(size_t size) {
|
| + if (offset_ + size > kTransferBufferSize) {
|
| + offset_ = initial_offset_;
|
| + }
|
| + uint32 offset = offset_;
|
| + offset_ += RoundToAlignment(size);
|
| + return offset;
|
| + }
|
| +
|
| + void* GetTransferAddressFromOffset(uint32 offset, size_t size) {
|
| + EXPECT_LE(offset + size, transfer_buffer_.size);
|
| + return static_cast<int8*>(transfer_buffer_.ptr) + offset;
|
| + }
|
| +
|
| + template <typename T>
|
| + T* GetTransferAddressFromOffsetAs(uint32 offset, size_t size) {
|
| + return static_cast<T*>(GetTransferAddressFromOffset(offset, size));
|
| + }
|
| +
|
| + Buffer transfer_buffer_;
|
| + CommandBufferEntry* commands_;
|
| + scoped_ptr<MockGLES2CommandBuffer> command_buffer_;
|
| + scoped_ptr<GLES2CmdHelper> helper_;
|
| + int token_;
|
| + uint32 offset_;
|
| + uint32 initial_offset_;
|
| + uint32 alignment_;
|
| +};
|
| +
|
| +// GCC requires these declarations, but MSVC requires they not be present
|
| +#ifndef _MSC_VER
|
| +const int32 GLES2CommandBufferTestBase::kNumCommandEntries;
|
| +const int32 GLES2CommandBufferTestBase::kCommandBufferSizeBytes;
|
| +const size_t GLES2CommandBufferTestBase::kTransferBufferSize;
|
| +const int32 GLES2CommandBufferTestBase::kTransferBufferId;
|
| +const uint8 GLES2CommandBufferTestBase::kInitialValue;
|
| +#endif
|
| +
|
| +class TransferBufferTest : public GLES2CommandBufferTestBase {
|
| + protected:
|
| + static const unsigned int kStartingOffset = 64;
|
| + static const unsigned int kAlignment = 4;
|
| +
|
| + TransferBufferTest() { }
|
| +
|
| + virtual void SetUp() {
|
| + SetupCommandBuffer(
|
| + GLES2Implementation::kStartingOffset,
|
| + GLES2Implementation::kAlignment);
|
| +
|
| + transfer_buffer_.reset(new TransferBuffer(
|
| + helper_.get(),
|
| + kTransferBufferId,
|
| + GetTransferAddressFromOffset(0, 0),
|
| + kTransferBufferSize,
|
| + kStartingOffset,
|
| + kAlignment));
|
| + }
|
| +
|
| + virtual void TearDown() {
|
| + transfer_buffer_.reset();
|
| + }
|
| +
|
| + scoped_ptr<TransferBuffer> transfer_buffer_;
|
| +};
|
| +
|
| +// GCC requires these declarations, but MSVC requires they not be present
|
| +#ifndef _MSC_VER
|
| +const unsigned int TransferBufferTest::kStartingOffset;
|
| +const unsigned int TransferBufferTest::kAlignment;
|
| +#endif
|
| +
|
| +TEST_F(TransferBufferTest, Basic) {
|
| + EXPECT_TRUE(transfer_buffer_->HaveBuffer());
|
| + EXPECT_EQ(kTransferBufferId, transfer_buffer_->GetShmId());
|
| +}
|
| +
|
| +TEST_F(TransferBufferTest, Free) {
|
| + EXPECT_TRUE(transfer_buffer_->HaveBuffer());
|
| +
|
| + // Free buffer.
|
| + EXPECT_CALL(*command_buffer_, DestroyTransferBuffer(_))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + transfer_buffer_->Free();
|
| + // See it's freed.
|
| + EXPECT_FALSE(transfer_buffer_->HaveBuffer());
|
| + // See that it gets reallocated.
|
| + EXPECT_EQ(kTransferBufferId, transfer_buffer_->GetShmId());
|
| + EXPECT_TRUE(transfer_buffer_->HaveBuffer());
|
| +
|
| + // Free buffer.
|
| + EXPECT_CALL(*command_buffer_, DestroyTransferBuffer(_))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + transfer_buffer_->Free();
|
| + // See it's freed.
|
| + EXPECT_FALSE(transfer_buffer_->HaveBuffer());
|
| + // See that it gets reallocated.
|
| + EXPECT_TRUE(transfer_buffer_->GetResultBuffer() != NULL);
|
| + EXPECT_TRUE(transfer_buffer_->HaveBuffer());
|
| +
|
| + // Free buffer.
|
| + EXPECT_CALL(*command_buffer_, DestroyTransferBuffer(_))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + transfer_buffer_->Free();
|
| + // See it's freed.
|
| + EXPECT_FALSE(transfer_buffer_->HaveBuffer());
|
| + // See that it gets reallocated.
|
| + EXPECT_TRUE(transfer_buffer_->GetBuffer() != NULL);
|
| + EXPECT_TRUE(transfer_buffer_->HaveBuffer());
|
| +
|
| + // Free buffer.
|
| + EXPECT_CALL(*command_buffer_, DestroyTransferBuffer(_))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + transfer_buffer_->Free();
|
| + // See it's freed.
|
| + EXPECT_FALSE(transfer_buffer_->HaveBuffer());
|
| + // See that it gets reallocated.
|
| + transfer_buffer_->GetResultOffset();
|
| + EXPECT_TRUE(transfer_buffer_->HaveBuffer());
|
| +
|
| + // Test freeing twice.
|
| + EXPECT_CALL(*command_buffer_, DestroyTransferBuffer(_))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + transfer_buffer_->Free();
|
| + transfer_buffer_->Free();
|
| +}
|
| +
|
| +class GLES2ImplementationTest : public GLES2CommandBufferTestBase {
|
| + protected:
|
| static const GLint kMaxCombinedTextureImageUnits = 8;
|
| static const GLint kMaxCubeMapTextureSize = 64;
|
| static const GLint kMaxFragmentUniformVectors = 16;
|
| @@ -212,11 +401,7 @@ class GLES2ImplementationTest : public testing::Test {
|
| static const GLint kNumShaderBinaryFormats = 0;
|
| static const GLuint kStartId = 1024;
|
|
|
| - GLES2ImplementationTest()
|
| - : commands_(NULL),
|
| - token_(0),
|
| - offset_(0) {
|
| - }
|
| + GLES2ImplementationTest() { }
|
|
|
| virtual void SetUp() {
|
| Initialize(false, true);
|
| @@ -226,18 +411,9 @@ class GLES2ImplementationTest : public testing::Test {
|
| }
|
|
|
| void Initialize(bool shared_resources, bool bind_generates_resource) {
|
| - offset_ = GLES2Implementation::kStartingOffset;
|
| -
|
| - command_buffer_.reset(new MockGLES2CommandBuffer());
|
| - command_buffer_->Initialize(kCommandBufferSizeBytes);
|
| -
|
| - EXPECT_EQ(kTransferBufferId,
|
| - command_buffer_->CreateTransferBuffer(kTransferBufferSize, -1));
|
| - transfer_buffer_ = command_buffer_->GetTransferBuffer(kTransferBufferId);
|
| - ClearTransferBuffer();
|
| -
|
| - helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
|
| - helper_->Initialize(kCommandBufferSizeBytes);
|
| + SetupCommandBuffer(
|
| + GLES2Implementation::kStartingOffset,
|
| + GLES2Implementation::kAlignment);
|
|
|
| GLES2Implementation::GLState state;
|
| state.max_combined_texture_image_units = kMaxCombinedTextureImageUnits;
|
| @@ -312,64 +488,8 @@ class GLES2ImplementationTest : public testing::Test {
|
| ClearCommands();
|
| }
|
|
|
| - const void* GetPut() {
|
| - return helper_->GetSpace(0);
|
| - }
|
| -
|
| - size_t MaxTransferBufferSize() {
|
| - return kTransferBufferSize - GLES2Implementation::kStartingOffset;
|
| - }
|
| -
|
| - void ClearCommands() {
|
| - Buffer ring_buffer = command_buffer_->GetRingBuffer();
|
| - memset(ring_buffer.ptr, kInitialValue, ring_buffer.size);
|
| - }
|
| -
|
| - bool NoCommandsWritten() {
|
| - return static_cast<const uint8*>(static_cast<const void*>(commands_))[0] ==
|
| - kInitialValue;
|
| - }
|
| -
|
| - void ClearTransferBuffer() {
|
| - memset(transfer_buffer_.ptr, kInitialValue, kTransferBufferSize);
|
| - }
|
| -
|
| - static unsigned int RoundToAlignment(unsigned int size) {
|
| - return (size + GLES2Implementation::kAlignment - 1) &
|
| - ~(GLES2Implementation::kAlignment - 1);
|
| - }
|
| -
|
| - int GetNextToken() {
|
| - return ++token_;
|
| - }
|
| -
|
| - uint32 AllocateTransferBuffer(size_t size) {
|
| - if (offset_ + size > kTransferBufferSize) {
|
| - offset_ = GLES2Implementation::kStartingOffset;
|
| - }
|
| - uint32 offset = offset_;
|
| - offset_ += RoundToAlignment(size);
|
| - return offset;
|
| - }
|
| -
|
| - void* GetTransferAddressFromOffset(uint32 offset, size_t size) {
|
| - EXPECT_LE(offset + size, transfer_buffer_.size);
|
| - return static_cast<int8*>(transfer_buffer_.ptr) + offset;
|
| - }
|
| -
|
| - template <typename T>
|
| - T* GetTransferAddressFromOffsetAs(uint32 offset, size_t size) {
|
| - return static_cast<T*>(GetTransferAddressFromOffset(offset, size));
|
| - }
|
| -
|
| - Buffer transfer_buffer_;
|
| - CommandBufferEntry* commands_;
|
| - scoped_ptr<MockGLES2CommandBuffer> command_buffer_;
|
| - scoped_ptr<GLES2CmdHelper> helper_;
|
| Sequence sequence_;
|
| scoped_ptr<GLES2Implementation> gl_;
|
| - int token_;
|
| - uint32 offset_;
|
| };
|
|
|
| class GLES2ImplementationStrictSharedTest : public GLES2ImplementationTest {
|
| @@ -379,11 +499,6 @@ class GLES2ImplementationStrictSharedTest : public GLES2ImplementationTest {
|
| }
|
| };
|
|
|
| -// GCC requires these declarations, but MSVC requires they not be present
|
| -#ifndef _MSC_VER
|
| -const int32 GLES2ImplementationTest::kTransferBufferId;
|
| -#endif
|
| -
|
| TEST_F(GLES2ImplementationTest, ShaderSource) {
|
| const uint32 kBucketId = 1; // This id is hardcoded into GLES2Implemenation
|
| const GLuint kShaderId = 456;
|
| @@ -950,7 +1065,7 @@ TEST_F(GLES2ImplementationTest, FreeUnusedSharedMemory) {
|
| kTarget, kOffset, kSize, GL_WRITE_ONLY);
|
| ASSERT_TRUE(mem != NULL);
|
| gl_->UnmapBufferSubDataCHROMIUM(mem);
|
| - EXPECT_CALL(*command_buffer_, DestroyTransferBuffer(_))\
|
| + EXPECT_CALL(*command_buffer_, DestroyTransferBuffer(_))
|
| .Times(1)
|
| .RetiresOnSaturation();
|
| gl_->FreeUnusedSharedMemory();
|
|
|