OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef GPU_COMMAND_BUFFER_SERVICE_QUERY_MANAGER_H_ | 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_QUERY_MANAGER_H_ |
6 #define GPU_COMMAND_BUFFER_SERVICE_QUERY_MANAGER_H_ | 6 #define GPU_COMMAND_BUFFER_SERVICE_QUERY_MANAGER_H_ |
7 | 7 |
| 8 #include <stdint.h> |
| 9 |
8 #include <deque> | 10 #include <deque> |
9 #include <vector> | 11 #include <vector> |
10 #include "base/atomicops.h" | 12 #include "base/atomicops.h" |
11 #include "base/basictypes.h" | |
12 #include "base/containers/hash_tables.h" | 13 #include "base/containers/hash_tables.h" |
13 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/macros.h" |
14 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
15 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
16 #include "gpu/command_buffer/service/feature_info.h" | 18 #include "gpu/command_buffer/service/feature_info.h" |
17 #include "gpu/gpu_export.h" | 19 #include "gpu/gpu_export.h" |
18 | 20 |
19 namespace gfx { | 21 namespace gfx { |
20 class GPUTimer; | 22 class GPUTimer; |
21 class GPUTimingClient; | 23 class GPUTimingClient; |
22 } | 24 } |
23 | 25 |
24 namespace gpu { | 26 namespace gpu { |
25 | 27 |
26 class GLES2Decoder; | 28 class GLES2Decoder; |
27 | 29 |
28 namespace gles2 { | 30 namespace gles2 { |
29 | 31 |
30 class FeatureInfo; | 32 class FeatureInfo; |
31 | 33 |
32 // This class keeps track of the queries and their state | 34 // This class keeps track of the queries and their state |
33 // As Queries are not shared there is one QueryManager per context. | 35 // As Queries are not shared there is one QueryManager per context. |
34 class GPU_EXPORT QueryManager { | 36 class GPU_EXPORT QueryManager { |
35 public: | 37 public: |
36 class GPU_EXPORT Query : public base::RefCounted<Query> { | 38 class GPU_EXPORT Query : public base::RefCounted<Query> { |
37 public: | 39 public: |
38 Query( | 40 Query(QueryManager* manager, |
39 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 41 GLenum target, |
| 42 int32_t shm_id, |
| 43 uint32_t shm_offset); |
40 | 44 |
41 GLenum target() const { | 45 GLenum target() const { |
42 return target_; | 46 return target_; |
43 } | 47 } |
44 | 48 |
45 bool IsDeleted() const { | 49 bool IsDeleted() const { |
46 return deleted_; | 50 return deleted_; |
47 } | 51 } |
48 | 52 |
49 bool IsValid() const { | 53 bool IsValid() const { |
50 return target() && !IsDeleted(); | 54 return target() && !IsDeleted(); |
51 } | 55 } |
52 | 56 |
53 bool IsActive() const { | 57 bool IsActive() const { |
54 return query_state_ == kQueryState_Active; | 58 return query_state_ == kQueryState_Active; |
55 } | 59 } |
56 | 60 |
57 bool IsPaused() const { | 61 bool IsPaused() const { |
58 return query_state_ == kQueryState_Paused; | 62 return query_state_ == kQueryState_Paused; |
59 } | 63 } |
60 | 64 |
61 bool IsPending() const { | 65 bool IsPending() const { |
62 return query_state_ == kQueryState_Pending; | 66 return query_state_ == kQueryState_Pending; |
63 } | 67 } |
64 | 68 |
65 bool IsFinished() const { | 69 bool IsFinished() const { |
66 return query_state_ == kQueryState_Finished; | 70 return query_state_ == kQueryState_Finished; |
67 } | 71 } |
68 | 72 |
69 int32 shm_id() const { | 73 int32_t shm_id() const { return shm_id_; } |
70 return shm_id_; | |
71 } | |
72 | 74 |
73 uint32 shm_offset() const { | 75 uint32_t shm_offset() const { return shm_offset_; } |
74 return shm_offset_; | |
75 } | |
76 | 76 |
77 // Returns false if shared memory for sync is invalid. | 77 // Returns false if shared memory for sync is invalid. |
78 virtual bool Begin() = 0; | 78 virtual bool Begin() = 0; |
79 | 79 |
80 // Returns false if shared memory for sync is invalid. | 80 // Returns false if shared memory for sync is invalid. |
81 virtual bool End(base::subtle::Atomic32 submit_count) = 0; | 81 virtual bool End(base::subtle::Atomic32 submit_count) = 0; |
82 | 82 |
83 // Returns false if shared memory for sync is invalid. | 83 // Returns false if shared memory for sync is invalid. |
84 virtual bool QueryCounter(base::subtle::Atomic32 submit_count) = 0; | 84 virtual bool QueryCounter(base::subtle::Atomic32 submit_count) = 0; |
85 | 85 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 query_state_ = kQueryState_Paused; | 119 query_state_ = kQueryState_Paused; |
120 } | 120 } |
121 | 121 |
122 void MarkAsPending(base::subtle::Atomic32 submit_count) { | 122 void MarkAsPending(base::subtle::Atomic32 submit_count) { |
123 DCHECK(query_state_ == kQueryState_Active); | 123 DCHECK(query_state_ == kQueryState_Active); |
124 query_state_ = kQueryState_Pending; | 124 query_state_ = kQueryState_Pending; |
125 submit_count_ = submit_count; | 125 submit_count_ = submit_count; |
126 } | 126 } |
127 | 127 |
128 // Returns false if shared memory for sync is invalid. | 128 // Returns false if shared memory for sync is invalid. |
129 bool MarkAsCompleted(uint64 result); | 129 bool MarkAsCompleted(uint64_t result); |
130 | 130 |
131 void UnmarkAsPending() { | 131 void UnmarkAsPending() { |
132 DCHECK(query_state_ == kQueryState_Pending); | 132 DCHECK(query_state_ == kQueryState_Pending); |
133 query_state_ = kQueryState_Finished; | 133 query_state_ = kQueryState_Finished; |
134 } | 134 } |
135 | 135 |
136 // Returns false if shared memory for sync is invalid. | 136 // Returns false if shared memory for sync is invalid. |
137 bool AddToPendingQueue(base::subtle::Atomic32 submit_count) { | 137 bool AddToPendingQueue(base::subtle::Atomic32 submit_count) { |
138 return manager_->AddPendingQuery(this, submit_count); | 138 return manager_->AddPendingQuery(this, submit_count); |
139 } | 139 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 | 172 |
173 void RunCallbacks(); | 173 void RunCallbacks(); |
174 | 174 |
175 // The manager that owns this Query. | 175 // The manager that owns this Query. |
176 QueryManager* manager_; | 176 QueryManager* manager_; |
177 | 177 |
178 // The type of query. | 178 // The type of query. |
179 GLenum target_; | 179 GLenum target_; |
180 | 180 |
181 // The shared memory used with this Query. | 181 // The shared memory used with this Query. |
182 int32 shm_id_; | 182 int32_t shm_id_; |
183 uint32 shm_offset_; | 183 uint32_t shm_offset_; |
184 | 184 |
185 // Count to set process count do when completed. | 185 // Count to set process count do when completed. |
186 base::subtle::Atomic32 submit_count_; | 186 base::subtle::Atomic32 submit_count_; |
187 | 187 |
188 // Current state of the query. | 188 // Current state of the query. |
189 enum QueryState { | 189 enum QueryState { |
190 kQueryState_Initialize, // Has not been queried yet. | 190 kQueryState_Initialize, // Has not been queried yet. |
191 kQueryState_Active, // Query began but has not ended. | 191 kQueryState_Active, // Query began but has not ended. |
192 kQueryState_Paused, // Query was active but is now paused. | 192 kQueryState_Paused, // Query was active but is now paused. |
193 kQueryState_Pending, // Query ended, waiting for result. | 193 kQueryState_Pending, // Query ended, waiting for result. |
194 kQueryState_Finished, // Query received result. | 194 kQueryState_Finished, // Query received result. |
195 } query_state_; | 195 } query_state_; |
196 | 196 |
197 // True if deleted. | 197 // True if deleted. |
198 bool deleted_; | 198 bool deleted_; |
199 | 199 |
200 // List of callbacks to run when result is available. | 200 // List of callbacks to run when result is available. |
201 std::vector<base::Closure> callbacks_; | 201 std::vector<base::Closure> callbacks_; |
202 }; | 202 }; |
203 | 203 |
204 QueryManager( | 204 QueryManager( |
205 GLES2Decoder* decoder, | 205 GLES2Decoder* decoder, |
206 FeatureInfo* feature_info); | 206 FeatureInfo* feature_info); |
207 ~QueryManager(); | 207 ~QueryManager(); |
208 | 208 |
209 // Must call before destruction. | 209 // Must call before destruction. |
210 void Destroy(bool have_context); | 210 void Destroy(bool have_context); |
211 | 211 |
212 // Sets up a location to be incremented whenever a disjoint is detected. | 212 // Sets up a location to be incremented whenever a disjoint is detected. |
213 void SetDisjointSync(int32 shm_id, uint32 shm_offset); | 213 void SetDisjointSync(int32_t shm_id, uint32_t shm_offset); |
214 | 214 |
215 // Creates a Query for the given query. | 215 // Creates a Query for the given query. |
216 Query* CreateQuery( | 216 Query* CreateQuery(GLenum target, |
217 GLenum target, GLuint client_id, int32 shm_id, uint32 shm_offset); | 217 GLuint client_id, |
| 218 int32_t shm_id, |
| 219 uint32_t shm_offset); |
218 | 220 |
219 // Gets the query info for the given query. | 221 // Gets the query info for the given query. |
220 Query* GetQuery(GLuint client_id); | 222 Query* GetQuery(GLuint client_id); |
221 | 223 |
222 // Gets the currently active query for a target. | 224 // Gets the currently active query for a target. |
223 Query* GetActiveQuery(GLenum target); | 225 Query* GetActiveQuery(GLenum target); |
224 | 226 |
225 // Removes a query info for the given query. | 227 // Removes a query info for the given query. |
226 void RemoveQuery(GLuint client_id); | 228 void RemoveQuery(GLuint client_id); |
227 | 229 |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 | 339 |
338 scoped_refptr<gfx::GPUTimingClient> gpu_timing_client_; | 340 scoped_refptr<gfx::GPUTimingClient> gpu_timing_client_; |
339 | 341 |
340 DISALLOW_COPY_AND_ASSIGN(QueryManager); | 342 DISALLOW_COPY_AND_ASSIGN(QueryManager); |
341 }; | 343 }; |
342 | 344 |
343 } // namespace gles2 | 345 } // namespace gles2 |
344 } // namespace gpu | 346 } // namespace gpu |
345 | 347 |
346 #endif // GPU_COMMAND_BUFFER_SERVICE_QUERY_MANAGER_H_ | 348 #endif // GPU_COMMAND_BUFFER_SERVICE_QUERY_MANAGER_H_ |
OLD | NEW |