15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/query_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/cmd_buffer_engine.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/command_buffer/service/error_state_mock.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "gpu/command_buffer/service/feature_info.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_service_test.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgumentPointee;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class QueryManagerTest : public GpuServiceTest {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kSharedMemoryId = 401;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kSharedBufferSize = 2048;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint32 kSharedMemoryOffset = 132;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kInvalidSharedMemoryId = 402;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint32 kInvalidSharedMemoryOffset = kSharedBufferSize + 1;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint32 kInitialResult = 0xBDBDBDBDu;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint8 kInitialMemoryValue = 0xBDu;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryManagerTest() {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~QueryManagerTest() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GpuServiceTest::SetUp();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    engine_.reset(new MockCommandBufferEngine());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_.reset(new MockGLES2Decoder());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_->set_engine(engine_.get());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestHelper::SetupFeatureInfoInitExpectations(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_.get(),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "GL_EXT_occlusion_query_boolean");
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    feature_info->Initialize();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_.reset(new QueryManager(decoder_.get(), feature_info.get()));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_.reset();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->Destroy(false);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_.reset();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    engine_.reset();
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GpuServiceTest::TearDown();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryManager::Query* CreateQuery(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLuint client_id, int32 shm_id, uint32 shm_offset,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint service_id) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, GenQueriesARB(1, _))
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       .WillOnce(SetArgumentPointee<1>(service_id))
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       .RetiresOnSaturation();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return manager_->CreateQuery(target, client_id, shm_id, shm_offset);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void QueueQuery(QueryManager::Query* query,
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  GLuint service_id,
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  base::subtle::Atomic32 submit_count) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BeginQueryARB(query->target(), service_id))
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, EndQueryARB(query->target()))
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(manager_->BeginQuery(query));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(manager_->EndQuery(query, submit_count));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockGLES2Decoder> decoder_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<QueryManager> manager_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class MockCommandBufferEngine : public CommandBufferEngine {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockCommandBufferEngine() {
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory());
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      shared_memory->CreateAndMapAnonymous(kSharedBufferSize);
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      valid_buffer_ =
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          MakeBufferFromSharedMemory(shared_memory.Pass(), kSharedBufferSize);
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      data_ = static_cast<uint8*>(valid_buffer_->memory());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ClearSharedMemory();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~MockCommandBufferEngine() {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual scoped_refptr<gpu::Buffer> GetSharedMemoryBuffer(int32 shm_id)
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        OVERRIDE {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return shm_id == kSharedMemoryId ? valid_buffer_ : invalid_buffer_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void ClearSharedMemory() {
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      memset(data_, kInitialMemoryValue, kSharedBufferSize);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void set_token(int32 token) OVERRIDE {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(false);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool SetGetBuffer(int32 /* transfer_buffer_id */) OVERRIDE {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(false);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Overridden from CommandBufferEngine.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool SetGetOffset(int32 offset) OVERRIDE {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(false);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Overridden from CommandBufferEngine.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual int32 GetGetOffset() OVERRIDE {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(false);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    uint8* data_;
134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    scoped_refptr<gpu::Buffer> valid_buffer_;
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    scoped_refptr<gpu::Buffer> invalid_buffer_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockCommandBufferEngine> engine_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COMPILER_MSVC
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 QueryManagerTest::kSharedMemoryId;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t QueryManagerTest::kSharedBufferSize;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 QueryManagerTest::kSharedMemoryOffset;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 QueryManagerTest::kInvalidSharedMemoryId;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 QueryManagerTest::kInvalidSharedMemoryOffset;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 QueryManagerTest::kInitialResult;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 QueryManagerTest::kInitialMemoryValue;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, Basic) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient2Id = 2;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->HavePendingQueries());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create a Query.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<QueryManager::Query> query(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateQuery(GL_ANY_SAMPLES_PASSED_EXT, kClient1Id,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kSharedMemoryId, kSharedMemoryOffset, kService1Id));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query.get() != NULL);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can get the same Query.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(query.get(), manager_->GetQuery(kClient1Id));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get nothing for a non-existent query.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->GetQuery(kClient2Id) == NULL);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can delete the query.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveQuery(kClient1Id);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get nothing for a non-existent query.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->GetQuery(kClient1Id) == NULL);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check query is deleted
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->IsDeleted());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->HavePendingQueries());
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, Destroy) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create Query.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<QueryManager::Query> query(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateQuery(GL_ANY_SAMPLES_PASSED_EXT, kClient1Id,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kSharedMemoryId, kSharedMemoryOffset, kService1Id));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query.get() != NULL);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteQueriesARB(1, ::testing::Pointee(kService1Id)))
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->Destroy(true);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get nothing for a non-existent query.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->GetQuery(kClient1Id) == NULL);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check query is deleted
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->IsDeleted());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, QueryBasic) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create Query.
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<QueryManager::Query> query(
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateQuery(kTarget, kClient1Id,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kSharedMemoryId, kSharedMemoryOffset, kService1Id));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query.get() != NULL);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->IsValid());
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->IsDeleted());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->pending());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kTarget, query->target());
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSharedMemoryId, query->shm_id());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSharedMemoryOffset, query->shm_offset());
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ProcessPendingQuery) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::subtle::Atomic32 kSubmitCount = 123;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kResult = 1;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check nothing happens if there are no pending queries.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->ProcessPendingQueries());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create Query.
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<QueryManager::Query> query(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateQuery(kTarget, kClient1Id,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kSharedMemoryId, kSharedMemoryOffset, kService1Id));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query.get() != NULL);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup shared memory like client would.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySync* sync = decoder_->GetSharedMemoryAs<QuerySync*>(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sync != NULL);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync->Reset();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Queue it
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueueQuery(query.get(), kService1Id, kSubmitCount);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->pending());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->HavePendingQueries());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process with return not available.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect 1 GL command.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(0))
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->ProcessPendingQueries());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->pending());
249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, sync->process_count);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, sync->result);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process with return available.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect 2 GL commands.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(1))
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(kResult))
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->ProcessPendingQueries());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->pending());
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSubmitCount, sync->process_count);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kResult, sync->result);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->HavePendingQueries());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process with no queries.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect no GL commands/
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->ProcessPendingQueries());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ProcessPendingQueries) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient2Id = 2;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService2Id = 12;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient3Id = 3;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService3Id = 13;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::subtle::Atomic32 kSubmitCount1 = 123;
282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::subtle::Atomic32 kSubmitCount2 = 123;
283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::subtle::Atomic32 kSubmitCount3 = 123;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kResult1 = 1;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kResult2 = 1;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kResult3 = 1;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup shared memory like client would.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySync* sync1 = decoder_->GetSharedMemoryAs<QuerySync*>(
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync1) * 3);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sync1 != NULL);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySync* sync2 = sync1 + 1;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySync* sync3 = sync2 + 1;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create Queries.
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<QueryManager::Query> query1(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateQuery(kTarget, kClient1Id,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kSharedMemoryId, kSharedMemoryOffset + sizeof(*sync1) * 0,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kService1Id));
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<QueryManager::Query> query2(
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateQuery(kTarget, kClient2Id,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kSharedMemoryId, kSharedMemoryOffset + sizeof(*sync1) * 1,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kService2Id));
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<QueryManager::Query> query3(
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateQuery(kTarget, kClient3Id,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kSharedMemoryId, kSharedMemoryOffset + sizeof(*sync1) * 2,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kService3Id));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query1.get() != NULL);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query2.get() != NULL);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query3.get() != NULL);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->HavePendingQueries());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync1->Reset();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync2->Reset();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync3->Reset();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Queue them
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueueQuery(query1.get(), kService1Id, kSubmitCount1);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueueQuery(query2.get(), kService2Id, kSubmitCount2);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueueQuery(query3.get(), kService3Id, kSubmitCount3);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query1->pending());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query2->pending());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query3->pending());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->HavePendingQueries());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process with return available for first 2 queries.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect 4 GL commands.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InSequence s;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(SetArgumentPointee<2>(1))
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(SetArgumentPointee<2>(kResult1))
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetQueryObjectuivARB(kService2Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(SetArgumentPointee<2>(1))
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetQueryObjectuivARB(kService2Id, GL_QUERY_RESULT_EXT, _))
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(SetArgumentPointee<2>(kResult2))
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(SetArgumentPointee<2>(0))
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(manager_->ProcessPendingQueries());
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query1->pending());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query2->pending());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query3->pending());
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSubmitCount1, sync1->process_count);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSubmitCount2, sync2->process_count);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kResult1, sync1->result);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kResult2, sync2->result);
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, sync3->process_count);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, sync3->result);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->HavePendingQueries());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process with renaming query. No result.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect 1 GL commands.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(0))
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->ProcessPendingQueries());
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query3->pending());
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, sync3->process_count);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, sync3->result);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->HavePendingQueries());
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process with renaming query. With result.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect 2 GL commands.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(1))
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_EXT, _))
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(kResult3))
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->ProcessPendingQueries());
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query3->pending());
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSubmitCount3, sync3->process_count);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kResult3, sync3->result);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->HavePendingQueries());
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ProcessPendingBadSharedMemoryId) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::subtle::Atomic32 kSubmitCount = 123;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kResult = 1;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create Query.
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<QueryManager::Query> query(
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateQuery(kTarget, kClient1Id,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kInvalidSharedMemoryId, kSharedMemoryOffset, kService1Id));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query.get() != NULL);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Queue it
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueueQuery(query.get(), kService1Id, kSubmitCount);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process with return available.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect 2 GL commands.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(1))
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(kResult))
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->ProcessPendingQueries());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ProcessPendingBadSharedMemoryOffset) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::subtle::Atomic32 kSubmitCount = 123;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kResult = 1;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create Query.
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<QueryManager::Query> query(
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateQuery(kTarget, kClient1Id,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kSharedMemoryId, kInvalidSharedMemoryOffset, kService1Id));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query.get() != NULL);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Queue it
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueueQuery(query.get(), kService1Id, kSubmitCount);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process with return available.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect 2 GL commands.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(1))
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(kResult))
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->ProcessPendingQueries());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ExitWithPendingQuery) {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::subtle::Atomic32 kSubmitCount = 123;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create Query.
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<QueryManager::Query> query(
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateQuery(kTarget, kClient1Id,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kSharedMemoryId, kSharedMemoryOffset, kService1Id));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query.get() != NULL);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Queue it
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueueQuery(query.get(), kService1Id, kSubmitCount);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when based on ARB_occlusion_query2 we use GL_ANY_SAMPLES_PASSED_ARB
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ARBOcclusionQuery2) {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT;
472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::subtle::Atomic32 kSubmitCount = 123;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupFeatureInfoInitExpectations(
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_.get(),
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GL_ARB_occlusion_query2");
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  feature_info->Initialize();
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<QueryManager> manager(
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new QueryManager(decoder_.get(), feature_info.get()));
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenQueriesARB(1, _))
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     .WillOnce(SetArgumentPointee<1>(kService1Id))
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     .RetiresOnSaturation();
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryManager::Query* query = manager->CreateQuery(
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query != NULL);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kService1Id))
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT))
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager->BeginQuery(query));
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager->EndQuery(query, kSubmitCount));
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->Destroy(false);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when based on ARB_occlusion_query we use GL_SAMPLES_PASSED_ARB
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for GL_ANY_SAMPLES_PASSED_EXT
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ARBOcclusionQuery) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT;
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::subtle::Atomic32 kSubmitCount = 123;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupFeatureInfoInitExpectations(
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_.get(),
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GL_ARB_occlusion_query");
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  feature_info->Initialize();
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<QueryManager> manager(
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new QueryManager(decoder_.get(), feature_info.get()));
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenQueriesARB(1, _))
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     .WillOnce(SetArgumentPointee<1>(kService1Id))
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     .RetiresOnSaturation();
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryManager::Query* query = manager->CreateQuery(
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query != NULL);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BeginQueryARB(GL_SAMPLES_PASSED_ARB, kService1Id))
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, EndQueryARB(GL_SAMPLES_PASSED_ARB))
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager->BeginQuery(query));
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager->EndQuery(query, kSubmitCount));
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->Destroy(false);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, GetErrorQuery) {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_GET_ERROR_QUERY_CHROMIUM;
537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::subtle::Atomic32 kSubmitCount = 123;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), "");
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
54158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  feature_info->Initialize();
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<QueryManager> manager(
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new QueryManager(decoder_.get(), feature_info.get()));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryManager::Query* query = manager->CreateQuery(
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query != NULL);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup shared memory like client would.
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySync* sync = decoder_->GetSharedMemoryAs<QuerySync*>(
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sync != NULL);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync->Reset();
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager->BeginQuery(query));
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockErrorState mock_error_state;
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*decoder_.get(), GetErrorState())
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .WillRepeatedly(Return(&mock_error_state));
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(mock_error_state, GetGLError())
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_INVALID_ENUM))
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager->EndQuery(query, kSubmitCount));
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->pending());
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLuint>(GL_INVALID_ENUM), sync->result);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->Destroy(false);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
576