| 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 #include "gpu/command_buffer/service/query_manager.h" | 5 #include "gpu/command_buffer/service/query_manager.h" |
| 6 #include "gpu/command_buffer/common/gl_mock.h" | 6 #include "gpu/command_buffer/common/gl_mock.h" |
| 7 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 7 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
| 8 #include "gpu/command_buffer/service/cmd_buffer_engine.h" | 8 #include "gpu/command_buffer/service/cmd_buffer_engine.h" |
| 9 #include "gpu/command_buffer/service/common_decoder.h" | 9 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 10 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" |
| 10 #include "gpu/command_buffer/service/feature_info.h" | 11 #include "gpu/command_buffer/service/feature_info.h" |
| 11 #include "gpu/command_buffer/service/test_helper.h" | 12 #include "gpu/command_buffer/service/test_helper.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 14 |
| 14 using ::testing::_; | 15 using ::testing::_; |
| 15 using ::testing::InSequence; | 16 using ::testing::InSequence; |
| 17 using ::testing::Return; |
| 16 using ::testing::SetArgumentPointee; | 18 using ::testing::SetArgumentPointee; |
| 17 | 19 |
| 18 namespace gpu { | 20 namespace gpu { |
| 19 namespace gles2 { | 21 namespace gles2 { |
| 20 | 22 |
| 21 class MockDecoder : public CommonDecoder { | |
| 22 public: | |
| 23 virtual ~MockDecoder() { } | |
| 24 MOCK_METHOD3(DoCommand, error::Error( | |
| 25 unsigned int command, | |
| 26 unsigned int arg_count, | |
| 27 const void* cmd_data)); | |
| 28 MOCK_CONST_METHOD1(GetCommandName, const char* (unsigned int command_id)); | |
| 29 }; | |
| 30 | |
| 31 class QueryManagerTest : public testing::Test { | 23 class QueryManagerTest : public testing::Test { |
| 32 public: | 24 public: |
| 33 static const int32 kSharedMemoryId = 401; | 25 static const int32 kSharedMemoryId = 401; |
| 34 static const size_t kSharedBufferSize = 2048; | 26 static const size_t kSharedBufferSize = 2048; |
| 35 static const uint32 kSharedMemoryOffset = 132; | 27 static const uint32 kSharedMemoryOffset = 132; |
| 36 static const int32 kInvalidSharedMemoryId = 402; | 28 static const int32 kInvalidSharedMemoryId = 402; |
| 37 static const uint32 kInvalidSharedMemoryOffset = kSharedBufferSize + 1; | 29 static const uint32 kInvalidSharedMemoryOffset = kSharedBufferSize + 1; |
| 38 static const uint32 kInitialResult = 0xBDBDBDBDu; | 30 static const uint32 kInitialResult = 0xBDBDBDBDu; |
| 39 static const uint8 kInitialMemoryValue = 0xBDu; | 31 static const uint8 kInitialMemoryValue = 0xBDu; |
| 40 | 32 |
| 41 QueryManagerTest() { | 33 QueryManagerTest() { |
| 42 } | 34 } |
| 43 ~QueryManagerTest() { | 35 ~QueryManagerTest() { |
| 44 } | 36 } |
| 45 | 37 |
| 46 protected: | 38 protected: |
| 47 virtual void SetUp() { | 39 virtual void SetUp() { |
| 48 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); | 40 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); |
| 49 ::gfx::GLInterface::SetGLInterface(gl_.get()); | 41 ::gfx::GLInterface::SetGLInterface(gl_.get()); |
| 50 engine_.reset(new MockCommandBufferEngine()); | 42 engine_.reset(new MockCommandBufferEngine()); |
| 51 decoder_.reset(new MockDecoder()); | 43 decoder_.reset(new MockGLES2Decoder()); |
| 52 decoder_->set_engine(engine_.get()); | 44 decoder_->set_engine(engine_.get()); |
| 53 TestHelper::SetupFeatureInfoInitExpectations( | 45 TestHelper::SetupFeatureInfoInitExpectations( |
| 54 gl_.get(), | 46 gl_.get(), |
| 55 "GL_EXT_occlusion_query_boolean"); | 47 "GL_EXT_occlusion_query_boolean"); |
| 56 FeatureInfo::Ref feature_info(new FeatureInfo()); | 48 FeatureInfo::Ref feature_info(new FeatureInfo()); |
| 57 feature_info->Initialize("*"); | 49 feature_info->Initialize("*"); |
| 58 manager_.reset(new QueryManager(decoder_.get(), feature_info.get())); | 50 manager_.reset(new QueryManager(decoder_.get(), feature_info.get())); |
| 59 } | 51 } |
| 60 | 52 |
| 61 virtual void TearDown() { | 53 virtual void TearDown() { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 83 .RetiresOnSaturation(); | 75 .RetiresOnSaturation(); |
| 84 EXPECT_CALL(*gl_, EndQueryARB(query->target())) | 76 EXPECT_CALL(*gl_, EndQueryARB(query->target())) |
| 85 .Times(1) | 77 .Times(1) |
| 86 .RetiresOnSaturation(); | 78 .RetiresOnSaturation(); |
| 87 EXPECT_TRUE(manager_->BeginQuery(query)); | 79 EXPECT_TRUE(manager_->BeginQuery(query)); |
| 88 EXPECT_TRUE(manager_->EndQuery(query, submit_count)); | 80 EXPECT_TRUE(manager_->EndQuery(query, submit_count)); |
| 89 } | 81 } |
| 90 | 82 |
| 91 // Use StrictMock to make 100% sure we know how GL will be called. | 83 // Use StrictMock to make 100% sure we know how GL will be called. |
| 92 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; | 84 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; |
| 93 scoped_ptr<MockDecoder> decoder_; | 85 scoped_ptr<MockGLES2Decoder> decoder_; |
| 94 scoped_ptr<QueryManager> manager_; | 86 scoped_ptr<QueryManager> manager_; |
| 95 | 87 |
| 96 private: | 88 private: |
| 97 class MockCommandBufferEngine : public CommandBufferEngine { | 89 class MockCommandBufferEngine : public CommandBufferEngine { |
| 98 public: | 90 public: |
| 99 MockCommandBufferEngine() { | 91 MockCommandBufferEngine() { |
| 100 data_.reset(new int8[kSharedBufferSize]); | 92 data_.reset(new int8[kSharedBufferSize]); |
| 101 ClearSharedMemory(); | 93 ClearSharedMemory(); |
| 102 valid_buffer_.ptr = data_.get(); | 94 valid_buffer_.ptr = data_.get(); |
| 103 valid_buffer_.size = kSharedBufferSize; | 95 valid_buffer_.size = kSharedBufferSize; |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 // Create Query. | 454 // Create Query. |
| 463 QueryManager::Query::Ref query( | 455 QueryManager::Query::Ref query( |
| 464 CreateQuery(kTarget, kClient1Id, | 456 CreateQuery(kTarget, kClient1Id, |
| 465 kSharedMemoryId, kSharedMemoryOffset, kService1Id)); | 457 kSharedMemoryId, kSharedMemoryOffset, kService1Id)); |
| 466 ASSERT_TRUE(query.get() != NULL); | 458 ASSERT_TRUE(query.get() != NULL); |
| 467 | 459 |
| 468 // Queue it | 460 // Queue it |
| 469 QueueQuery(query.get(), kService1Id, kSubmitCount); | 461 QueueQuery(query.get(), kService1Id, kSubmitCount); |
| 470 } | 462 } |
| 471 | 463 |
| 464 // Test that when based on ARB_occlusion_query2 we use GL_ANY_SAMPLES_PASSED_ARB |
| 465 // for GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT |
| 472 TEST_F(QueryManagerTest, ARBOcclusionQuery2) { | 466 TEST_F(QueryManagerTest, ARBOcclusionQuery2) { |
| 473 const GLuint kClient1Id = 1; | 467 const GLuint kClient1Id = 1; |
| 474 const GLuint kService1Id = 11; | 468 const GLuint kService1Id = 11; |
| 475 const GLenum kTarget = GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT; | 469 const GLenum kTarget = GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT; |
| 476 const uint32 kSubmitCount = 123; | 470 const uint32 kSubmitCount = 123; |
| 477 | 471 |
| 478 TestHelper::SetupFeatureInfoInitExpectations( | 472 TestHelper::SetupFeatureInfoInitExpectations( |
| 479 gl_.get(), | 473 gl_.get(), |
| 480 "GL_ARB_occlusion_query2"); | 474 "GL_ARB_occlusion_query2"); |
| 481 FeatureInfo::Ref feature_info(new FeatureInfo()); | 475 FeatureInfo::Ref feature_info(new FeatureInfo()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 494 .Times(1) | 488 .Times(1) |
| 495 .RetiresOnSaturation(); | 489 .RetiresOnSaturation(); |
| 496 EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT)) | 490 EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT)) |
| 497 .Times(1) | 491 .Times(1) |
| 498 .RetiresOnSaturation(); | 492 .RetiresOnSaturation(); |
| 499 EXPECT_TRUE(manager->BeginQuery(query)); | 493 EXPECT_TRUE(manager->BeginQuery(query)); |
| 500 EXPECT_TRUE(manager->EndQuery(query, kSubmitCount)); | 494 EXPECT_TRUE(manager->EndQuery(query, kSubmitCount)); |
| 501 manager->Destroy(false); | 495 manager->Destroy(false); |
| 502 } | 496 } |
| 503 | 497 |
| 498 // Test that when based on ARB_occlusion_query we use GL_SAMPLES_PASSED_ARB |
| 499 // for GL_ANY_SAMPLES_PASSED_EXT |
| 504 TEST_F(QueryManagerTest, ARBOcclusionQuery) { | 500 TEST_F(QueryManagerTest, ARBOcclusionQuery) { |
| 505 const GLuint kClient1Id = 1; | 501 const GLuint kClient1Id = 1; |
| 506 const GLuint kService1Id = 11; | 502 const GLuint kService1Id = 11; |
| 507 const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; | 503 const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; |
| 508 const uint32 kSubmitCount = 123; | 504 const uint32 kSubmitCount = 123; |
| 509 | 505 |
| 510 TestHelper::SetupFeatureInfoInitExpectations( | 506 TestHelper::SetupFeatureInfoInitExpectations( |
| 511 gl_.get(), | 507 gl_.get(), |
| 512 "GL_ARB_occlusion_query"); | 508 "GL_ARB_occlusion_query"); |
| 513 FeatureInfo::Ref feature_info(new FeatureInfo()); | 509 FeatureInfo::Ref feature_info(new FeatureInfo()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 526 .Times(1) | 522 .Times(1) |
| 527 .RetiresOnSaturation(); | 523 .RetiresOnSaturation(); |
| 528 EXPECT_CALL(*gl_, EndQueryARB(GL_SAMPLES_PASSED_ARB)) | 524 EXPECT_CALL(*gl_, EndQueryARB(GL_SAMPLES_PASSED_ARB)) |
| 529 .Times(1) | 525 .Times(1) |
| 530 .RetiresOnSaturation(); | 526 .RetiresOnSaturation(); |
| 531 EXPECT_TRUE(manager->BeginQuery(query)); | 527 EXPECT_TRUE(manager->BeginQuery(query)); |
| 532 EXPECT_TRUE(manager->EndQuery(query, kSubmitCount)); | 528 EXPECT_TRUE(manager->EndQuery(query, kSubmitCount)); |
| 533 manager->Destroy(false); | 529 manager->Destroy(false); |
| 534 } | 530 } |
| 535 | 531 |
| 532 TEST_F(QueryManagerTest, GetErrorQuery) { |
| 533 const GLuint kClient1Id = 1; |
| 534 const GLenum kTarget = GL_GET_ERROR_QUERY_CHROMIUM; |
| 535 const uint32 kSubmitCount = 123; |
| 536 |
| 537 TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), ""); |
| 538 FeatureInfo::Ref feature_info(new FeatureInfo()); |
| 539 feature_info->Initialize("*"); |
| 540 scoped_ptr<QueryManager> manager( |
| 541 new QueryManager(decoder_.get(), feature_info.get())); |
| 542 |
| 543 QueryManager::Query* query = manager->CreateQuery( |
| 544 kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset); |
| 545 ASSERT_TRUE(query != NULL); |
| 546 |
| 547 // Setup shared memory like client would. |
| 548 QuerySync* sync = decoder_->GetSharedMemoryAs<QuerySync*>( |
| 549 kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync)); |
| 550 ASSERT_TRUE(sync != NULL); |
| 551 sync->Reset(); |
| 552 |
| 553 EXPECT_TRUE(manager->BeginQuery(query)); |
| 554 |
| 555 EXPECT_CALL(*decoder_.get(), GetGLError()) |
| 556 .WillOnce(Return(GL_INVALID_ENUM)) |
| 557 .RetiresOnSaturation(); |
| 558 |
| 559 EXPECT_TRUE(manager->EndQuery(query, kSubmitCount)); |
| 560 EXPECT_FALSE(query->pending()); |
| 561 |
| 562 EXPECT_EQ(static_cast<GLuint>(GL_INVALID_ENUM), sync->result); |
| 563 |
| 564 manager->Destroy(false); |
| 565 } |
| 566 |
| 536 } // namespace gles2 | 567 } // namespace gles2 |
| 537 } // namespace gpu | 568 } // namespace gpu |
| 538 | 569 |
| 539 | 570 |
| OLD | NEW |