Home | History | Annotate | Download | only in service
      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
      3 // found in the LICENSE file.
      4 
      5 #include "gpu/command_buffer/service/query_manager.h"
      6 #include "gpu/command_buffer/common/gles2_cmd_format.h"
      7 #include "gpu/command_buffer/service/cmd_buffer_engine.h"
      8 #include "gpu/command_buffer/service/error_state_mock.h"
      9 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
     10 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
     11 #include "gpu/command_buffer/service/feature_info.h"
     12 #include "gpu/command_buffer/service/test_helper.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 #include "ui/gl/gl_mock.h"
     15 
     16 using ::testing::_;
     17 using ::testing::InSequence;
     18 using ::testing::Return;
     19 using ::testing::SetArgumentPointee;
     20 
     21 namespace gpu {
     22 namespace gles2 {
     23 
     24 class QueryManagerTest : public testing::Test {
     25  public:
     26   static const int32 kSharedMemoryId = 401;
     27   static const size_t kSharedBufferSize = 2048;
     28   static const uint32 kSharedMemoryOffset = 132;
     29   static const int32 kInvalidSharedMemoryId = 402;
     30   static const uint32 kInvalidSharedMemoryOffset = kSharedBufferSize + 1;
     31   static const uint32 kInitialResult = 0xBDBDBDBDu;
     32   static const uint8 kInitialMemoryValue = 0xBDu;
     33 
     34   QueryManagerTest() {
     35   }
     36   virtual ~QueryManagerTest() {
     37   }
     38 
     39  protected:
     40   virtual void SetUp() {
     41     gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
     42     ::gfx::GLInterface::SetGLInterface(gl_.get());
     43     engine_.reset(new MockCommandBufferEngine());
     44     decoder_.reset(new MockGLES2Decoder());
     45     decoder_->set_engine(engine_.get());
     46     TestHelper::SetupFeatureInfoInitExpectations(
     47         gl_.get(),
     48         "GL_EXT_occlusion_query_boolean");
     49     scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
     50     feature_info->Initialize("*");
     51     manager_.reset(new QueryManager(decoder_.get(), feature_info.get()));
     52   }
     53 
     54   virtual void TearDown() {
     55     decoder_.reset();
     56     manager_->Destroy(false);
     57     manager_.reset();
     58     engine_.reset();
     59     ::gfx::GLInterface::SetGLInterface(NULL);
     60     gl_.reset();
     61   }
     62 
     63   QueryManager::Query* CreateQuery(
     64       GLenum target, GLuint client_id, int32 shm_id, uint32 shm_offset,
     65       GLuint service_id) {
     66     EXPECT_CALL(*gl_, GenQueriesARB(1, _))
     67        .WillOnce(SetArgumentPointee<1>(service_id))
     68        .RetiresOnSaturation();
     69     return manager_->CreateQuery(target, client_id, shm_id, shm_offset);
     70   }
     71 
     72   void QueueQuery(
     73     QueryManager::Query* query, GLuint service_id, uint32 submit_count) {
     74     EXPECT_CALL(*gl_, BeginQueryARB(query->target(), service_id))
     75         .Times(1)
     76         .RetiresOnSaturation();
     77     EXPECT_CALL(*gl_, EndQueryARB(query->target()))
     78         .Times(1)
     79         .RetiresOnSaturation();
     80     EXPECT_TRUE(manager_->BeginQuery(query));
     81     EXPECT_TRUE(manager_->EndQuery(query, submit_count));
     82   }
     83 
     84   // Use StrictMock to make 100% sure we know how GL will be called.
     85   scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
     86   scoped_ptr<MockGLES2Decoder> decoder_;
     87   scoped_ptr<QueryManager> manager_;
     88 
     89  private:
     90   class MockCommandBufferEngine : public CommandBufferEngine {
     91    public:
     92     MockCommandBufferEngine() {
     93       data_.reset(new int8[kSharedBufferSize]);
     94       ClearSharedMemory();
     95       valid_buffer_.ptr = data_.get();
     96       valid_buffer_.size = kSharedBufferSize;
     97     }
     98 
     99     virtual ~MockCommandBufferEngine() {
    100     }
    101 
    102     virtual gpu::Buffer GetSharedMemoryBuffer(int32 shm_id) OVERRIDE {
    103       return shm_id == kSharedMemoryId ? valid_buffer_ : invalid_buffer_;
    104     }
    105 
    106     void ClearSharedMemory() {
    107       memset(data_.get(), kInitialMemoryValue, kSharedBufferSize);
    108     }
    109 
    110     virtual void set_token(int32 token) OVERRIDE {
    111       DCHECK(false);
    112     }
    113 
    114     virtual bool SetGetBuffer(int32 /* transfer_buffer_id */) OVERRIDE {
    115       DCHECK(false);
    116       return false;
    117     }
    118 
    119     // Overridden from CommandBufferEngine.
    120     virtual bool SetGetOffset(int32 offset) OVERRIDE {
    121       DCHECK(false);
    122       return false;
    123     }
    124 
    125     // Overridden from CommandBufferEngine.
    126     virtual int32 GetGetOffset() OVERRIDE {
    127       DCHECK(false);
    128       return 0;
    129     }
    130 
    131    private:
    132     scoped_ptr<int8[]> data_;
    133     gpu::Buffer valid_buffer_;
    134     gpu::Buffer invalid_buffer_;
    135   };
    136 
    137   scoped_ptr<MockCommandBufferEngine> engine_;
    138 };
    139 
    140 // GCC requires these declarations, but MSVC requires they not be present
    141 #ifndef COMPILER_MSVC
    142 const int32 QueryManagerTest::kSharedMemoryId;
    143 const size_t QueryManagerTest::kSharedBufferSize;
    144 const uint32 QueryManagerTest::kSharedMemoryOffset;
    145 const int32 QueryManagerTest::kInvalidSharedMemoryId;
    146 const uint32 QueryManagerTest::kInvalidSharedMemoryOffset;
    147 const uint32 QueryManagerTest::kInitialResult;
    148 const uint8 QueryManagerTest::kInitialMemoryValue;
    149 #endif
    150 
    151 TEST_F(QueryManagerTest, Basic) {
    152   const GLuint kClient1Id = 1;
    153   const GLuint kService1Id = 11;
    154   const GLuint kClient2Id = 2;
    155 
    156   EXPECT_FALSE(manager_->HavePendingQueries());
    157   // Check we can create a Query.
    158   scoped_refptr<QueryManager::Query> query(
    159       CreateQuery(GL_ANY_SAMPLES_PASSED_EXT, kClient1Id,
    160                   kSharedMemoryId, kSharedMemoryOffset, kService1Id));
    161   ASSERT_TRUE(query.get() != NULL);
    162   // Check we can get the same Query.
    163   EXPECT_EQ(query.get(), manager_->GetQuery(kClient1Id));
    164   // Check we get nothing for a non-existent query.
    165   EXPECT_TRUE(manager_->GetQuery(kClient2Id) == NULL);
    166   // Check we can delete the query.
    167   manager_->RemoveQuery(kClient1Id);
    168   // Check we get nothing for a non-existent query.
    169   EXPECT_TRUE(manager_->GetQuery(kClient1Id) == NULL);
    170   // Check query is deleted
    171   EXPECT_TRUE(query->IsDeleted());
    172   EXPECT_FALSE(manager_->HavePendingQueries());
    173 }
    174 
    175 TEST_F(QueryManagerTest, Destroy) {
    176   const GLuint kClient1Id = 1;
    177   const GLuint kService1Id = 11;
    178 
    179   // Create Query.
    180   scoped_refptr<QueryManager::Query> query(
    181       CreateQuery(GL_ANY_SAMPLES_PASSED_EXT, kClient1Id,
    182                   kSharedMemoryId, kSharedMemoryOffset, kService1Id));
    183   ASSERT_TRUE(query.get() != NULL);
    184   EXPECT_CALL(*gl_, DeleteQueriesARB(1, ::testing::Pointee(kService1Id)))
    185       .Times(1)
    186       .RetiresOnSaturation();
    187   manager_->Destroy(true);
    188   // Check we get nothing for a non-existent query.
    189   EXPECT_TRUE(manager_->GetQuery(kClient1Id) == NULL);
    190   // Check query is deleted
    191   EXPECT_TRUE(query->IsDeleted());
    192 }
    193 
    194 TEST_F(QueryManagerTest, QueryBasic) {
    195   const GLuint kClient1Id = 1;
    196   const GLuint kService1Id = 11;
    197   const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
    198 
    199   // Create Query.
    200   scoped_refptr<QueryManager::Query> query(
    201       CreateQuery(kTarget, kClient1Id,
    202                   kSharedMemoryId, kSharedMemoryOffset, kService1Id));
    203   ASSERT_TRUE(query.get() != NULL);
    204 
    205   EXPECT_TRUE(query->IsValid());
    206   EXPECT_FALSE(query->IsDeleted());
    207   EXPECT_FALSE(query->pending());
    208   EXPECT_EQ(kTarget, query->target());
    209   EXPECT_EQ(kSharedMemoryId, query->shm_id());
    210   EXPECT_EQ(kSharedMemoryOffset, query->shm_offset());
    211 }
    212 
    213 TEST_F(QueryManagerTest, ProcessPendingQuery) {
    214   const GLuint kClient1Id = 1;
    215   const GLuint kService1Id = 11;
    216   const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
    217   const uint32 kSubmitCount = 123;
    218   const GLuint kResult = 1;
    219 
    220   // Check nothing happens if there are no pending queries.
    221   EXPECT_TRUE(manager_->ProcessPendingQueries());
    222 
    223   // Create Query.
    224   scoped_refptr<QueryManager::Query> query(
    225       CreateQuery(kTarget, kClient1Id,
    226                   kSharedMemoryId, kSharedMemoryOffset, kService1Id));
    227   ASSERT_TRUE(query.get() != NULL);
    228 
    229   // Setup shared memory like client would.
    230   QuerySync* sync = decoder_->GetSharedMemoryAs<QuerySync*>(
    231       kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync));
    232   ASSERT_TRUE(sync != NULL);
    233   sync->Reset();
    234 
    235   // Queue it
    236   QueueQuery(query.get(), kService1Id, kSubmitCount);
    237   EXPECT_TRUE(query->pending());
    238   EXPECT_TRUE(manager_->HavePendingQueries());
    239 
    240   // Process with return not available.
    241   // Expect 1 GL command.
    242   EXPECT_CALL(*gl_,
    243       GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
    244       .WillOnce(SetArgumentPointee<2>(0))
    245       .RetiresOnSaturation();
    246   EXPECT_TRUE(manager_->ProcessPendingQueries());
    247   EXPECT_TRUE(query->pending());
    248   EXPECT_EQ(0u, sync->process_count);
    249   EXPECT_EQ(0u, sync->result);
    250 
    251   // Process with return available.
    252   // Expect 2 GL commands.
    253   EXPECT_CALL(*gl_,
    254       GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
    255       .WillOnce(SetArgumentPointee<2>(1))
    256       .RetiresOnSaturation();
    257   EXPECT_CALL(*gl_,
    258       GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
    259       .WillOnce(SetArgumentPointee<2>(kResult))
    260       .RetiresOnSaturation();
    261   EXPECT_TRUE(manager_->ProcessPendingQueries());
    262   EXPECT_FALSE(query->pending());
    263   EXPECT_EQ(kSubmitCount, sync->process_count);
    264   EXPECT_EQ(kResult, sync->result);
    265   EXPECT_FALSE(manager_->HavePendingQueries());
    266 
    267   // Process with no queries.
    268   // Expect no GL commands/
    269   EXPECT_TRUE(manager_->ProcessPendingQueries());
    270 }
    271 
    272 TEST_F(QueryManagerTest, ProcessPendingQueries) {
    273   const GLuint kClient1Id = 1;
    274   const GLuint kService1Id = 11;
    275   const GLuint kClient2Id = 2;
    276   const GLuint kService2Id = 12;
    277   const GLuint kClient3Id = 3;
    278   const GLuint kService3Id = 13;
    279   const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
    280   const uint32 kSubmitCount1 = 123;
    281   const uint32 kSubmitCount2 = 123;
    282   const uint32 kSubmitCount3 = 123;
    283   const GLuint kResult1 = 1;
    284   const GLuint kResult2 = 1;
    285   const GLuint kResult3 = 1;
    286 
    287   // Setup shared memory like client would.
    288   QuerySync* sync1 = decoder_->GetSharedMemoryAs<QuerySync*>(
    289       kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync1) * 3);
    290   ASSERT_TRUE(sync1 != NULL);
    291   QuerySync* sync2 = sync1 + 1;
    292   QuerySync* sync3 = sync2 + 1;
    293 
    294   // Create Queries.
    295   scoped_refptr<QueryManager::Query> query1(
    296       CreateQuery(kTarget, kClient1Id,
    297                   kSharedMemoryId, kSharedMemoryOffset + sizeof(*sync1) * 0,
    298                   kService1Id));
    299   scoped_refptr<QueryManager::Query> query2(
    300       CreateQuery(kTarget, kClient2Id,
    301                   kSharedMemoryId, kSharedMemoryOffset + sizeof(*sync1) * 1,
    302                   kService2Id));
    303   scoped_refptr<QueryManager::Query> query3(
    304       CreateQuery(kTarget, kClient3Id,
    305                   kSharedMemoryId, kSharedMemoryOffset + sizeof(*sync1) * 2,
    306                   kService3Id));
    307   ASSERT_TRUE(query1.get() != NULL);
    308   ASSERT_TRUE(query2.get() != NULL);
    309   ASSERT_TRUE(query3.get() != NULL);
    310   EXPECT_FALSE(manager_->HavePendingQueries());
    311 
    312   sync1->Reset();
    313   sync2->Reset();
    314   sync3->Reset();
    315 
    316   // Queue them
    317   QueueQuery(query1.get(), kService1Id, kSubmitCount1);
    318   QueueQuery(query2.get(), kService2Id, kSubmitCount2);
    319   QueueQuery(query3.get(), kService3Id, kSubmitCount3);
    320   EXPECT_TRUE(query1->pending());
    321   EXPECT_TRUE(query2->pending());
    322   EXPECT_TRUE(query3->pending());
    323   EXPECT_TRUE(manager_->HavePendingQueries());
    324 
    325   // Process with return available for first 2 queries.
    326   // Expect 4 GL commands.
    327   {
    328     InSequence s;
    329     EXPECT_CALL(*gl_,
    330         GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
    331         .WillOnce(SetArgumentPointee<2>(1))
    332         .RetiresOnSaturation();
    333     EXPECT_CALL(*gl_,
    334         GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
    335         .WillOnce(SetArgumentPointee<2>(kResult1))
    336         .RetiresOnSaturation();
    337     EXPECT_CALL(*gl_,
    338         GetQueryObjectuivARB(kService2Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
    339         .WillOnce(SetArgumentPointee<2>(1))
    340         .RetiresOnSaturation();
    341     EXPECT_CALL(*gl_,
    342         GetQueryObjectuivARB(kService2Id, GL_QUERY_RESULT_EXT, _))
    343         .WillOnce(SetArgumentPointee<2>(kResult2))
    344         .RetiresOnSaturation();
    345     EXPECT_CALL(*gl_,
    346         GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
    347         .WillOnce(SetArgumentPointee<2>(0))
    348         .RetiresOnSaturation();
    349     EXPECT_TRUE(manager_->ProcessPendingQueries());
    350   }
    351   EXPECT_FALSE(query1->pending());
    352   EXPECT_FALSE(query2->pending());
    353   EXPECT_TRUE(query3->pending());
    354   EXPECT_EQ(kSubmitCount1, sync1->process_count);
    355   EXPECT_EQ(kSubmitCount2, sync2->process_count);
    356   EXPECT_EQ(kResult1, sync1->result);
    357   EXPECT_EQ(kResult2, sync2->result);
    358   EXPECT_EQ(0u, sync3->process_count);
    359   EXPECT_EQ(0u, sync3->result);
    360   EXPECT_TRUE(manager_->HavePendingQueries());
    361 
    362   // Process with renaming query. No result.
    363   // Expect 1 GL commands.
    364   EXPECT_CALL(*gl_,
    365       GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
    366       .WillOnce(SetArgumentPointee<2>(0))
    367       .RetiresOnSaturation();
    368   EXPECT_TRUE(manager_->ProcessPendingQueries());
    369   EXPECT_TRUE(query3->pending());
    370   EXPECT_EQ(0u, sync3->process_count);
    371   EXPECT_EQ(0u, sync3->result);
    372   EXPECT_TRUE(manager_->HavePendingQueries());
    373 
    374   // Process with renaming query. With result.
    375   // Expect 2 GL commands.
    376   EXPECT_CALL(*gl_,
    377       GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
    378       .WillOnce(SetArgumentPointee<2>(1))
    379       .RetiresOnSaturation();
    380   EXPECT_CALL(*gl_,
    381       GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_EXT, _))
    382       .WillOnce(SetArgumentPointee<2>(kResult3))
    383       .RetiresOnSaturation();
    384   EXPECT_TRUE(manager_->ProcessPendingQueries());
    385   EXPECT_FALSE(query3->pending());
    386   EXPECT_EQ(kSubmitCount3, sync3->process_count);
    387   EXPECT_EQ(kResult3, sync3->result);
    388   EXPECT_FALSE(manager_->HavePendingQueries());
    389 }
    390 
    391 TEST_F(QueryManagerTest, ProcessPendingBadSharedMemoryId) {
    392   const GLuint kClient1Id = 1;
    393   const GLuint kService1Id = 11;
    394   const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
    395   const uint32 kSubmitCount = 123;
    396   const GLuint kResult = 1;
    397 
    398   // Create Query.
    399   scoped_refptr<QueryManager::Query> query(
    400       CreateQuery(kTarget, kClient1Id,
    401                   kInvalidSharedMemoryId, kSharedMemoryOffset, kService1Id));
    402   ASSERT_TRUE(query.get() != NULL);
    403 
    404   // Queue it
    405   QueueQuery(query.get(), kService1Id, kSubmitCount);
    406 
    407   // Process with return available.
    408   // Expect 2 GL commands.
    409   EXPECT_CALL(*gl_,
    410       GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
    411       .WillOnce(SetArgumentPointee<2>(1))
    412       .RetiresOnSaturation();
    413   EXPECT_CALL(*gl_,
    414       GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
    415       .WillOnce(SetArgumentPointee<2>(kResult))
    416       .RetiresOnSaturation();
    417   EXPECT_FALSE(manager_->ProcessPendingQueries());
    418 }
    419 
    420 TEST_F(QueryManagerTest, ProcessPendingBadSharedMemoryOffset) {
    421   const GLuint kClient1Id = 1;
    422   const GLuint kService1Id = 11;
    423   const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
    424   const uint32 kSubmitCount = 123;
    425   const GLuint kResult = 1;
    426 
    427   // Create Query.
    428   scoped_refptr<QueryManager::Query> query(
    429       CreateQuery(kTarget, kClient1Id,
    430                   kSharedMemoryId, kInvalidSharedMemoryOffset, kService1Id));
    431   ASSERT_TRUE(query.get() != NULL);
    432 
    433   // Queue it
    434   QueueQuery(query.get(), kService1Id, kSubmitCount);
    435 
    436   // Process with return available.
    437   // Expect 2 GL commands.
    438   EXPECT_CALL(*gl_,
    439       GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
    440       .WillOnce(SetArgumentPointee<2>(1))
    441       .RetiresOnSaturation();
    442   EXPECT_CALL(*gl_,
    443       GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
    444       .WillOnce(SetArgumentPointee<2>(kResult))
    445       .RetiresOnSaturation();
    446   EXPECT_FALSE(manager_->ProcessPendingQueries());
    447 }
    448 
    449 TEST_F(QueryManagerTest, ExitWithPendingQuery) {
    450   const GLuint kClient1Id = 1;
    451   const GLuint kService1Id = 11;
    452   const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
    453   const uint32 kSubmitCount = 123;
    454 
    455   // Create Query.
    456   scoped_refptr<QueryManager::Query> query(
    457       CreateQuery(kTarget, kClient1Id,
    458                   kSharedMemoryId, kSharedMemoryOffset, kService1Id));
    459   ASSERT_TRUE(query.get() != NULL);
    460 
    461   // Queue it
    462   QueueQuery(query.get(), kService1Id, kSubmitCount);
    463 }
    464 
    465 // Test that when based on ARB_occlusion_query2 we use GL_ANY_SAMPLES_PASSED_ARB
    466 // for GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT
    467 TEST_F(QueryManagerTest, ARBOcclusionQuery2) {
    468   const GLuint kClient1Id = 1;
    469   const GLuint kService1Id = 11;
    470   const GLenum kTarget = GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT;
    471   const uint32 kSubmitCount = 123;
    472 
    473   TestHelper::SetupFeatureInfoInitExpectations(
    474       gl_.get(),
    475       "GL_ARB_occlusion_query2");
    476   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
    477   feature_info->Initialize("*");
    478   scoped_ptr<QueryManager> manager(
    479       new QueryManager(decoder_.get(), feature_info.get()));
    480 
    481   EXPECT_CALL(*gl_, GenQueriesARB(1, _))
    482      .WillOnce(SetArgumentPointee<1>(kService1Id))
    483      .RetiresOnSaturation();
    484   QueryManager::Query* query = manager->CreateQuery(
    485       kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset);
    486   ASSERT_TRUE(query != NULL);
    487 
    488   EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kService1Id))
    489       .Times(1)
    490       .RetiresOnSaturation();
    491   EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT))
    492       .Times(1)
    493       .RetiresOnSaturation();
    494   EXPECT_TRUE(manager->BeginQuery(query));
    495   EXPECT_TRUE(manager->EndQuery(query, kSubmitCount));
    496   manager->Destroy(false);
    497 }
    498 
    499 // Test that when based on ARB_occlusion_query we use GL_SAMPLES_PASSED_ARB
    500 // for GL_ANY_SAMPLES_PASSED_EXT
    501 TEST_F(QueryManagerTest, ARBOcclusionQuery) {
    502   const GLuint kClient1Id = 1;
    503   const GLuint kService1Id = 11;
    504   const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
    505   const uint32 kSubmitCount = 123;
    506 
    507   TestHelper::SetupFeatureInfoInitExpectations(
    508       gl_.get(),
    509       "GL_ARB_occlusion_query");
    510   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
    511   feature_info->Initialize("*");
    512   scoped_ptr<QueryManager> manager(
    513       new QueryManager(decoder_.get(), feature_info.get()));
    514 
    515   EXPECT_CALL(*gl_, GenQueriesARB(1, _))
    516      .WillOnce(SetArgumentPointee<1>(kService1Id))
    517      .RetiresOnSaturation();
    518   QueryManager::Query* query = manager->CreateQuery(
    519       kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset);
    520   ASSERT_TRUE(query != NULL);
    521 
    522   EXPECT_CALL(*gl_, BeginQueryARB(GL_SAMPLES_PASSED_ARB, kService1Id))
    523       .Times(1)
    524       .RetiresOnSaturation();
    525   EXPECT_CALL(*gl_, EndQueryARB(GL_SAMPLES_PASSED_ARB))
    526       .Times(1)
    527       .RetiresOnSaturation();
    528   EXPECT_TRUE(manager->BeginQuery(query));
    529   EXPECT_TRUE(manager->EndQuery(query, kSubmitCount));
    530   manager->Destroy(false);
    531 }
    532 
    533 TEST_F(QueryManagerTest, GetErrorQuery) {
    534   const GLuint kClient1Id = 1;
    535   const GLenum kTarget = GL_GET_ERROR_QUERY_CHROMIUM;
    536   const uint32 kSubmitCount = 123;
    537 
    538   TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), "");
    539   scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
    540   feature_info->Initialize("*");
    541   scoped_ptr<QueryManager> manager(
    542       new QueryManager(decoder_.get(), feature_info.get()));
    543 
    544   QueryManager::Query* query = manager->CreateQuery(
    545       kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset);
    546   ASSERT_TRUE(query != NULL);
    547 
    548   // Setup shared memory like client would.
    549   QuerySync* sync = decoder_->GetSharedMemoryAs<QuerySync*>(
    550       kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync));
    551   ASSERT_TRUE(sync != NULL);
    552   sync->Reset();
    553 
    554   EXPECT_TRUE(manager->BeginQuery(query));
    555 
    556   MockErrorState mock_error_state;
    557   EXPECT_CALL(*decoder_.get(), GetErrorState())
    558       .WillRepeatedly(Return(&mock_error_state));
    559   EXPECT_CALL(mock_error_state, GetGLError())
    560       .WillOnce(Return(GL_INVALID_ENUM))
    561       .RetiresOnSaturation();
    562 
    563   EXPECT_TRUE(manager->EndQuery(query, kSubmitCount));
    564   EXPECT_FALSE(query->pending());
    565 
    566   EXPECT_EQ(static_cast<GLuint>(GL_INVALID_ENUM), sync->result);
    567 
    568   manager->Destroy(false);
    569 }
    570 
    571 }  // namespace gles2
    572 }  // namespace gpu
    573 
    574 
    575