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 #include "gpu/command_buffer/service/query_manager.h" | 5 #include "gpu/command_buffer/service/query_manager.h" |
6 | 6 |
| 7 #include <stddef.h> |
| 8 #include <stdint.h> |
| 9 |
7 #include "base/atomicops.h" | 10 #include "base/atomicops.h" |
8 #include "base/bind.h" | 11 #include "base/bind.h" |
9 #include "base/logging.h" | 12 #include "base/logging.h" |
10 #include "base/memory/shared_memory.h" | 13 #include "base/memory/shared_memory.h" |
11 #include "base/numerics/safe_math.h" | 14 #include "base/numerics/safe_math.h" |
12 #include "base/synchronization/lock.h" | 15 #include "base/synchronization/lock.h" |
13 #include "base/time/time.h" | 16 #include "base/time/time.h" |
14 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 17 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
15 #include "gpu/command_buffer/service/error_state.h" | 18 #include "gpu/command_buffer/service/error_state.h" |
16 #include "gpu/command_buffer/service/feature_info.h" | 19 #include "gpu/command_buffer/service/feature_info.h" |
17 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 20 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
18 #include "ui/gl/gl_bindings.h" | 21 #include "ui/gl/gl_bindings.h" |
19 #include "ui/gl/gl_context.h" | 22 #include "ui/gl/gl_context.h" |
20 #include "ui/gl/gl_fence.h" | 23 #include "ui/gl/gl_fence.h" |
21 #include "ui/gl/gpu_timing.h" | 24 #include "ui/gl/gpu_timing.h" |
22 | 25 |
23 namespace gpu { | 26 namespace gpu { |
24 namespace gles2 { | 27 namespace gles2 { |
25 | 28 |
26 class AbstractIntegerQuery : public QueryManager::Query { | 29 class AbstractIntegerQuery : public QueryManager::Query { |
27 public: | 30 public: |
28 AbstractIntegerQuery( | 31 AbstractIntegerQuery(QueryManager* manager, |
29 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 32 GLenum target, |
| 33 int32_t shm_id, |
| 34 uint32_t shm_offset); |
30 bool Begin() override; | 35 bool Begin() override; |
31 bool End(base::subtle::Atomic32 submit_count) override; | 36 bool End(base::subtle::Atomic32 submit_count) override; |
32 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 37 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
33 void Pause() override; | 38 void Pause() override; |
34 void Resume() override; | 39 void Resume() override; |
35 void Destroy(bool have_context) override; | 40 void Destroy(bool have_context) override; |
36 | 41 |
37 protected: | 42 protected: |
38 ~AbstractIntegerQuery() override; | 43 ~AbstractIntegerQuery() override; |
39 bool AreAllResultsAvailable(); | 44 bool AreAllResultsAvailable(); |
40 | 45 |
41 // Service side query ids. | 46 // Service side query ids. |
42 std::vector<GLuint> service_ids_; | 47 std::vector<GLuint> service_ids_; |
43 }; | 48 }; |
44 | 49 |
45 AbstractIntegerQuery::AbstractIntegerQuery( | 50 AbstractIntegerQuery::AbstractIntegerQuery(QueryManager* manager, |
46 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 51 GLenum target, |
| 52 int32_t shm_id, |
| 53 uint32_t shm_offset) |
47 : Query(manager, target, shm_id, shm_offset) { | 54 : Query(manager, target, shm_id, shm_offset) { |
48 GLuint service_id = 0; | 55 GLuint service_id = 0; |
49 glGenQueries(1, &service_id); | 56 glGenQueries(1, &service_id); |
50 DCHECK_NE(0u, service_id); | 57 DCHECK_NE(0u, service_id); |
51 service_ids_.push_back(service_id); | 58 service_ids_.push_back(service_id); |
52 } | 59 } |
53 | 60 |
54 bool AbstractIntegerQuery::Begin() { | 61 bool AbstractIntegerQuery::Begin() { |
55 MarkAsActive(); | 62 MarkAsActive(); |
56 // Delete all but the first one when beginning a new query. | 63 // Delete all but the first one when beginning a new query. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 | 107 |
101 bool AbstractIntegerQuery::AreAllResultsAvailable() { | 108 bool AbstractIntegerQuery::AreAllResultsAvailable() { |
102 GLuint available = 0; | 109 GLuint available = 0; |
103 glGetQueryObjectuiv( | 110 glGetQueryObjectuiv( |
104 service_ids_.back(), GL_QUERY_RESULT_AVAILABLE_EXT, &available); | 111 service_ids_.back(), GL_QUERY_RESULT_AVAILABLE_EXT, &available); |
105 return !!available; | 112 return !!available; |
106 } | 113 } |
107 | 114 |
108 class BooleanQuery : public AbstractIntegerQuery { | 115 class BooleanQuery : public AbstractIntegerQuery { |
109 public: | 116 public: |
110 BooleanQuery( | 117 BooleanQuery(QueryManager* manager, |
111 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 118 GLenum target, |
| 119 int32_t shm_id, |
| 120 uint32_t shm_offset); |
112 bool Process(bool did_finish) override; | 121 bool Process(bool did_finish) override; |
113 | 122 |
114 protected: | 123 protected: |
115 ~BooleanQuery() override; | 124 ~BooleanQuery() override; |
116 }; | 125 }; |
117 | 126 |
118 BooleanQuery::BooleanQuery( | 127 BooleanQuery::BooleanQuery(QueryManager* manager, |
119 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 128 GLenum target, |
120 : AbstractIntegerQuery(manager, target, shm_id, shm_offset) { | 129 int32_t shm_id, |
121 } | 130 uint32_t shm_offset) |
| 131 : AbstractIntegerQuery(manager, target, shm_id, shm_offset) {} |
122 | 132 |
123 BooleanQuery::~BooleanQuery() { | 133 BooleanQuery::~BooleanQuery() { |
124 } | 134 } |
125 | 135 |
126 bool BooleanQuery::Process(bool did_finish) { | 136 bool BooleanQuery::Process(bool did_finish) { |
127 if (!AreAllResultsAvailable()) { | 137 if (!AreAllResultsAvailable()) { |
128 // Must return true to avoid generating an error at the command | 138 // Must return true to avoid generating an error at the command |
129 // buffer level. | 139 // buffer level. |
130 return true; | 140 return true; |
131 } | 141 } |
132 for (const GLuint& service_id : service_ids_) { | 142 for (const GLuint& service_id : service_ids_) { |
133 GLuint result = 0; | 143 GLuint result = 0; |
134 glGetQueryObjectuiv(service_id, GL_QUERY_RESULT_EXT, &result); | 144 glGetQueryObjectuiv(service_id, GL_QUERY_RESULT_EXT, &result); |
135 if (result != 0) | 145 if (result != 0) |
136 return MarkAsCompleted(1); | 146 return MarkAsCompleted(1); |
137 } | 147 } |
138 return MarkAsCompleted(0); | 148 return MarkAsCompleted(0); |
139 } | 149 } |
140 | 150 |
141 class SummedIntegerQuery : public AbstractIntegerQuery { | 151 class SummedIntegerQuery : public AbstractIntegerQuery { |
142 public: | 152 public: |
143 SummedIntegerQuery( | 153 SummedIntegerQuery(QueryManager* manager, |
144 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 154 GLenum target, |
| 155 int32_t shm_id, |
| 156 uint32_t shm_offset); |
145 bool Process(bool did_finish) override; | 157 bool Process(bool did_finish) override; |
146 | 158 |
147 protected: | 159 protected: |
148 ~SummedIntegerQuery() override; | 160 ~SummedIntegerQuery() override; |
149 }; | 161 }; |
150 | 162 |
151 SummedIntegerQuery::SummedIntegerQuery( | 163 SummedIntegerQuery::SummedIntegerQuery(QueryManager* manager, |
152 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 164 GLenum target, |
153 : AbstractIntegerQuery(manager, target, shm_id, shm_offset) { | 165 int32_t shm_id, |
154 } | 166 uint32_t shm_offset) |
| 167 : AbstractIntegerQuery(manager, target, shm_id, shm_offset) {} |
155 | 168 |
156 SummedIntegerQuery::~SummedIntegerQuery() { | 169 SummedIntegerQuery::~SummedIntegerQuery() { |
157 } | 170 } |
158 | 171 |
159 bool SummedIntegerQuery::Process(bool did_finish) { | 172 bool SummedIntegerQuery::Process(bool did_finish) { |
160 if (!AreAllResultsAvailable()) { | 173 if (!AreAllResultsAvailable()) { |
161 // Must return true to avoid generating an error at the command | 174 // Must return true to avoid generating an error at the command |
162 // buffer level. | 175 // buffer level. |
163 return true; | 176 return true; |
164 } | 177 } |
165 GLuint summed_result = 0; | 178 GLuint summed_result = 0; |
166 for (const GLuint& service_id : service_ids_) { | 179 for (const GLuint& service_id : service_ids_) { |
167 GLuint result = 0; | 180 GLuint result = 0; |
168 glGetQueryObjectuiv(service_id, GL_QUERY_RESULT_EXT, &result); | 181 glGetQueryObjectuiv(service_id, GL_QUERY_RESULT_EXT, &result); |
169 summed_result += result; | 182 summed_result += result; |
170 } | 183 } |
171 return MarkAsCompleted(summed_result); | 184 return MarkAsCompleted(summed_result); |
172 } | 185 } |
173 | 186 |
174 class CommandsIssuedQuery : public QueryManager::Query { | 187 class CommandsIssuedQuery : public QueryManager::Query { |
175 public: | 188 public: |
176 CommandsIssuedQuery( | 189 CommandsIssuedQuery(QueryManager* manager, |
177 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 190 GLenum target, |
| 191 int32_t shm_id, |
| 192 uint32_t shm_offset); |
178 | 193 |
179 bool Begin() override; | 194 bool Begin() override; |
180 bool End(base::subtle::Atomic32 submit_count) override; | 195 bool End(base::subtle::Atomic32 submit_count) override; |
181 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 196 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
182 void Pause() override; | 197 void Pause() override; |
183 void Resume() override; | 198 void Resume() override; |
184 bool Process(bool did_finish) override; | 199 bool Process(bool did_finish) override; |
185 void Destroy(bool have_context) override; | 200 void Destroy(bool have_context) override; |
186 | 201 |
187 protected: | 202 protected: |
188 ~CommandsIssuedQuery() override; | 203 ~CommandsIssuedQuery() override; |
189 | 204 |
190 private: | 205 private: |
191 base::TimeTicks begin_time_; | 206 base::TimeTicks begin_time_; |
192 }; | 207 }; |
193 | 208 |
194 CommandsIssuedQuery::CommandsIssuedQuery( | 209 CommandsIssuedQuery::CommandsIssuedQuery(QueryManager* manager, |
195 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 210 GLenum target, |
196 : Query(manager, target, shm_id, shm_offset) { | 211 int32_t shm_id, |
197 } | 212 uint32_t shm_offset) |
| 213 : Query(manager, target, shm_id, shm_offset) {} |
198 | 214 |
199 bool CommandsIssuedQuery::Begin() { | 215 bool CommandsIssuedQuery::Begin() { |
200 MarkAsActive(); | 216 MarkAsActive(); |
201 begin_time_ = base::TimeTicks::Now(); | 217 begin_time_ = base::TimeTicks::Now(); |
202 return true; | 218 return true; |
203 } | 219 } |
204 | 220 |
205 void CommandsIssuedQuery::Pause() { | 221 void CommandsIssuedQuery::Pause() { |
206 MarkAsPaused(); | 222 MarkAsPaused(); |
207 } | 223 } |
(...skipping 22 matching lines...) Expand all Loading... |
230 if (!IsDeleted()) { | 246 if (!IsDeleted()) { |
231 MarkAsDeleted(); | 247 MarkAsDeleted(); |
232 } | 248 } |
233 } | 249 } |
234 | 250 |
235 CommandsIssuedQuery::~CommandsIssuedQuery() { | 251 CommandsIssuedQuery::~CommandsIssuedQuery() { |
236 } | 252 } |
237 | 253 |
238 class CommandLatencyQuery : public QueryManager::Query { | 254 class CommandLatencyQuery : public QueryManager::Query { |
239 public: | 255 public: |
240 CommandLatencyQuery( | 256 CommandLatencyQuery(QueryManager* manager, |
241 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 257 GLenum target, |
| 258 int32_t shm_id, |
| 259 uint32_t shm_offset); |
242 | 260 |
243 bool Begin() override; | 261 bool Begin() override; |
244 bool End(base::subtle::Atomic32 submit_count) override; | 262 bool End(base::subtle::Atomic32 submit_count) override; |
245 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 263 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
246 void Pause() override; | 264 void Pause() override; |
247 void Resume() override; | 265 void Resume() override; |
248 bool Process(bool did_finish) override; | 266 bool Process(bool did_finish) override; |
249 void Destroy(bool have_context) override; | 267 void Destroy(bool have_context) override; |
250 | 268 |
251 protected: | 269 protected: |
252 ~CommandLatencyQuery() override; | 270 ~CommandLatencyQuery() override; |
253 }; | 271 }; |
254 | 272 |
255 CommandLatencyQuery::CommandLatencyQuery( | 273 CommandLatencyQuery::CommandLatencyQuery(QueryManager* manager, |
256 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 274 GLenum target, |
257 : Query(manager, target, shm_id, shm_offset) { | 275 int32_t shm_id, |
258 } | 276 uint32_t shm_offset) |
| 277 : Query(manager, target, shm_id, shm_offset) {} |
259 | 278 |
260 bool CommandLatencyQuery::Begin() { | 279 bool CommandLatencyQuery::Begin() { |
261 MarkAsActive(); | 280 MarkAsActive(); |
262 return true; | 281 return true; |
263 } | 282 } |
264 | 283 |
265 void CommandLatencyQuery::Pause() { | 284 void CommandLatencyQuery::Pause() { |
266 MarkAsPaused(); | 285 MarkAsPaused(); |
267 } | 286 } |
268 | 287 |
(...skipping 24 matching lines...) Expand all Loading... |
293 } | 312 } |
294 | 313 |
295 CommandLatencyQuery::~CommandLatencyQuery() { | 314 CommandLatencyQuery::~CommandLatencyQuery() { |
296 } | 315 } |
297 | 316 |
298 | 317 |
299 class AsyncReadPixelsCompletedQuery | 318 class AsyncReadPixelsCompletedQuery |
300 : public QueryManager::Query, | 319 : public QueryManager::Query, |
301 public base::SupportsWeakPtr<AsyncReadPixelsCompletedQuery> { | 320 public base::SupportsWeakPtr<AsyncReadPixelsCompletedQuery> { |
302 public: | 321 public: |
303 AsyncReadPixelsCompletedQuery( | 322 AsyncReadPixelsCompletedQuery(QueryManager* manager, |
304 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 323 GLenum target, |
| 324 int32_t shm_id, |
| 325 uint32_t shm_offset); |
305 | 326 |
306 bool Begin() override; | 327 bool Begin() override; |
307 bool End(base::subtle::Atomic32 submit_count) override; | 328 bool End(base::subtle::Atomic32 submit_count) override; |
308 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 329 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
309 void Pause() override; | 330 void Pause() override; |
310 void Resume() override; | 331 void Resume() override; |
311 bool Process(bool did_finish) override; | 332 bool Process(bool did_finish) override; |
312 void Destroy(bool have_context) override; | 333 void Destroy(bool have_context) override; |
313 | 334 |
314 protected: | 335 protected: |
315 void Complete(); | 336 void Complete(); |
316 ~AsyncReadPixelsCompletedQuery() override; | 337 ~AsyncReadPixelsCompletedQuery() override; |
317 | 338 |
318 private: | 339 private: |
319 bool complete_result_; | 340 bool complete_result_; |
320 }; | 341 }; |
321 | 342 |
322 AsyncReadPixelsCompletedQuery::AsyncReadPixelsCompletedQuery( | 343 AsyncReadPixelsCompletedQuery::AsyncReadPixelsCompletedQuery( |
323 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 344 QueryManager* manager, |
324 : Query(manager, target, shm_id, shm_offset), | 345 GLenum target, |
325 complete_result_(false) { | 346 int32_t shm_id, |
326 } | 347 uint32_t shm_offset) |
| 348 : Query(manager, target, shm_id, shm_offset), complete_result_(false) {} |
327 | 349 |
328 bool AsyncReadPixelsCompletedQuery::Begin() { | 350 bool AsyncReadPixelsCompletedQuery::Begin() { |
329 MarkAsActive(); | 351 MarkAsActive(); |
330 return true; | 352 return true; |
331 } | 353 } |
332 | 354 |
333 void AsyncReadPixelsCompletedQuery::Pause() { | 355 void AsyncReadPixelsCompletedQuery::Pause() { |
334 MarkAsPaused(); | 356 MarkAsPaused(); |
335 } | 357 } |
336 | 358 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 MarkAsDeleted(); | 390 MarkAsDeleted(); |
369 } | 391 } |
370 } | 392 } |
371 | 393 |
372 AsyncReadPixelsCompletedQuery::~AsyncReadPixelsCompletedQuery() { | 394 AsyncReadPixelsCompletedQuery::~AsyncReadPixelsCompletedQuery() { |
373 } | 395 } |
374 | 396 |
375 | 397 |
376 class GetErrorQuery : public QueryManager::Query { | 398 class GetErrorQuery : public QueryManager::Query { |
377 public: | 399 public: |
378 GetErrorQuery( | 400 GetErrorQuery(QueryManager* manager, |
379 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 401 GLenum target, |
| 402 int32_t shm_id, |
| 403 uint32_t shm_offset); |
380 | 404 |
381 bool Begin() override; | 405 bool Begin() override; |
382 bool End(base::subtle::Atomic32 submit_count) override; | 406 bool End(base::subtle::Atomic32 submit_count) override; |
383 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 407 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
384 void Pause() override; | 408 void Pause() override; |
385 void Resume() override; | 409 void Resume() override; |
386 bool Process(bool did_finish) override; | 410 bool Process(bool did_finish) override; |
387 void Destroy(bool have_context) override; | 411 void Destroy(bool have_context) override; |
388 | 412 |
389 protected: | 413 protected: |
390 ~GetErrorQuery() override; | 414 ~GetErrorQuery() override; |
391 | 415 |
392 private: | 416 private: |
393 }; | 417 }; |
394 | 418 |
395 GetErrorQuery::GetErrorQuery( | 419 GetErrorQuery::GetErrorQuery(QueryManager* manager, |
396 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 420 GLenum target, |
397 : Query(manager, target, shm_id, shm_offset) { | 421 int32_t shm_id, |
398 } | 422 uint32_t shm_offset) |
| 423 : Query(manager, target, shm_id, shm_offset) {} |
399 | 424 |
400 bool GetErrorQuery::Begin() { | 425 bool GetErrorQuery::Begin() { |
401 MarkAsActive(); | 426 MarkAsActive(); |
402 return true; | 427 return true; |
403 } | 428 } |
404 | 429 |
405 void GetErrorQuery::Pause() { | 430 void GetErrorQuery::Pause() { |
406 MarkAsPaused(); | 431 MarkAsPaused(); |
407 } | 432 } |
408 | 433 |
(...skipping 22 matching lines...) Expand all Loading... |
431 } | 456 } |
432 } | 457 } |
433 | 458 |
434 GetErrorQuery::~GetErrorQuery() { | 459 GetErrorQuery::~GetErrorQuery() { |
435 } | 460 } |
436 | 461 |
437 class CommandsCompletedQuery : public QueryManager::Query { | 462 class CommandsCompletedQuery : public QueryManager::Query { |
438 public: | 463 public: |
439 CommandsCompletedQuery(QueryManager* manager, | 464 CommandsCompletedQuery(QueryManager* manager, |
440 GLenum target, | 465 GLenum target, |
441 int32 shm_id, | 466 int32_t shm_id, |
442 uint32 shm_offset); | 467 uint32_t shm_offset); |
443 | 468 |
444 // Overridden from QueryManager::Query: | 469 // Overridden from QueryManager::Query: |
445 bool Begin() override; | 470 bool Begin() override; |
446 bool End(base::subtle::Atomic32 submit_count) override; | 471 bool End(base::subtle::Atomic32 submit_count) override; |
447 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 472 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
448 void Pause() override; | 473 void Pause() override; |
449 void Resume() override; | 474 void Resume() override; |
450 bool Process(bool did_finish) override; | 475 bool Process(bool did_finish) override; |
451 void Destroy(bool have_context) override; | 476 void Destroy(bool have_context) override; |
452 | 477 |
453 protected: | 478 protected: |
454 ~CommandsCompletedQuery() override; | 479 ~CommandsCompletedQuery() override; |
455 | 480 |
456 private: | 481 private: |
457 scoped_ptr<gfx::GLFence> fence_; | 482 scoped_ptr<gfx::GLFence> fence_; |
458 base::TimeTicks begin_time_; | 483 base::TimeTicks begin_time_; |
459 }; | 484 }; |
460 | 485 |
461 CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager, | 486 CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager, |
462 GLenum target, | 487 GLenum target, |
463 int32 shm_id, | 488 int32_t shm_id, |
464 uint32 shm_offset) | 489 uint32_t shm_offset) |
465 : Query(manager, target, shm_id, shm_offset) {} | 490 : Query(manager, target, shm_id, shm_offset) {} |
466 | 491 |
467 bool CommandsCompletedQuery::Begin() { | 492 bool CommandsCompletedQuery::Begin() { |
468 MarkAsActive(); | 493 MarkAsActive(); |
469 begin_time_ = base::TimeTicks::Now(); | 494 begin_time_ = base::TimeTicks::Now(); |
470 return true; | 495 return true; |
471 } | 496 } |
472 | 497 |
473 void CommandsCompletedQuery::Pause() { | 498 void CommandsCompletedQuery::Pause() { |
474 MarkAsPaused(); | 499 MarkAsPaused(); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
506 MarkAsDeleted(); | 531 MarkAsDeleted(); |
507 } | 532 } |
508 } | 533 } |
509 | 534 |
510 CommandsCompletedQuery::~CommandsCompletedQuery() {} | 535 CommandsCompletedQuery::~CommandsCompletedQuery() {} |
511 | 536 |
512 class TimeElapsedQuery : public QueryManager::Query { | 537 class TimeElapsedQuery : public QueryManager::Query { |
513 public: | 538 public: |
514 TimeElapsedQuery(QueryManager* manager, | 539 TimeElapsedQuery(QueryManager* manager, |
515 GLenum target, | 540 GLenum target, |
516 int32 shm_id, | 541 int32_t shm_id, |
517 uint32 shm_offset); | 542 uint32_t shm_offset); |
518 | 543 |
519 // Overridden from QueryManager::Query: | 544 // Overridden from QueryManager::Query: |
520 bool Begin() override; | 545 bool Begin() override; |
521 bool End(base::subtle::Atomic32 submit_count) override; | 546 bool End(base::subtle::Atomic32 submit_count) override; |
522 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 547 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
523 void Pause() override; | 548 void Pause() override; |
524 void Resume() override; | 549 void Resume() override; |
525 bool Process(bool did_finish) override; | 550 bool Process(bool did_finish) override; |
526 void Destroy(bool have_context) override; | 551 void Destroy(bool have_context) override; |
527 | 552 |
528 protected: | 553 protected: |
529 ~TimeElapsedQuery() override; | 554 ~TimeElapsedQuery() override; |
530 | 555 |
531 private: | 556 private: |
532 scoped_ptr<gfx::GPUTimer> gpu_timer_; | 557 scoped_ptr<gfx::GPUTimer> gpu_timer_; |
533 }; | 558 }; |
534 | 559 |
535 TimeElapsedQuery::TimeElapsedQuery(QueryManager* manager, | 560 TimeElapsedQuery::TimeElapsedQuery(QueryManager* manager, |
536 GLenum target, | 561 GLenum target, |
537 int32 shm_id, | 562 int32_t shm_id, |
538 uint32 shm_offset) | 563 uint32_t shm_offset) |
539 : Query(manager, target, shm_id, shm_offset), | 564 : Query(manager, target, shm_id, shm_offset), |
540 gpu_timer_(manager->CreateGPUTimer(true)) { | 565 gpu_timer_(manager->CreateGPUTimer(true)) {} |
541 } | |
542 | 566 |
543 bool TimeElapsedQuery::Begin() { | 567 bool TimeElapsedQuery::Begin() { |
544 // Reset the disjoint value before the query begins if it is safe. | 568 // Reset the disjoint value before the query begins if it is safe. |
545 SafelyResetDisjointValue(); | 569 SafelyResetDisjointValue(); |
546 MarkAsActive(); | 570 MarkAsActive(); |
547 gpu_timer_->Start(); | 571 gpu_timer_->Start(); |
548 return true; | 572 return true; |
549 } | 573 } |
550 | 574 |
551 bool TimeElapsedQuery::End(base::subtle::Atomic32 submit_count) { | 575 bool TimeElapsedQuery::End(base::subtle::Atomic32 submit_count) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 void TimeElapsedQuery::Destroy(bool have_context) { | 608 void TimeElapsedQuery::Destroy(bool have_context) { |
585 gpu_timer_->Destroy(have_context); | 609 gpu_timer_->Destroy(have_context); |
586 } | 610 } |
587 | 611 |
588 TimeElapsedQuery::~TimeElapsedQuery() {} | 612 TimeElapsedQuery::~TimeElapsedQuery() {} |
589 | 613 |
590 class TimeStampQuery : public QueryManager::Query { | 614 class TimeStampQuery : public QueryManager::Query { |
591 public: | 615 public: |
592 TimeStampQuery(QueryManager* manager, | 616 TimeStampQuery(QueryManager* manager, |
593 GLenum target, | 617 GLenum target, |
594 int32 shm_id, | 618 int32_t shm_id, |
595 uint32 shm_offset); | 619 uint32_t shm_offset); |
596 | 620 |
597 // Overridden from QueryManager::Query: | 621 // Overridden from QueryManager::Query: |
598 bool Begin() override; | 622 bool Begin() override; |
599 bool End(base::subtle::Atomic32 submit_count) override; | 623 bool End(base::subtle::Atomic32 submit_count) override; |
600 bool QueryCounter(base::subtle::Atomic32 submit_count) override; | 624 bool QueryCounter(base::subtle::Atomic32 submit_count) override; |
601 void Pause() override; | 625 void Pause() override; |
602 void Resume() override; | 626 void Resume() override; |
603 bool Process(bool did_finish) override; | 627 bool Process(bool did_finish) override; |
604 void Destroy(bool have_context) override; | 628 void Destroy(bool have_context) override; |
605 | 629 |
606 protected: | 630 protected: |
607 ~TimeStampQuery() override; | 631 ~TimeStampQuery() override; |
608 | 632 |
609 private: | 633 private: |
610 scoped_ptr<gfx::GPUTimer> gpu_timer_; | 634 scoped_ptr<gfx::GPUTimer> gpu_timer_; |
611 }; | 635 }; |
612 | 636 |
613 TimeStampQuery::TimeStampQuery(QueryManager* manager, | 637 TimeStampQuery::TimeStampQuery(QueryManager* manager, |
614 GLenum target, | 638 GLenum target, |
615 int32 shm_id, | 639 int32_t shm_id, |
616 uint32 shm_offset) | 640 uint32_t shm_offset) |
617 : Query(manager, target, shm_id, shm_offset), | 641 : Query(manager, target, shm_id, shm_offset), |
618 gpu_timer_(manager->CreateGPUTimer(false)) {} | 642 gpu_timer_(manager->CreateGPUTimer(false)) {} |
619 | 643 |
620 bool TimeStampQuery::Begin() { | 644 bool TimeStampQuery::Begin() { |
621 NOTREACHED(); | 645 NOTREACHED(); |
622 return false; | 646 return false; |
623 } | 647 } |
624 | 648 |
625 bool TimeStampQuery::End(base::subtle::Atomic32 submit_count) { | 649 bool TimeStampQuery::End(base::subtle::Atomic32 submit_count) { |
626 NOTREACHED(); | 650 NOTREACHED(); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 pending_queries_.clear(); | 738 pending_queries_.clear(); |
715 pending_transfer_queries_.clear(); | 739 pending_transfer_queries_.clear(); |
716 active_queries_.clear(); | 740 active_queries_.clear(); |
717 while (!queries_.empty()) { | 741 while (!queries_.empty()) { |
718 Query* query = queries_.begin()->second.get(); | 742 Query* query = queries_.begin()->second.get(); |
719 query->Destroy(have_context); | 743 query->Destroy(have_context); |
720 queries_.erase(queries_.begin()); | 744 queries_.erase(queries_.begin()); |
721 } | 745 } |
722 } | 746 } |
723 | 747 |
724 void QueryManager::SetDisjointSync(int32 shm_id, uint32 shm_offset) { | 748 void QueryManager::SetDisjointSync(int32_t shm_id, uint32_t shm_offset) { |
725 DCHECK(disjoint_notify_shm_id_ == -1); | 749 DCHECK(disjoint_notify_shm_id_ == -1); |
726 DCHECK(shm_id != -1); | 750 DCHECK(shm_id != -1); |
727 | 751 |
728 DisjointValueSync* sync = decoder_->GetSharedMemoryAs<DisjointValueSync*>( | 752 DisjointValueSync* sync = decoder_->GetSharedMemoryAs<DisjointValueSync*>( |
729 shm_id, shm_offset, sizeof(*sync)); | 753 shm_id, shm_offset, sizeof(*sync)); |
730 DCHECK(sync); | 754 DCHECK(sync); |
731 sync->Reset(); | 755 sync->Reset(); |
732 disjoints_notified_ = 0; | 756 disjoints_notified_ = 0; |
733 | 757 |
734 disjoint_notify_shm_id_ = shm_id; | 758 disjoint_notify_shm_id_ = shm_id; |
735 disjoint_notify_shm_offset_ = shm_offset; | 759 disjoint_notify_shm_offset_ = shm_offset; |
736 } | 760 } |
737 | 761 |
738 QueryManager::Query* QueryManager::CreateQuery( | 762 QueryManager::Query* QueryManager::CreateQuery(GLenum target, |
739 GLenum target, GLuint client_id, int32 shm_id, uint32 shm_offset) { | 763 GLuint client_id, |
| 764 int32_t shm_id, |
| 765 uint32_t shm_offset) { |
740 scoped_refptr<Query> query; | 766 scoped_refptr<Query> query; |
741 switch (target) { | 767 switch (target) { |
742 case GL_COMMANDS_ISSUED_CHROMIUM: | 768 case GL_COMMANDS_ISSUED_CHROMIUM: |
743 query = new CommandsIssuedQuery(this, target, shm_id, shm_offset); | 769 query = new CommandsIssuedQuery(this, target, shm_id, shm_offset); |
744 break; | 770 break; |
745 case GL_LATENCY_QUERY_CHROMIUM: | 771 case GL_LATENCY_QUERY_CHROMIUM: |
746 query = new CommandLatencyQuery(this, target, shm_id, shm_offset); | 772 query = new CommandLatencyQuery(this, target, shm_id, shm_offset); |
747 break; | 773 break; |
748 case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM: | 774 case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM: |
749 query = new AsyncReadPixelsCompletedQuery( | 775 query = new AsyncReadPixelsCompletedQuery( |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 | 915 |
890 void QueryManager::SafelyResetDisjointValue() { | 916 void QueryManager::SafelyResetDisjointValue() { |
891 // It is only safe to reset the disjoint value is there is no active | 917 // It is only safe to reset the disjoint value is there is no active |
892 // elapsed timer and we are not continually updating the disjoint value. | 918 // elapsed timer and we are not continually updating the disjoint value. |
893 if (!update_disjoints_continually_ && !GetActiveQuery(GL_TIME_ELAPSED)) { | 919 if (!update_disjoints_continually_ && !GetActiveQuery(GL_TIME_ELAPSED)) { |
894 // Reset the error state without storing the result. | 920 // Reset the error state without storing the result. |
895 gpu_timing_client_->CheckAndResetTimerErrors(); | 921 gpu_timing_client_->CheckAndResetTimerErrors(); |
896 } | 922 } |
897 } | 923 } |
898 | 924 |
899 QueryManager::Query::Query( | 925 QueryManager::Query::Query(QueryManager* manager, |
900 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) | 926 GLenum target, |
| 927 int32_t shm_id, |
| 928 uint32_t shm_offset) |
901 : manager_(manager), | 929 : manager_(manager), |
902 target_(target), | 930 target_(target), |
903 shm_id_(shm_id), | 931 shm_id_(shm_id), |
904 shm_offset_(shm_offset), | 932 shm_offset_(shm_offset), |
905 submit_count_(0), | 933 submit_count_(0), |
906 query_state_(kQueryState_Initialize), | 934 query_state_(kQueryState_Initialize), |
907 deleted_(false) { | 935 deleted_(false) { |
908 DCHECK(manager); | 936 DCHECK(manager); |
909 manager_->StartTracking(this); | 937 manager_->StartTracking(this); |
910 } | 938 } |
(...skipping 17 matching lines...) Expand all Loading... |
928 // The query is getting deleted, either by the client or | 956 // The query is getting deleted, either by the client or |
929 // because the context was lost. Call any outstanding | 957 // because the context was lost. Call any outstanding |
930 // callbacks to avoid leaks. | 958 // callbacks to avoid leaks. |
931 RunCallbacks(); | 959 RunCallbacks(); |
932 if (manager_) { | 960 if (manager_) { |
933 manager_->StopTracking(this); | 961 manager_->StopTracking(this); |
934 manager_ = NULL; | 962 manager_ = NULL; |
935 } | 963 } |
936 } | 964 } |
937 | 965 |
938 bool QueryManager::Query::MarkAsCompleted(uint64 result) { | 966 bool QueryManager::Query::MarkAsCompleted(uint64_t result) { |
939 UnmarkAsPending(); | 967 UnmarkAsPending(); |
940 QuerySync* sync = manager_->decoder_->GetSharedMemoryAs<QuerySync*>( | 968 QuerySync* sync = manager_->decoder_->GetSharedMemoryAs<QuerySync*>( |
941 shm_id_, shm_offset_, sizeof(*sync)); | 969 shm_id_, shm_offset_, sizeof(*sync)); |
942 if (!sync) { | 970 if (!sync) { |
943 return false; | 971 return false; |
944 } | 972 } |
945 | 973 |
946 sync->result = result; | 974 sync->result = result; |
947 base::subtle::Release_Store(&sync->process_count, submit_count_); | 975 base::subtle::Release_Store(&sync->process_count, submit_count_); |
948 | 976 |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1095 for (std::pair<const GLenum, scoped_refptr<Query> >& it : active_queries_) { | 1123 for (std::pair<const GLenum, scoped_refptr<Query> >& it : active_queries_) { |
1096 if (it.second->IsPaused()) { | 1124 if (it.second->IsPaused()) { |
1097 it.second->Resume(); | 1125 it.second->Resume(); |
1098 DCHECK(it.second->IsActive()); | 1126 DCHECK(it.second->IsActive()); |
1099 } | 1127 } |
1100 } | 1128 } |
1101 } | 1129 } |
1102 | 1130 |
1103 } // namespace gles2 | 1131 } // namespace gles2 |
1104 } // namespace gpu | 1132 } // namespace gpu |
OLD | NEW |