query_tracker_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Tests for the QueryTracker. 6 7#include "gpu/command_buffer/client/query_tracker.h" 8 9#include <GLES2/gl2ext.h> 10#include "base/memory/scoped_ptr.h" 11#include "gpu/command_buffer/client/client_test_helper.h" 12#include "gpu/command_buffer/client/gles2_cmd_helper.h" 13#include "gpu/command_buffer/client/mapped_memory.h" 14#include "gpu/command_buffer/common/command_buffer.h" 15#include "testing/gtest/include/gtest/gtest.h" 16#include "testing/gmock/include/gmock/gmock.h" 17 18namespace gpu { 19namespace gles2 { 20 21class QuerySyncManagerTest : public testing::Test { 22 protected: 23 static const int32 kNumCommandEntries = 400; 24 static const int32 kCommandBufferSizeBytes = 25 kNumCommandEntries * sizeof(CommandBufferEntry); 26 27 virtual void SetUp() { 28 command_buffer_.reset(new MockClientCommandBuffer()); 29 helper_.reset(new GLES2CmdHelper(command_buffer_.get())); 30 helper_->Initialize(kCommandBufferSizeBytes); 31 mapped_memory_.reset(new MappedMemoryManager(helper_.get())); 32 sync_manager_.reset(new QuerySyncManager(mapped_memory_.get())); 33 } 34 35 virtual void TearDown() { 36 sync_manager_.reset(); 37 mapped_memory_.reset(); 38 helper_.reset(); 39 command_buffer_.reset(); 40 } 41 42 scoped_ptr<CommandBuffer> command_buffer_; 43 scoped_ptr<GLES2CmdHelper> helper_; 44 scoped_ptr<MappedMemoryManager> mapped_memory_; 45 scoped_ptr<QuerySyncManager> sync_manager_; 46}; 47 48TEST_F(QuerySyncManagerTest, Basic) { 49 QuerySyncManager::QueryInfo infos[4]; 50 memset(&infos, 0xBD, sizeof(infos)); 51 52 for (size_t ii = 0; ii < arraysize(infos); ++ii) { 53 EXPECT_TRUE(sync_manager_->Alloc(&infos[ii])); 54 EXPECT_NE(0, infos[ii].shm_id); 55 ASSERT_TRUE(infos[ii].sync != NULL); 56 EXPECT_EQ(0u, infos[ii].sync->process_count); 57 EXPECT_EQ(0u, infos[ii].sync->result); 58 } 59 60 for (size_t ii = 0; ii < arraysize(infos); ++ii) { 61 sync_manager_->Free(infos[ii]); 62 } 63} 64 65TEST_F(QuerySyncManagerTest, DontFree) { 66 QuerySyncManager::QueryInfo infos[4]; 67 memset(&infos, 0xBD, sizeof(infos)); 68 69 for (size_t ii = 0; ii < arraysize(infos); ++ii) { 70 EXPECT_TRUE(sync_manager_->Alloc(&infos[ii])); 71 } 72} 73 74class QueryTrackerTest : public testing::Test { 75 protected: 76 static const int32 kNumCommandEntries = 400; 77 static const int32 kCommandBufferSizeBytes = 78 kNumCommandEntries * sizeof(CommandBufferEntry); 79 80 virtual void SetUp() { 81 command_buffer_.reset(new MockClientCommandBuffer()); 82 helper_.reset(new GLES2CmdHelper(command_buffer_.get())); 83 helper_->Initialize(kCommandBufferSizeBytes); 84 mapped_memory_.reset(new MappedMemoryManager(helper_.get())); 85 query_tracker_.reset(new QueryTracker(mapped_memory_.get())); 86 } 87 88 virtual void TearDown() { 89 query_tracker_.reset(); 90 mapped_memory_.reset(); 91 helper_.reset(); 92 command_buffer_.reset(); 93 } 94 95 QuerySync* GetSync(QueryTracker::Query* query) { 96 return query->info_.sync; 97 } 98 99 QuerySyncManager::Bucket* GetBucket(QueryTracker::Query* query) { 100 return query->info_.bucket; 101 } 102 103 scoped_ptr<CommandBuffer> command_buffer_; 104 scoped_ptr<GLES2CmdHelper> helper_; 105 scoped_ptr<MappedMemoryManager> mapped_memory_; 106 scoped_ptr<QueryTracker> query_tracker_; 107}; 108 109TEST_F(QueryTrackerTest, Basic) { 110 const GLuint kId1 = 123; 111 const GLuint kId2 = 124; 112 113 // Check we can create a Query. 114 QueryTracker::Query* query = query_tracker_->CreateQuery( 115 kId1, GL_ANY_SAMPLES_PASSED_EXT); 116 ASSERT_TRUE(query != NULL); 117 // Check we can get the same Query. 118 EXPECT_EQ(query, query_tracker_->GetQuery(kId1)); 119 // Check we get nothing for a non-existent query. 120 EXPECT_TRUE(query_tracker_->GetQuery(kId2) == NULL); 121 // Check we can delete the query. 122 query_tracker_->RemoveQuery(kId1); 123 // Check we get nothing for a non-existent query. 124 EXPECT_TRUE(query_tracker_->GetQuery(kId1) == NULL); 125} 126 127TEST_F(QueryTrackerTest, Query) { 128 const GLuint kId1 = 123; 129 const int32 kToken = 46; 130 const uint32 kResult = 456; 131 132 // Create a Query. 133 QueryTracker::Query* query = query_tracker_->CreateQuery( 134 kId1, GL_ANY_SAMPLES_PASSED_EXT); 135 ASSERT_TRUE(query != NULL); 136 EXPECT_TRUE(query->NeverUsed()); 137 EXPECT_FALSE(query->Pending()); 138 EXPECT_EQ(0, query->token()); 139 EXPECT_EQ(0u, query->submit_count()); 140 141 // Check MarkAsActive. 142 query->MarkAsActive(); 143 EXPECT_FALSE(query->NeverUsed()); 144 EXPECT_FALSE(query->Pending()); 145 EXPECT_EQ(0, query->token()); 146 EXPECT_EQ(1u, query->submit_count()); 147 148 // Check MarkAsPending. 149 query->MarkAsPending(kToken); 150 EXPECT_FALSE(query->NeverUsed()); 151 EXPECT_TRUE(query->Pending()); 152 EXPECT_EQ(kToken, query->token()); 153 EXPECT_EQ(1u, query->submit_count()); 154 155 // Check CheckResultsAvailable. 156 EXPECT_FALSE(query->CheckResultsAvailable(helper_.get())); 157 EXPECT_FALSE(query->NeverUsed()); 158 EXPECT_TRUE(query->Pending()); 159 160 // Simulate GPU process marking it as available. 161 QuerySync* sync = GetSync(query); 162 sync->process_count = query->submit_count(); 163 sync->result = kResult; 164 165 // Check CheckResultsAvailable. 166 EXPECT_TRUE(query->CheckResultsAvailable(helper_.get())); 167 EXPECT_EQ(kResult, query->GetResult()); 168 EXPECT_FALSE(query->NeverUsed()); 169 EXPECT_FALSE(query->Pending()); 170} 171 172TEST_F(QueryTrackerTest, Remove) { 173 const GLuint kId1 = 123; 174 const int32 kToken = 46; 175 const uint32 kResult = 456; 176 177 // Create a Query. 178 QueryTracker::Query* query = query_tracker_->CreateQuery( 179 kId1, GL_ANY_SAMPLES_PASSED_EXT); 180 ASSERT_TRUE(query != NULL); 181 182 QuerySyncManager::Bucket* bucket = GetBucket(query); 183 EXPECT_EQ(1u, bucket->used_query_count); 184 185 query->MarkAsActive(); 186 query->MarkAsPending(kToken); 187 188 query_tracker_->RemoveQuery(kId1); 189 // Check we get nothing for a non-existent query. 190 EXPECT_TRUE(query_tracker_->GetQuery(kId1) == NULL); 191 192 // Check that memory was not freed. 193 EXPECT_EQ(1u, bucket->used_query_count); 194 195 // Simulate GPU process marking it as available. 196 QuerySync* sync = GetSync(query); 197 sync->process_count = query->submit_count(); 198 sync->result = kResult; 199 200 // Check FreeCompletedQueries. 201 query_tracker_->FreeCompletedQueries(); 202 EXPECT_EQ(0u, bucket->used_query_count); 203} 204 205} // namespace gles2 206} // namespace gpu 207 208 209