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.
5 #ifndef GPU_COMMAND_BUFFER_CLIENT_QUERY_TRACKER_H_
6 #define GPU_COMMAND_BUFFER_CLIENT_QUERY_TRACKER_H_
13 #include "base/atomicops.h"
14 #include "base/containers/hash_tables.h"
15 #include "gles2_impl_export.h"
16 #include "gpu/command_buffer/common/gles2_cmd_format.h"
20 class CommandBufferHelper;
21 class MappedMemoryManager;
25 class GLES2Implementation;
27 // Manages buckets of QuerySync instances in mapped memory.
28 class GLES2_IMPL_EXPORT QuerySyncManager {
30 static const size_t kSyncsPerBucket = 4096;
33 explicit Bucket(QuerySync* sync_mem)
38 unsigned used_query_count;
41 QueryInfo(Bucket* bucket, int32 id, uint32 offset, QuerySync* sync_mem)
61 explicit QuerySyncManager(MappedMemoryManager* manager);
64 bool Alloc(QueryInfo* info);
65 void Free(const QueryInfo& sync);
69 MappedMemoryManager* mapped_memory_;
70 std::deque<Bucket*> buckets_;
71 std::deque<QueryInfo> free_queries_;
73 DISALLOW_COPY_AND_ASSIGN(QuerySyncManager);
76 // Tracks queries for client side of command buffer.
77 class GLES2_IMPL_EXPORT QueryTracker {
79 class GLES2_IMPL_EXPORT Query {
82 kUninitialized, // never used
83 kActive, // between begin - end
84 kPending, // not yet complete
85 kComplete // completed
88 Query(GLuint id, GLenum target, const QuerySyncManager::QueryInfo& info);
90 GLenum target() const {
98 int32 shm_id() const {
102 uint32 shm_offset() const {
103 return info_.shm_offset;
106 void MarkAsActive() {
109 if (submit_count_ == INT_MAX)
113 void MarkAsPending(int32 token) {
118 base::subtle::Atomic32 submit_count() const { return submit_count_; }
120 int32 token() const {
124 bool NeverUsed() const {
125 return state_ == kUninitialized;
128 bool Pending() const {
129 return state_ == kPending;
132 bool CheckResultsAvailable(CommandBufferHelper* helper);
134 uint32 GetResult() const;
136 void Begin(GLES2Implementation* gl);
137 void End(GLES2Implementation* gl);
140 friend class QueryTracker;
141 friend class QueryTrackerTest;
145 QuerySyncManager::QueryInfo info_;
147 base::subtle::Atomic32 submit_count_;
150 uint64 client_begin_time_us_; // Only used for latency query target.
154 QueryTracker(MappedMemoryManager* manager);
157 Query* CreateQuery(GLuint id, GLenum target);
158 Query* GetQuery(GLuint id);
159 void RemoveQuery(GLuint id);
161 void FreeCompletedQueries();
164 typedef base::hash_map<GLuint, Query*> QueryMap;
165 typedef std::list<Query*> QueryList;
168 QueryList removed_queries_;
169 QuerySyncManager query_sync_manager_;
171 DISALLOW_COPY_AND_ASSIGN(QueryTracker);
177 #endif // GPU_COMMAND_BUFFER_CLIENT_QUERY_TRACKER_H_