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/containers/hash_tables.h"
14 #include "gles2_impl_export.h"
15 #include "gpu/command_buffer/common/gles2_cmd_format.h"
19 class CommandBufferHelper
;
20 class MappedMemoryManager
;
24 class GLES2Implementation
;
26 // Manages buckets of QuerySync instances in mapped memory.
27 class GLES2_IMPL_EXPORT QuerySyncManager
{
29 static const size_t kSyncsPerBucket
= 4096;
32 explicit Bucket(QuerySync
* sync_mem
)
37 unsigned used_query_count
;
40 QueryInfo(Bucket
* bucket
, int32 id
, uint32 offset
, QuerySync
* sync_mem
)
60 explicit QuerySyncManager(MappedMemoryManager
* manager
);
63 bool Alloc(QueryInfo
* info
);
64 void Free(const QueryInfo
& sync
);
68 MappedMemoryManager
* mapped_memory_
;
69 std::deque
<Bucket
*> buckets_
;
70 std::deque
<QueryInfo
> free_queries_
;
72 DISALLOW_COPY_AND_ASSIGN(QuerySyncManager
);
75 // Tracks queries for client side of command buffer.
76 class GLES2_IMPL_EXPORT QueryTracker
{
78 class GLES2_IMPL_EXPORT Query
{
81 kUninitialized
, // never used
82 kActive
, // between begin - end
83 kPending
, // not yet complete
84 kComplete
// completed
87 Query(GLuint id
, GLenum target
, const QuerySyncManager::QueryInfo
& info
);
89 GLenum
target() const {
97 int32
shm_id() const {
101 uint32
shm_offset() const {
102 return info_
.shm_offset
;
105 void MarkAsActive() {
110 void MarkAsPending(int32 token
) {
116 uint32
submit_count() const {
117 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 uint32 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_