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)// Tests for the QueryTracker.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/query_tracker.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2ext.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/client_test_helper.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_cmd_helper.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/mapped_memory.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/command_buffer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochnamespace {
224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid EmptyPoll() {
234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
254ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuerySyncManagerTest : public testing::Test {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kNumCommandEntries = 400;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kCommandBufferSizeBytes =
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kNumCommandEntries * sizeof(CommandBufferEntry);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_buffer_.reset(new MockClientCommandBuffer());
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->Initialize(kCommandBufferSizeBytes);
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    mapped_memory_.reset(new MappedMemoryManager(
374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        helper_.get(), base::Bind(&EmptyPoll), MappedMemoryManager::kNoLimit));
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_manager_.reset(new QuerySyncManager(mapped_memory_.get()));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_manager_.reset();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mapped_memory_.reset();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.reset();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_buffer_.reset();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CommandBuffer> command_buffer_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<GLES2CmdHelper> helper_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MappedMemoryManager> mapped_memory_;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<QuerySyncManager> sync_manager_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuerySyncManagerTest, Basic) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySyncManager::QueryInfo infos[4];
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&infos, 0xBD, sizeof(infos));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < arraysize(infos); ++ii) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(sync_manager_->Alloc(&infos[ii]));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, infos[ii].shm_id);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(infos[ii].sync != NULL);
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(0, infos[ii].sync->process_count);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0u, infos[ii].sync->result);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < arraysize(infos); ++ii) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_manager_->Free(infos[ii]);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuerySyncManagerTest, DontFree) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySyncManager::QueryInfo infos[4];
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&infos, 0xBD, sizeof(infos));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < arraysize(infos); ++ii) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(sync_manager_->Alloc(&infos[ii]));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QueryTrackerTest : public testing::Test {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kNumCommandEntries = 400;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kCommandBufferSizeBytes =
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kNumCommandEntries * sizeof(CommandBufferEntry);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_buffer_.reset(new MockClientCommandBuffer());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->Initialize(kCommandBufferSizeBytes);
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    mapped_memory_.reset(new MappedMemoryManager(
914ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        helper_.get(), base::Bind(&EmptyPoll), MappedMemoryManager::kNoLimit));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    query_tracker_.reset(new QueryTracker(mapped_memory_.get()));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    query_tracker_.reset();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mapped_memory_.reset();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.reset();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_buffer_.reset();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySync* GetSync(QueryTracker::Query* query) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return query->info_.sync;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  QuerySyncManager::Bucket* GetBucket(QueryTracker::Query* query) {
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return query->info_.bucket;
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  uint32 GetFlushGeneration() { return helper_->flush_generation(); }
1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CommandBuffer> command_buffer_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<GLES2CmdHelper> helper_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MappedMemoryManager> mapped_memory_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<QueryTracker> query_tracker_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryTrackerTest, Basic) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kId1 = 123;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kId2 = 124;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create a Query.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryTracker::Query* query = query_tracker_->CreateQuery(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kId1, GL_ANY_SAMPLES_PASSED_EXT);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query != NULL);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can get the same Query.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(query, query_tracker_->GetQuery(kId1));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get nothing for a non-existent query.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query_tracker_->GetQuery(kId2) == NULL);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can delete the query.
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  query_tracker_->RemoveQuery(kId1);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get nothing for a non-existent query.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query_tracker_->GetQuery(kId1) == NULL);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryTrackerTest, Query) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kId1 = 123;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int32 kToken = 46;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kResult = 456;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a Query.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryTracker::Query* query = query_tracker_->CreateQuery(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kId1, GL_ANY_SAMPLES_PASSED_EXT);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query != NULL);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->NeverUsed());
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->Pending());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, query->token());
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, query->submit_count());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check MarkAsActive.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  query->MarkAsActive();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->NeverUsed());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->Pending());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, query->token());
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, query->submit_count());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check MarkAsPending.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  query->MarkAsPending(kToken);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->NeverUsed());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->Pending());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kToken, query->token());
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, query->submit_count());
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check CheckResultsAvailable.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->CheckResultsAvailable(helper_.get()));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->NeverUsed());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->Pending());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Flush only once if no more flushes happened between a call to
1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // EndQuery command and CheckResultsAvailable
1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Advance put_ so flush calls in CheckResultsAvailable go through
1720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // and updates flush_generation count
1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  helper_->Noop(1);
1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Set Query in pending state_ to simulate EndQuery command is called
1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  query->MarkAsPending(kToken);
1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(query->Pending());
1770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Store FlushGeneration count after EndQuery is called
1780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  uint32 gen1 = GetFlushGeneration();
1790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(query->CheckResultsAvailable(helper_.get()));
1800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  uint32 gen2 = GetFlushGeneration();
1810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_NE(gen1, gen2);
1820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Repeated calls to CheckResultsAvailable should not flush unnecessarily
1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(query->CheckResultsAvailable(helper_.get()));
1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gen1 = GetFlushGeneration();
1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(gen1, gen2);
1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(query->CheckResultsAvailable(helper_.get()));
1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gen1 = GetFlushGeneration();
1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(gen1, gen2);
1890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate GPU process marking it as available.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuerySync* sync = GetSync(query);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync->process_count = query->submit_count();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync->result = kResult;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check CheckResultsAvailable.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(query->CheckResultsAvailable(helper_.get()));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kResult, query->GetResult());
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->NeverUsed());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(query->Pending());
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(QueryTrackerTest, Remove) {
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GLuint kId1 = 123;
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const int32 kToken = 46;
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const uint32 kResult = 456;
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Create a Query.
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  QueryTracker::Query* query = query_tracker_->CreateQuery(
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      kId1, GL_ANY_SAMPLES_PASSED_EXT);
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(query != NULL);
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  QuerySyncManager::Bucket* bucket = GetBucket(query);
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1u, bucket->used_query_count);
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  query->MarkAsActive();
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  query->MarkAsPending(kToken);
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  query_tracker_->RemoveQuery(kId1);
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Check we get nothing for a non-existent query.
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(query_tracker_->GetQuery(kId1) == NULL);
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Check that memory was not freed.
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1u, bucket->used_query_count);
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Simulate GPU process marking it as available.
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  QuerySync* sync = GetSync(query);
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  sync->process_count = query->submit_count();
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  sync->result = kResult;
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Check FreeCompletedQueries.
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  query_tracker_->FreeCompletedQueries();
232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0u, bucket->used_query_count);
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
239