Index: gpu/command_buffer/client/query_tracker.cc |
diff --git a/gpu/command_buffer/client/query_tracker.cc b/gpu/command_buffer/client/query_tracker.cc |
index ccb6962889bfc13493071f358a99ea9bd4e28b5b..5356ef58fcb99de24459d24a9f4dfb90264940e4 100644 |
--- a/gpu/command_buffer/client/query_tracker.cc |
+++ b/gpu/command_buffer/client/query_tracker.cc |
@@ -24,8 +24,9 @@ QuerySyncManager::QuerySyncManager(MappedMemoryManager* manager) |
QuerySyncManager::~QuerySyncManager() { |
while (!buckets_.empty()) { |
- mapped_memory_->Free(buckets_.front()); |
- buckets_.pop(); |
+ mapped_memory_->Free(buckets_.front()->syncs); |
+ delete buckets_.front(); |
+ buckets_.pop_front(); |
} |
} |
@@ -40,21 +41,48 @@ bool QuerySyncManager::Alloc(QuerySyncManager::QueryInfo* info) { |
return false; |
} |
QuerySync* syncs = static_cast<QuerySync*>(mem); |
- buckets_.push(syncs); |
+ Bucket* bucket = new Bucket(syncs); |
+ buckets_.push_back(bucket); |
for (size_t ii = 0; ii < kSyncsPerBucket; ++ii) { |
- free_queries_.push(QueryInfo(shm_id, shm_offset, syncs)); |
+ free_queries_.push_back(QueryInfo(bucket, shm_id, shm_offset, syncs)); |
++syncs; |
shm_offset += sizeof(*syncs); |
} |
} |
*info = free_queries_.front(); |
+ ++(info->bucket->used_query_count); |
info->sync->Reset(); |
- free_queries_.pop(); |
+ free_queries_.pop_front(); |
return true; |
} |
void QuerySyncManager::Free(const QuerySyncManager::QueryInfo& info) { |
- free_queries_.push(info); |
+ DCHECK_GT(info.bucket->used_query_count, 0u); |
+ --(info.bucket->used_query_count); |
+ free_queries_.push_back(info); |
+} |
+ |
+void QuerySyncManager::Shrink() { |
+ std::deque<QueryInfo> new_queue; |
+ while (!free_queries_.empty()) { |
+ if (free_queries_.front().bucket->used_query_count) |
+ new_queue.push_back(free_queries_.front()); |
+ free_queries_.pop_front(); |
+ } |
+ free_queries_.swap(new_queue); |
+ |
+ std::deque<Bucket*> new_buckets; |
+ while (!buckets_.empty()) { |
+ Bucket* bucket = buckets_.front(); |
+ if (bucket->used_query_count) { |
+ new_buckets.push_back(bucket); |
+ } else { |
+ mapped_memory_->Free(bucket->syncs); |
+ delete bucket; |
+ } |
+ buckets_.pop_front(); |
+ } |
+ buckets_.swap(new_buckets); |
} |
QueryTracker::Query::Query(GLuint id, GLenum target, |
@@ -205,5 +233,9 @@ void QueryTracker::RemoveQuery(GLuint client_id, bool context_lost) { |
} |
} |
+void QueryTracker::Shrink() { |
+ query_sync_manager_.Shrink(); |
+} |
+ |
} // namespace gles2 |
} // namespace gpu |