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