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