| 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 aa9073388dca4e0e228b3374d19c9dd954701e26..f57d07a8ded8be41387f469e42477697ed149271 100644
|
| --- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
|
| +++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
|
| @@ -6,6 +6,8 @@
|
|
|
| #include "gpu/command_buffer/client/gles2_implementation.h"
|
|
|
| +#include <limits>
|
| +
|
| #include <GLES2/gl2ext.h>
|
| #include <GLES2/gl2extchromium.h>
|
| #include "base/compiler_specific.h"
|
| @@ -390,7 +392,9 @@ class GLES2ImplementationTest : public testing::Test {
|
| public:
|
| TestContext() : commands_(NULL), token_(0) {}
|
|
|
| - void Initialize(ShareGroup* share_group, bool bind_generates_resource) {
|
| + void Initialize(ShareGroup* share_group,
|
| + bool bind_generates_resource,
|
| + bool lose_context_when_out_of_memory) {
|
| command_buffer_.reset(new StrictMock<MockClientCommandBuffer>());
|
| ASSERT_TRUE(command_buffer_->Initialize());
|
|
|
| @@ -439,12 +443,12 @@ class GLES2ImplementationTest : public testing::Test {
|
| .RetiresOnSaturation();
|
| GetNextToken(); // eat the token that starting up will use.
|
|
|
| - gl_.reset(
|
| - new GLES2Implementation(helper_.get(),
|
| - share_group,
|
| - transfer_buffer_.get(),
|
| - bind_generates_resource,
|
| - gpu_control_.get()));
|
| + gl_.reset(new GLES2Implementation(helper_.get(),
|
| + share_group,
|
| + transfer_buffer_.get(),
|
| + bind_generates_resource,
|
| + lose_context_when_out_of_memory,
|
| + gpu_control_.get()));
|
| ASSERT_TRUE(gl_->Initialize(kTransferBufferSize,
|
| kTransferBufferSize,
|
| kTransferBufferSize,
|
| @@ -514,11 +518,14 @@ class GLES2ImplementationTest : public testing::Test {
|
| return gl_->query_tracker_->GetQuery(id);
|
| }
|
|
|
| - void Initialize(bool bind_generates_resource) {
|
| + void Initialize(bool bind_generates_resource,
|
| + bool lose_context_when_out_of_memory) {
|
| share_group_ = new ShareGroup(bind_generates_resource);
|
|
|
| for (int i = 0; i < kNumTestContexts; i++)
|
| - test_contexts_[i].Initialize(share_group_.get(), bind_generates_resource);
|
| + test_contexts_[i].Initialize(share_group_.get(),
|
| + bind_generates_resource,
|
| + lose_context_when_out_of_memory);
|
|
|
| // Default to test context 0.
|
| gpu_control_ = test_contexts_[0].gpu_control_.get();
|
| @@ -585,7 +592,9 @@ class GLES2ImplementationTest : public testing::Test {
|
| };
|
|
|
| void GLES2ImplementationTest::SetUp() {
|
| - Initialize(true);
|
| + bool bind_generates_resource = true;
|
| + bool lose_context_when_out_of_memory = false;
|
| + Initialize(bind_generates_resource, lose_context_when_out_of_memory);
|
| }
|
|
|
| void GLES2ImplementationTest::TearDown() {
|
| @@ -593,6 +602,11 @@ void GLES2ImplementationTest::TearDown() {
|
| test_contexts_[i].TearDown();
|
| }
|
|
|
| +class GLES2ImplementationManualInitTest : public GLES2ImplementationTest {
|
| + protected:
|
| + virtual void SetUp() OVERRIDE {}
|
| +};
|
| +
|
| class GLES2ImplementationStrictSharedTest : public GLES2ImplementationTest {
|
| protected:
|
| virtual void SetUp() OVERRIDE;
|
| @@ -683,7 +697,9 @@ class GLES2ImplementationStrictSharedTest : public GLES2ImplementationTest {
|
| };
|
|
|
| void GLES2ImplementationStrictSharedTest::SetUp() {
|
| - Initialize(false);
|
| + bool bind_generates_resource = false;
|
| + bool lose_context_when_out_of_memory = false;
|
| + Initialize(bind_generates_resource, lose_context_when_out_of_memory);
|
| }
|
|
|
| // GCC requires these declarations, but MSVC requires they not be present
|
| @@ -3100,6 +3116,42 @@ TEST_F(GLES2ImplementationTest, ProduceTextureCHROMIUM) {
|
| EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
|
| }
|
|
|
| +TEST_F(GLES2ImplementationManualInitTest, LoseContextOnOOM) {
|
| + bool bind_generates_resource = false;
|
| + bool lose_context_when_out_of_memory = true;
|
| + Initialize(bind_generates_resource, lose_context_when_out_of_memory);
|
| +
|
| + struct Cmds {
|
| + cmds::LoseContextCHROMIUM cmd;
|
| + };
|
| +
|
| + GLsizei max = std::numeric_limits<GLsizei>::max();
|
| + EXPECT_CALL(*gpu_control_, CreateGpuMemoryBuffer(max, max, _, _))
|
| + .WillOnce(Return(static_cast<gfx::GpuMemoryBuffer*>(NULL)));
|
| + gl_->CreateImageCHROMIUM(max, max, 0);
|
| + // The context should be lost.
|
| + Cmds expected;
|
| + expected.cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_UNKNOWN_CONTEXT_RESET_ARB);
|
| + EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
|
| +}
|
| +
|
| +TEST_F(GLES2ImplementationManualInitTest, NoLoseContextOnOOM) {
|
| + bool bind_generates_resource = false;
|
| + bool lose_context_when_out_of_memory = false;
|
| + Initialize(bind_generates_resource, lose_context_when_out_of_memory);
|
| +
|
| + struct Cmds {
|
| + cmds::LoseContextCHROMIUM cmd;
|
| + };
|
| +
|
| + GLsizei max = std::numeric_limits<GLsizei>::max();
|
| + EXPECT_CALL(*gpu_control_, CreateGpuMemoryBuffer(max, max, _, _))
|
| + .WillOnce(Return(static_cast<gfx::GpuMemoryBuffer*>(NULL)));
|
| + gl_->CreateImageCHROMIUM(max, max, 0);
|
| + // The context should not be lost.
|
| + EXPECT_TRUE(NoCommandsWritten());
|
| +}
|
| +
|
| #include "gpu/command_buffer/client/gles2_implementation_unittest_autogen.h"
|
|
|
| } // namespace gles2
|
|
|