| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Tests for GLES2Implementation. | 5 // Tests for GLES2Implementation. |
| 6 | 6 |
| 7 #include "gpu/command_buffer/client/gles2_implementation.h" | 7 #include "gpu/command_buffer/client/gles2_implementation.h" |
| 8 | 8 |
| 9 #include <limits> |
| 10 |
| 9 #include <GLES2/gl2ext.h> | 11 #include <GLES2/gl2ext.h> |
| 10 #include <GLES2/gl2extchromium.h> | 12 #include <GLES2/gl2extchromium.h> |
| 11 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
| 12 #include "gpu/command_buffer/client/client_test_helper.h" | 14 #include "gpu/command_buffer/client/client_test_helper.h" |
| 13 #include "gpu/command_buffer/client/program_info_manager.h" | 15 #include "gpu/command_buffer/client/program_info_manager.h" |
| 14 #include "gpu/command_buffer/client/transfer_buffer.h" | 16 #include "gpu/command_buffer/client/transfer_buffer.h" |
| 15 #include "gpu/command_buffer/common/command_buffer.h" | 17 #include "gpu/command_buffer/common/command_buffer.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 17 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" |
| 18 | 20 |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 static const GLuint kTexturesStartId = 1; | 385 static const GLuint kTexturesStartId = 1; |
| 384 static const GLuint kQueriesStartId = 1; | 386 static const GLuint kQueriesStartId = 1; |
| 385 static const GLuint kVertexArraysStartId = 1; | 387 static const GLuint kVertexArraysStartId = 1; |
| 386 | 388 |
| 387 typedef MockTransferBuffer::ExpectedMemoryInfo ExpectedMemoryInfo; | 389 typedef MockTransferBuffer::ExpectedMemoryInfo ExpectedMemoryInfo; |
| 388 | 390 |
| 389 class TestContext { | 391 class TestContext { |
| 390 public: | 392 public: |
| 391 TestContext() : commands_(NULL), token_(0) {} | 393 TestContext() : commands_(NULL), token_(0) {} |
| 392 | 394 |
| 393 void Initialize(ShareGroup* share_group, bool bind_generates_resource) { | 395 void Initialize(ShareGroup* share_group, |
| 396 bool bind_generates_resource, |
| 397 bool lose_context_when_out_of_memory) { |
| 394 command_buffer_.reset(new StrictMock<MockClientCommandBuffer>()); | 398 command_buffer_.reset(new StrictMock<MockClientCommandBuffer>()); |
| 395 ASSERT_TRUE(command_buffer_->Initialize()); | 399 ASSERT_TRUE(command_buffer_->Initialize()); |
| 396 | 400 |
| 397 transfer_buffer_.reset( | 401 transfer_buffer_.reset( |
| 398 new MockTransferBuffer(command_buffer_.get(), | 402 new MockTransferBuffer(command_buffer_.get(), |
| 399 kTransferBufferSize, | 403 kTransferBufferSize, |
| 400 GLES2Implementation::kStartingOffset, | 404 GLES2Implementation::kStartingOffset, |
| 401 GLES2Implementation::kAlignment)); | 405 GLES2Implementation::kAlignment)); |
| 402 | 406 |
| 403 helper_.reset(new GLES2CmdHelper(command_buffer())); | 407 helper_.reset(new GLES2CmdHelper(command_buffer())); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 432 sizeof(cmds::GetShaderPrecisionFormat::Result) * 12); | 436 sizeof(cmds::GetShaderPrecisionFormat::Result) * 12); |
| 433 | 437 |
| 434 { | 438 { |
| 435 InSequence sequence; | 439 InSequence sequence; |
| 436 | 440 |
| 437 EXPECT_CALL(*command_buffer_, OnFlush()) | 441 EXPECT_CALL(*command_buffer_, OnFlush()) |
| 438 .WillOnce(SetMemory(mem1.ptr + sizeof(int_state), int_state)) | 442 .WillOnce(SetMemory(mem1.ptr + sizeof(int_state), int_state)) |
| 439 .RetiresOnSaturation(); | 443 .RetiresOnSaturation(); |
| 440 GetNextToken(); // eat the token that starting up will use. | 444 GetNextToken(); // eat the token that starting up will use. |
| 441 | 445 |
| 442 gl_.reset( | 446 gl_.reset(new GLES2Implementation(helper_.get(), |
| 443 new GLES2Implementation(helper_.get(), | 447 share_group, |
| 444 share_group, | 448 transfer_buffer_.get(), |
| 445 transfer_buffer_.get(), | 449 bind_generates_resource, |
| 446 bind_generates_resource, | 450 lose_context_when_out_of_memory, |
| 447 gpu_control_.get())); | 451 gpu_control_.get())); |
| 448 ASSERT_TRUE(gl_->Initialize(kTransferBufferSize, | 452 ASSERT_TRUE(gl_->Initialize(kTransferBufferSize, |
| 449 kTransferBufferSize, | 453 kTransferBufferSize, |
| 450 kTransferBufferSize, | 454 kTransferBufferSize, |
| 451 GLES2Implementation::kNoLimit)); | 455 GLES2Implementation::kNoLimit)); |
| 452 } | 456 } |
| 453 | 457 |
| 454 EXPECT_CALL(*command_buffer_, OnFlush()).Times(1).RetiresOnSaturation(); | 458 EXPECT_CALL(*command_buffer_, OnFlush()).Times(1).RetiresOnSaturation(); |
| 455 helper_->CommandBufferHelper::Finish(); | 459 helper_->CommandBufferHelper::Finish(); |
| 456 ::testing::Mock::VerifyAndClearExpectations(gl_.get()); | 460 ::testing::Mock::VerifyAndClearExpectations(gl_.get()); |
| 457 | 461 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 return false; | 511 return false; |
| 508 } | 512 } |
| 509 } | 513 } |
| 510 return true; | 514 return true; |
| 511 } | 515 } |
| 512 | 516 |
| 513 QueryTracker::Query* GetQuery(GLuint id) { | 517 QueryTracker::Query* GetQuery(GLuint id) { |
| 514 return gl_->query_tracker_->GetQuery(id); | 518 return gl_->query_tracker_->GetQuery(id); |
| 515 } | 519 } |
| 516 | 520 |
| 517 void Initialize(bool bind_generates_resource) { | 521 void Initialize(bool bind_generates_resource, |
| 522 bool lose_context_when_out_of_memory) { |
| 518 share_group_ = new ShareGroup(bind_generates_resource); | 523 share_group_ = new ShareGroup(bind_generates_resource); |
| 519 | 524 |
| 520 for (int i = 0; i < kNumTestContexts; i++) | 525 for (int i = 0; i < kNumTestContexts; i++) |
| 521 test_contexts_[i].Initialize(share_group_.get(), bind_generates_resource); | 526 test_contexts_[i].Initialize(share_group_.get(), |
| 527 bind_generates_resource, |
| 528 lose_context_when_out_of_memory); |
| 522 | 529 |
| 523 // Default to test context 0. | 530 // Default to test context 0. |
| 524 gpu_control_ = test_contexts_[0].gpu_control_.get(); | 531 gpu_control_ = test_contexts_[0].gpu_control_.get(); |
| 525 helper_ = test_contexts_[0].helper_.get(); | 532 helper_ = test_contexts_[0].helper_.get(); |
| 526 transfer_buffer_ = test_contexts_[0].transfer_buffer_.get(); | 533 transfer_buffer_ = test_contexts_[0].transfer_buffer_.get(); |
| 527 gl_ = test_contexts_[0].gl_.get(); | 534 gl_ = test_contexts_[0].gl_.get(); |
| 528 commands_ = test_contexts_[0].commands_; | 535 commands_ = test_contexts_[0].commands_; |
| 529 } | 536 } |
| 530 | 537 |
| 531 MockClientCommandBuffer* command_buffer() const { | 538 MockClientCommandBuffer* command_buffer() const { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 | 585 |
| 579 scoped_refptr<ShareGroup> share_group_; | 586 scoped_refptr<ShareGroup> share_group_; |
| 580 MockClientGpuControl* gpu_control_; | 587 MockClientGpuControl* gpu_control_; |
| 581 GLES2CmdHelper* helper_; | 588 GLES2CmdHelper* helper_; |
| 582 MockTransferBuffer* transfer_buffer_; | 589 MockTransferBuffer* transfer_buffer_; |
| 583 GLES2Implementation* gl_; | 590 GLES2Implementation* gl_; |
| 584 CommandBufferEntry* commands_; | 591 CommandBufferEntry* commands_; |
| 585 }; | 592 }; |
| 586 | 593 |
| 587 void GLES2ImplementationTest::SetUp() { | 594 void GLES2ImplementationTest::SetUp() { |
| 588 Initialize(true); | 595 bool bind_generates_resource = true; |
| 596 bool lose_context_when_out_of_memory = false; |
| 597 Initialize(bind_generates_resource, lose_context_when_out_of_memory); |
| 589 } | 598 } |
| 590 | 599 |
| 591 void GLES2ImplementationTest::TearDown() { | 600 void GLES2ImplementationTest::TearDown() { |
| 592 for (int i = 0; i < kNumTestContexts; i++) | 601 for (int i = 0; i < kNumTestContexts; i++) |
| 593 test_contexts_[i].TearDown(); | 602 test_contexts_[i].TearDown(); |
| 594 } | 603 } |
| 595 | 604 |
| 605 class GLES2ImplementationManualInitTest : public GLES2ImplementationTest { |
| 606 protected: |
| 607 virtual void SetUp() OVERRIDE {} |
| 608 }; |
| 609 |
| 596 class GLES2ImplementationStrictSharedTest : public GLES2ImplementationTest { | 610 class GLES2ImplementationStrictSharedTest : public GLES2ImplementationTest { |
| 597 protected: | 611 protected: |
| 598 virtual void SetUp() OVERRIDE; | 612 virtual void SetUp() OVERRIDE; |
| 599 | 613 |
| 600 template <class ResApi> | 614 template <class ResApi> |
| 601 void FlushGenerationTest() { | 615 void FlushGenerationTest() { |
| 602 GLuint id1, id2, id3; | 616 GLuint id1, id2, id3; |
| 603 | 617 |
| 604 // Generate valid id. | 618 // Generate valid id. |
| 605 ResApi::Gen(gl_, 1, &id1); | 619 ResApi::Gen(gl_, 1, &id1); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 676 EXPECT_NE(id1, id3); | 690 EXPECT_NE(id1, id3); |
| 677 | 691 |
| 678 // Lazy release triggered by another Delete. Should reuse id1. | 692 // Lazy release triggered by another Delete. Should reuse id1. |
| 679 ResApi::Delete(gl1, 1, &id2); | 693 ResApi::Delete(gl1, 1, &id2); |
| 680 ResApi::Gen(gl2, 1, &id3); | 694 ResApi::Gen(gl2, 1, &id3); |
| 681 EXPECT_EQ(id1, id3); | 695 EXPECT_EQ(id1, id3); |
| 682 } | 696 } |
| 683 }; | 697 }; |
| 684 | 698 |
| 685 void GLES2ImplementationStrictSharedTest::SetUp() { | 699 void GLES2ImplementationStrictSharedTest::SetUp() { |
| 686 Initialize(false); | 700 bool bind_generates_resource = false; |
| 701 bool lose_context_when_out_of_memory = false; |
| 702 Initialize(bind_generates_resource, lose_context_when_out_of_memory); |
| 687 } | 703 } |
| 688 | 704 |
| 689 // GCC requires these declarations, but MSVC requires they not be present | 705 // GCC requires these declarations, but MSVC requires they not be present |
| 690 #ifndef _MSC_VER | 706 #ifndef _MSC_VER |
| 691 const uint8 GLES2ImplementationTest::kInitialValue; | 707 const uint8 GLES2ImplementationTest::kInitialValue; |
| 692 const int32 GLES2ImplementationTest::kNumCommandEntries; | 708 const int32 GLES2ImplementationTest::kNumCommandEntries; |
| 693 const int32 GLES2ImplementationTest::kCommandBufferSizeBytes; | 709 const int32 GLES2ImplementationTest::kCommandBufferSizeBytes; |
| 694 const size_t GLES2ImplementationTest::kTransferBufferSize; | 710 const size_t GLES2ImplementationTest::kTransferBufferSize; |
| 695 const GLint GLES2ImplementationTest::kMaxCombinedTextureImageUnits; | 711 const GLint GLES2ImplementationTest::kMaxCombinedTextureImageUnits; |
| 696 const GLint GLES2ImplementationTest::kMaxCubeMapTextureSize; | 712 const GLint GLES2ImplementationTest::kMaxCubeMapTextureSize; |
| (...skipping 2396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3093 GLbyte data[64]; | 3109 GLbyte data[64]; |
| 3094 }; | 3110 }; |
| 3095 | 3111 |
| 3096 Mailbox mailbox = Mailbox::Generate(); | 3112 Mailbox mailbox = Mailbox::Generate(); |
| 3097 Cmds expected; | 3113 Cmds expected; |
| 3098 expected.cmd.Init(GL_TEXTURE_2D, mailbox.name); | 3114 expected.cmd.Init(GL_TEXTURE_2D, mailbox.name); |
| 3099 gl_->ProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); | 3115 gl_->ProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
| 3100 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 3116 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
| 3101 } | 3117 } |
| 3102 | 3118 |
| 3119 TEST_F(GLES2ImplementationManualInitTest, LoseContextOnOOM) { |
| 3120 bool bind_generates_resource = false; |
| 3121 bool lose_context_when_out_of_memory = true; |
| 3122 Initialize(bind_generates_resource, lose_context_when_out_of_memory); |
| 3123 |
| 3124 struct Cmds { |
| 3125 cmds::LoseContextCHROMIUM cmd; |
| 3126 }; |
| 3127 |
| 3128 GLsizei max = std::numeric_limits<GLsizei>::max(); |
| 3129 EXPECT_CALL(*gpu_control_, CreateGpuMemoryBuffer(max, max, _, _)) |
| 3130 .WillOnce(Return(static_cast<gfx::GpuMemoryBuffer*>(NULL))); |
| 3131 gl_->CreateImageCHROMIUM(max, max, 0); |
| 3132 // The context should be lost. |
| 3133 Cmds expected; |
| 3134 expected.cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_UNKNOWN_CONTEXT_RESET_ARB); |
| 3135 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
| 3136 } |
| 3137 |
| 3138 TEST_F(GLES2ImplementationManualInitTest, NoLoseContextOnOOM) { |
| 3139 bool bind_generates_resource = false; |
| 3140 bool lose_context_when_out_of_memory = false; |
| 3141 Initialize(bind_generates_resource, lose_context_when_out_of_memory); |
| 3142 |
| 3143 struct Cmds { |
| 3144 cmds::LoseContextCHROMIUM cmd; |
| 3145 }; |
| 3146 |
| 3147 GLsizei max = std::numeric_limits<GLsizei>::max(); |
| 3148 EXPECT_CALL(*gpu_control_, CreateGpuMemoryBuffer(max, max, _, _)) |
| 3149 .WillOnce(Return(static_cast<gfx::GpuMemoryBuffer*>(NULL))); |
| 3150 gl_->CreateImageCHROMIUM(max, max, 0); |
| 3151 // The context should not be lost. |
| 3152 EXPECT_TRUE(NoCommandsWritten()); |
| 3153 } |
| 3154 |
| 3103 #include "gpu/command_buffer/client/gles2_implementation_unittest_autogen.h" | 3155 #include "gpu/command_buffer/client/gles2_implementation_unittest_autogen.h" |
| 3104 | 3156 |
| 3105 } // namespace gles2 | 3157 } // namespace gles2 |
| 3106 } // namespace gpu | 3158 } // namespace gpu |
| OLD | NEW |