Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1132)

Unified Diff: gpu/command_buffer/client/gles2_implementation_unittest.cc

Issue 8536045: Make command buffer free transfer buffer when switching tabs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation_autogen.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation_autogen.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698