Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: gpu/command_buffer/service/query_manager.cc

Issue 1233233002: Added support for TimeStamp queries using QueryCounterEXT. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removed GetQueryivEXT test with QueryCounter Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "base/atomicops.h" 7 #include "base/atomicops.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/shared_memory.h" 10 #include "base/memory/shared_memory.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 59
60 class AsyncPixelTransfersCompletedQuery 60 class AsyncPixelTransfersCompletedQuery
61 : public QueryManager::Query, 61 : public QueryManager::Query,
62 public base::SupportsWeakPtr<AsyncPixelTransfersCompletedQuery> { 62 public base::SupportsWeakPtr<AsyncPixelTransfersCompletedQuery> {
63 public: 63 public:
64 AsyncPixelTransfersCompletedQuery( 64 AsyncPixelTransfersCompletedQuery(
65 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); 65 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset);
66 66
67 bool Begin() override; 67 bool Begin() override;
68 bool End(base::subtle::Atomic32 submit_count) override; 68 bool End(base::subtle::Atomic32 submit_count) override;
69 bool QueryCounter(base::subtle::Atomic32 submit_count) override;
69 bool Process(bool did_finish) override; 70 bool Process(bool did_finish) override;
70 void Destroy(bool have_context) override; 71 void Destroy(bool have_context) override;
71 72
72 protected: 73 protected:
73 ~AsyncPixelTransfersCompletedQuery() override; 74 ~AsyncPixelTransfersCompletedQuery() override;
74 75
75 scoped_refptr<AsyncPixelTransferCompletionObserverImpl> observer_; 76 scoped_refptr<AsyncPixelTransferCompletionObserverImpl> observer_;
76 }; 77 };
77 78
78 AsyncPixelTransfersCompletedQuery::AsyncPixelTransfersCompletedQuery( 79 AsyncPixelTransfersCompletedQuery::AsyncPixelTransfersCompletedQuery(
(...skipping 21 matching lines...) Expand all
100 101
101 // Ask AsyncPixelTransferDelegate to run completion callback after all 102 // Ask AsyncPixelTransferDelegate to run completion callback after all
102 // previous async transfers are done. No guarantee that callback is run 103 // previous async transfers are done. No guarantee that callback is run
103 // on the current thread. 104 // on the current thread.
104 manager()->decoder()->GetAsyncPixelTransferManager()->AsyncNotifyCompletion( 105 manager()->decoder()->GetAsyncPixelTransferManager()->AsyncNotifyCompletion(
105 mem_params, observer_.get()); 106 mem_params, observer_.get());
106 107
107 return AddToPendingTransferQueue(submit_count); 108 return AddToPendingTransferQueue(submit_count);
108 } 109 }
109 110
111 bool AsyncPixelTransfersCompletedQuery::QueryCounter(
112 base::subtle::Atomic32 submit_count) {
113 NOTREACHED();
114 return false;
115 }
116
110 bool AsyncPixelTransfersCompletedQuery::Process(bool did_finish) { 117 bool AsyncPixelTransfersCompletedQuery::Process(bool did_finish) {
111 QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>( 118 QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>(
112 shm_id(), shm_offset(), sizeof(*sync)); 119 shm_id(), shm_offset(), sizeof(*sync));
113 if (!sync) 120 if (!sync)
114 return false; 121 return false;
115 122
116 // Check if completion callback has been run. sync->process_count atomicity 123 // Check if completion callback has been run. sync->process_count atomicity
117 // is guaranteed as this is already used to notify client of a completed 124 // is guaranteed as this is already used to notify client of a completed
118 // query. 125 // query.
119 if (base::subtle::Acquire_Load(&sync->process_count) != submit_count()) 126 if (base::subtle::Acquire_Load(&sync->process_count) != submit_count())
(...skipping 16 matching lines...) Expand all
136 143
137 } // namespace 144 } // namespace
138 145
139 class AllSamplesPassedQuery : public QueryManager::Query { 146 class AllSamplesPassedQuery : public QueryManager::Query {
140 public: 147 public:
141 AllSamplesPassedQuery( 148 AllSamplesPassedQuery(
142 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset, 149 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset,
143 GLuint service_id); 150 GLuint service_id);
144 bool Begin() override; 151 bool Begin() override;
145 bool End(base::subtle::Atomic32 submit_count) override; 152 bool End(base::subtle::Atomic32 submit_count) override;
153 bool QueryCounter(base::subtle::Atomic32 submit_count) override;
146 bool Process(bool did_finish) override; 154 bool Process(bool did_finish) override;
147 void Destroy(bool have_context) override; 155 void Destroy(bool have_context) override;
148 156
149 protected: 157 protected:
150 ~AllSamplesPassedQuery() override; 158 ~AllSamplesPassedQuery() override;
151 159
152 private: 160 private:
153 // Service side query id. 161 // Service side query id.
154 GLuint service_id_; 162 GLuint service_id_;
155 }; 163 };
156 164
157 AllSamplesPassedQuery::AllSamplesPassedQuery( 165 AllSamplesPassedQuery::AllSamplesPassedQuery(
158 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset, 166 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset,
159 GLuint service_id) 167 GLuint service_id)
160 : Query(manager, target, shm_id, shm_offset), 168 : Query(manager, target, shm_id, shm_offset),
161 service_id_(service_id) { 169 service_id_(service_id) {
162 } 170 }
163 171
164 bool AllSamplesPassedQuery::Begin() { 172 bool AllSamplesPassedQuery::Begin() {
165 BeginQueryHelper(target(), service_id_); 173 BeginQueryHelper(target(), service_id_);
166 return true; 174 return true;
167 } 175 }
168 176
169 bool AllSamplesPassedQuery::End(base::subtle::Atomic32 submit_count) { 177 bool AllSamplesPassedQuery::End(base::subtle::Atomic32 submit_count) {
170 EndQueryHelper(target()); 178 EndQueryHelper(target());
171 return AddToPendingQueue(submit_count); 179 return AddToPendingQueue(submit_count);
172 } 180 }
173 181
182 bool AllSamplesPassedQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
183 NOTREACHED();
184 return false;
185 }
186
174 bool AllSamplesPassedQuery::Process(bool did_finish) { 187 bool AllSamplesPassedQuery::Process(bool did_finish) {
175 GLuint available = 0; 188 GLuint available = 0;
176 glGetQueryObjectuiv( 189 glGetQueryObjectuiv(
177 service_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available); 190 service_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
178 if (!available) { 191 if (!available) {
179 return true; 192 return true;
180 } 193 }
181 GLuint result = 0; 194 GLuint result = 0;
182 glGetQueryObjectuiv( 195 glGetQueryObjectuiv(
183 service_id_, GL_QUERY_RESULT_EXT, &result); 196 service_id_, GL_QUERY_RESULT_EXT, &result);
(...skipping 11 matching lines...) Expand all
195 AllSamplesPassedQuery::~AllSamplesPassedQuery() { 208 AllSamplesPassedQuery::~AllSamplesPassedQuery() {
196 } 209 }
197 210
198 class CommandsIssuedQuery : public QueryManager::Query { 211 class CommandsIssuedQuery : public QueryManager::Query {
199 public: 212 public:
200 CommandsIssuedQuery( 213 CommandsIssuedQuery(
201 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); 214 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset);
202 215
203 bool Begin() override; 216 bool Begin() override;
204 bool End(base::subtle::Atomic32 submit_count) override; 217 bool End(base::subtle::Atomic32 submit_count) override;
218 bool QueryCounter(base::subtle::Atomic32 submit_count) override;
205 bool Process(bool did_finish) override; 219 bool Process(bool did_finish) override;
206 void Destroy(bool have_context) override; 220 void Destroy(bool have_context) override;
207 221
208 protected: 222 protected:
209 ~CommandsIssuedQuery() override; 223 ~CommandsIssuedQuery() override;
210 224
211 private: 225 private:
212 base::TimeTicks begin_time_; 226 base::TimeTicks begin_time_;
213 }; 227 };
214 228
215 CommandsIssuedQuery::CommandsIssuedQuery( 229 CommandsIssuedQuery::CommandsIssuedQuery(
216 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) 230 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset)
217 : Query(manager, target, shm_id, shm_offset) { 231 : Query(manager, target, shm_id, shm_offset) {
218 } 232 }
219 233
220 bool CommandsIssuedQuery::Begin() { 234 bool CommandsIssuedQuery::Begin() {
221 begin_time_ = base::TimeTicks::Now(); 235 begin_time_ = base::TimeTicks::Now();
222 return true; 236 return true;
223 } 237 }
224 238
225 bool CommandsIssuedQuery::End(base::subtle::Atomic32 submit_count) { 239 bool CommandsIssuedQuery::End(base::subtle::Atomic32 submit_count) {
226 base::TimeDelta elapsed = base::TimeTicks::Now() - begin_time_; 240 base::TimeDelta elapsed = base::TimeTicks::Now() - begin_time_;
227 MarkAsPending(submit_count); 241 MarkAsPending(submit_count);
228 return MarkAsCompleted(elapsed.InMicroseconds()); 242 return MarkAsCompleted(elapsed.InMicroseconds());
229 } 243 }
230 244
245 bool CommandsIssuedQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
246 NOTREACHED();
247 return false;
248 }
249
231 bool CommandsIssuedQuery::Process(bool did_finish) { 250 bool CommandsIssuedQuery::Process(bool did_finish) {
232 NOTREACHED(); 251 NOTREACHED();
233 return true; 252 return true;
234 } 253 }
235 254
236 void CommandsIssuedQuery::Destroy(bool /* have_context */) { 255 void CommandsIssuedQuery::Destroy(bool /* have_context */) {
237 if (!IsDeleted()) { 256 if (!IsDeleted()) {
238 MarkAsDeleted(); 257 MarkAsDeleted();
239 } 258 }
240 } 259 }
241 260
242 CommandsIssuedQuery::~CommandsIssuedQuery() { 261 CommandsIssuedQuery::~CommandsIssuedQuery() {
243 } 262 }
244 263
245 class CommandLatencyQuery : public QueryManager::Query { 264 class CommandLatencyQuery : public QueryManager::Query {
246 public: 265 public:
247 CommandLatencyQuery( 266 CommandLatencyQuery(
248 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); 267 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset);
249 268
250 bool Begin() override; 269 bool Begin() override;
251 bool End(base::subtle::Atomic32 submit_count) override; 270 bool End(base::subtle::Atomic32 submit_count) override;
271 bool QueryCounter(base::subtle::Atomic32 submit_count) override;
252 bool Process(bool did_finish) override; 272 bool Process(bool did_finish) override;
253 void Destroy(bool have_context) override; 273 void Destroy(bool have_context) override;
254 274
255 protected: 275 protected:
256 ~CommandLatencyQuery() override; 276 ~CommandLatencyQuery() override;
257 }; 277 };
258 278
259 CommandLatencyQuery::CommandLatencyQuery( 279 CommandLatencyQuery::CommandLatencyQuery(
260 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) 280 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset)
261 : Query(manager, target, shm_id, shm_offset) { 281 : Query(manager, target, shm_id, shm_offset) {
262 } 282 }
263 283
264 bool CommandLatencyQuery::Begin() { 284 bool CommandLatencyQuery::Begin() {
265 return true; 285 return true;
266 } 286 }
267 287
268 bool CommandLatencyQuery::End(base::subtle::Atomic32 submit_count) { 288 bool CommandLatencyQuery::End(base::subtle::Atomic32 submit_count) {
269 base::TimeDelta now = base::TimeTicks::Now() - base::TimeTicks(); 289 base::TimeDelta now = base::TimeTicks::Now() - base::TimeTicks();
270 MarkAsPending(submit_count); 290 MarkAsPending(submit_count);
271 return MarkAsCompleted(now.InMicroseconds()); 291 return MarkAsCompleted(now.InMicroseconds());
272 } 292 }
273 293
294 bool CommandLatencyQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
295 NOTREACHED();
296 return false;
297 }
298
274 bool CommandLatencyQuery::Process(bool did_finish) { 299 bool CommandLatencyQuery::Process(bool did_finish) {
275 NOTREACHED(); 300 NOTREACHED();
276 return true; 301 return true;
277 } 302 }
278 303
279 void CommandLatencyQuery::Destroy(bool /* have_context */) { 304 void CommandLatencyQuery::Destroy(bool /* have_context */) {
280 if (!IsDeleted()) { 305 if (!IsDeleted()) {
281 MarkAsDeleted(); 306 MarkAsDeleted();
282 } 307 }
283 } 308 }
284 309
285 CommandLatencyQuery::~CommandLatencyQuery() { 310 CommandLatencyQuery::~CommandLatencyQuery() {
286 } 311 }
287 312
288 313
289 class AsyncReadPixelsCompletedQuery 314 class AsyncReadPixelsCompletedQuery
290 : public QueryManager::Query, 315 : public QueryManager::Query,
291 public base::SupportsWeakPtr<AsyncReadPixelsCompletedQuery> { 316 public base::SupportsWeakPtr<AsyncReadPixelsCompletedQuery> {
292 public: 317 public:
293 AsyncReadPixelsCompletedQuery( 318 AsyncReadPixelsCompletedQuery(
294 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); 319 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset);
295 320
296 bool Begin() override; 321 bool Begin() override;
297 bool End(base::subtle::Atomic32 submit_count) override; 322 bool End(base::subtle::Atomic32 submit_count) override;
323 bool QueryCounter(base::subtle::Atomic32 submit_count) override;
298 bool Process(bool did_finish) override; 324 bool Process(bool did_finish) override;
299 void Destroy(bool have_context) override; 325 void Destroy(bool have_context) override;
300 326
301 protected: 327 protected:
302 void Complete(); 328 void Complete();
303 ~AsyncReadPixelsCompletedQuery() override; 329 ~AsyncReadPixelsCompletedQuery() override;
304 330
305 private: 331 private:
306 bool completed_; 332 bool completed_;
307 bool complete_result_; 333 bool complete_result_;
(...skipping 14 matching lines...) Expand all
322 if (!AddToPendingQueue(submit_count)) { 348 if (!AddToPendingQueue(submit_count)) {
323 return false; 349 return false;
324 } 350 }
325 manager()->decoder()->WaitForReadPixels( 351 manager()->decoder()->WaitForReadPixels(
326 base::Bind(&AsyncReadPixelsCompletedQuery::Complete, 352 base::Bind(&AsyncReadPixelsCompletedQuery::Complete,
327 AsWeakPtr())); 353 AsWeakPtr()));
328 354
329 return Process(false); 355 return Process(false);
330 } 356 }
331 357
358 bool AsyncReadPixelsCompletedQuery::QueryCounter(
359 base::subtle::Atomic32 submit_count) {
360 NOTREACHED();
361 return false;
362 }
363
332 void AsyncReadPixelsCompletedQuery::Complete() { 364 void AsyncReadPixelsCompletedQuery::Complete() {
333 completed_ = true; 365 completed_ = true;
334 complete_result_ = MarkAsCompleted(1); 366 complete_result_ = MarkAsCompleted(1);
335 } 367 }
336 368
337 bool AsyncReadPixelsCompletedQuery::Process(bool did_finish) { 369 bool AsyncReadPixelsCompletedQuery::Process(bool did_finish) {
338 return !completed_ || complete_result_; 370 return !completed_ || complete_result_;
339 } 371 }
340 372
341 void AsyncReadPixelsCompletedQuery::Destroy(bool /* have_context */) { 373 void AsyncReadPixelsCompletedQuery::Destroy(bool /* have_context */) {
342 if (!IsDeleted()) { 374 if (!IsDeleted()) {
343 MarkAsDeleted(); 375 MarkAsDeleted();
344 } 376 }
345 } 377 }
346 378
347 AsyncReadPixelsCompletedQuery::~AsyncReadPixelsCompletedQuery() { 379 AsyncReadPixelsCompletedQuery::~AsyncReadPixelsCompletedQuery() {
348 } 380 }
349 381
350 382
351 class GetErrorQuery : public QueryManager::Query { 383 class GetErrorQuery : public QueryManager::Query {
352 public: 384 public:
353 GetErrorQuery( 385 GetErrorQuery(
354 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); 386 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset);
355 387
356 bool Begin() override; 388 bool Begin() override;
357 bool End(base::subtle::Atomic32 submit_count) override; 389 bool End(base::subtle::Atomic32 submit_count) override;
390 bool QueryCounter(base::subtle::Atomic32 submit_count) override;
358 bool Process(bool did_finish) override; 391 bool Process(bool did_finish) override;
359 void Destroy(bool have_context) override; 392 void Destroy(bool have_context) override;
360 393
361 protected: 394 protected:
362 ~GetErrorQuery() override; 395 ~GetErrorQuery() override;
363 396
364 private: 397 private:
365 }; 398 };
366 399
367 GetErrorQuery::GetErrorQuery( 400 GetErrorQuery::GetErrorQuery(
368 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) 401 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset)
369 : Query(manager, target, shm_id, shm_offset) { 402 : Query(manager, target, shm_id, shm_offset) {
370 } 403 }
371 404
372 bool GetErrorQuery::Begin() { 405 bool GetErrorQuery::Begin() {
373 return true; 406 return true;
374 } 407 }
375 408
376 bool GetErrorQuery::End(base::subtle::Atomic32 submit_count) { 409 bool GetErrorQuery::End(base::subtle::Atomic32 submit_count) {
377 MarkAsPending(submit_count); 410 MarkAsPending(submit_count);
378 return MarkAsCompleted(manager()->decoder()->GetErrorState()->GetGLError()); 411 return MarkAsCompleted(manager()->decoder()->GetErrorState()->GetGLError());
379 } 412 }
380 413
414 bool GetErrorQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
415 NOTREACHED();
416 return false;
417 }
418
381 bool GetErrorQuery::Process(bool did_finish) { 419 bool GetErrorQuery::Process(bool did_finish) {
382 NOTREACHED(); 420 NOTREACHED();
383 return true; 421 return true;
384 } 422 }
385 423
386 void GetErrorQuery::Destroy(bool /* have_context */) { 424 void GetErrorQuery::Destroy(bool /* have_context */) {
387 if (!IsDeleted()) { 425 if (!IsDeleted()) {
388 MarkAsDeleted(); 426 MarkAsDeleted();
389 } 427 }
390 } 428 }
391 429
392 GetErrorQuery::~GetErrorQuery() { 430 GetErrorQuery::~GetErrorQuery() {
393 } 431 }
394 432
395 class CommandsCompletedQuery : public QueryManager::Query { 433 class CommandsCompletedQuery : public QueryManager::Query {
396 public: 434 public:
397 CommandsCompletedQuery(QueryManager* manager, 435 CommandsCompletedQuery(QueryManager* manager,
398 GLenum target, 436 GLenum target,
399 int32 shm_id, 437 int32 shm_id,
400 uint32 shm_offset); 438 uint32 shm_offset);
401 439
402 // Overridden from QueryManager::Query: 440 // Overridden from QueryManager::Query:
403 bool Begin() override; 441 bool Begin() override;
404 bool End(base::subtle::Atomic32 submit_count) override; 442 bool End(base::subtle::Atomic32 submit_count) override;
443 bool QueryCounter(base::subtle::Atomic32 submit_count) override;
405 bool Process(bool did_finish) override; 444 bool Process(bool did_finish) override;
406 void Destroy(bool have_context) override; 445 void Destroy(bool have_context) override;
407 446
408 protected: 447 protected:
409 ~CommandsCompletedQuery() override; 448 ~CommandsCompletedQuery() override;
410 449
411 private: 450 private:
412 scoped_ptr<gfx::GLFence> fence_; 451 scoped_ptr<gfx::GLFence> fence_;
413 base::TimeTicks begin_time_; 452 base::TimeTicks begin_time_;
414 }; 453 };
415 454
416 CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager, 455 CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager,
417 GLenum target, 456 GLenum target,
418 int32 shm_id, 457 int32 shm_id,
419 uint32 shm_offset) 458 uint32 shm_offset)
420 : Query(manager, target, shm_id, shm_offset) {} 459 : Query(manager, target, shm_id, shm_offset) {}
421 460
422 bool CommandsCompletedQuery::Begin() { 461 bool CommandsCompletedQuery::Begin() {
423 begin_time_ = base::TimeTicks::Now(); 462 begin_time_ = base::TimeTicks::Now();
424 return true; 463 return true;
425 } 464 }
426 465
427 bool CommandsCompletedQuery::End(base::subtle::Atomic32 submit_count) { 466 bool CommandsCompletedQuery::End(base::subtle::Atomic32 submit_count) {
428 fence_.reset(gfx::GLFence::Create()); 467 fence_.reset(gfx::GLFence::Create());
429 DCHECK(fence_); 468 DCHECK(fence_);
430 return AddToPendingQueue(submit_count); 469 return AddToPendingQueue(submit_count);
431 } 470 }
432 471
472 bool CommandsCompletedQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
473 NOTREACHED();
474 return false;
475 }
476
433 bool CommandsCompletedQuery::Process(bool did_finish) { 477 bool CommandsCompletedQuery::Process(bool did_finish) {
434 // Note: |did_finish| guarantees that the GPU has passed the fence but 478 // Note: |did_finish| guarantees that the GPU has passed the fence but
435 // we cannot assume that GLFence::HasCompleted() will return true yet as 479 // we cannot assume that GLFence::HasCompleted() will return true yet as
436 // that's not guaranteed by all GLFence implementations. 480 // that's not guaranteed by all GLFence implementations.
437 if (!did_finish && fence_ && !fence_->HasCompleted()) 481 if (!did_finish && fence_ && !fence_->HasCompleted())
438 return true; 482 return true;
439 483
440 base::TimeDelta elapsed = base::TimeTicks::Now() - begin_time_; 484 base::TimeDelta elapsed = base::TimeTicks::Now() - begin_time_;
441 return MarkAsCompleted(elapsed.InMicroseconds()); 485 return MarkAsCompleted(elapsed.InMicroseconds());
442 } 486 }
(...skipping 10 matching lines...) Expand all
453 class TimeElapsedQuery : public QueryManager::Query { 497 class TimeElapsedQuery : public QueryManager::Query {
454 public: 498 public:
455 TimeElapsedQuery(QueryManager* manager, 499 TimeElapsedQuery(QueryManager* manager,
456 GLenum target, 500 GLenum target,
457 int32 shm_id, 501 int32 shm_id,
458 uint32 shm_offset); 502 uint32 shm_offset);
459 503
460 // Overridden from QueryManager::Query: 504 // Overridden from QueryManager::Query:
461 bool Begin() override; 505 bool Begin() override;
462 bool End(base::subtle::Atomic32 submit_count) override; 506 bool End(base::subtle::Atomic32 submit_count) override;
507 bool QueryCounter(base::subtle::Atomic32 submit_count) override;
463 bool Process(bool did_finish) override; 508 bool Process(bool did_finish) override;
464 void Destroy(bool have_context) override; 509 void Destroy(bool have_context) override;
465 510
466 protected: 511 protected:
467 ~TimeElapsedQuery() override; 512 ~TimeElapsedQuery() override;
468 513
469 private: 514 private:
470 scoped_ptr<gfx::GPUTimer> gpu_timer_; 515 scoped_ptr<gfx::GPUTimer> gpu_timer_;
471 }; 516 };
472 517
473 TimeElapsedQuery::TimeElapsedQuery(QueryManager* manager, 518 TimeElapsedQuery::TimeElapsedQuery(QueryManager* manager,
474 GLenum target, 519 GLenum target,
475 int32 shm_id, 520 int32 shm_id,
476 uint32 shm_offset) 521 uint32 shm_offset)
477 : Query(manager, target, shm_id, shm_offset), 522 : Query(manager, target, shm_id, shm_offset),
478 gpu_timer_(manager->CreateGPUTimer(true)) {} 523 gpu_timer_(manager->CreateGPUTimer(true)) {}
479 524
480 bool TimeElapsedQuery::Begin() { 525 bool TimeElapsedQuery::Begin() {
481 gpu_timer_->Start(); 526 gpu_timer_->Start();
482 return true; 527 return true;
483 } 528 }
484 529
485 bool TimeElapsedQuery::End(base::subtle::Atomic32 submit_count) { 530 bool TimeElapsedQuery::End(base::subtle::Atomic32 submit_count) {
486 gpu_timer_->End(); 531 gpu_timer_->End();
487 return AddToPendingQueue(submit_count); 532 return AddToPendingQueue(submit_count);
488 } 533 }
489 534
535 bool TimeElapsedQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
536 NOTREACHED();
537 return false;
538 }
539
490 bool TimeElapsedQuery::Process(bool did_finish) { 540 bool TimeElapsedQuery::Process(bool did_finish) {
491 if (!gpu_timer_->IsAvailable()) 541 if (!gpu_timer_->IsAvailable())
492 return true; 542 return true;
493 543
494 const uint64_t nano_seconds = 544 const uint64_t nano_seconds =
495 gpu_timer_->GetDeltaElapsed() * base::Time::kNanosecondsPerMicrosecond; 545 gpu_timer_->GetDeltaElapsed() * base::Time::kNanosecondsPerMicrosecond;
496 return MarkAsCompleted(nano_seconds); 546 return MarkAsCompleted(nano_seconds);
497 } 547 }
498 548
499 void TimeElapsedQuery::Destroy(bool have_context) { 549 void TimeElapsedQuery::Destroy(bool have_context) {
500 if (gpu_timer_.get()) { 550 if (gpu_timer_.get()) {
501 gpu_timer_->Destroy(have_context); 551 gpu_timer_->Destroy(have_context);
502 gpu_timer_.reset(); 552 gpu_timer_.reset();
503 } 553 }
504 } 554 }
505 555
506 TimeElapsedQuery::~TimeElapsedQuery() {} 556 TimeElapsedQuery::~TimeElapsedQuery() {}
507 557
558 class TimeStampQuery : public QueryManager::Query {
559 public:
560 TimeStampQuery(QueryManager* manager,
561 GLenum target,
562 int32 shm_id,
563 uint32 shm_offset);
564
565 // Overridden from QueryManager::Query:
566 bool Begin() override;
567 bool End(base::subtle::Atomic32 submit_count) override;
568 bool QueryCounter(base::subtle::Atomic32 submit_count) override;
569 bool Process(bool did_finish) override;
570 void Destroy(bool have_context) override;
571
572 protected:
573 ~TimeStampQuery() override;
574
575 private:
576 scoped_ptr<gfx::GPUTimer> gpu_timer_;
577 };
578
579 TimeStampQuery::TimeStampQuery(QueryManager* manager,
580 GLenum target,
581 int32 shm_id,
582 uint32 shm_offset)
583 : Query(manager, target, shm_id, shm_offset),
584 gpu_timer_(manager->CreateGPUTimer(false)) {}
585
586 bool TimeStampQuery::Begin() {
587 NOTREACHED();
588 return false;
589 }
590
591 bool TimeStampQuery::End(base::subtle::Atomic32 submit_count) {
592 NOTREACHED();
593 return false;
594 }
595
596 bool TimeStampQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
597 gpu_timer_->QueryTimeStamp();
598 return AddToPendingQueue(submit_count);
599 }
600
601 bool TimeStampQuery::Process(bool did_finish) {
602 if (!gpu_timer_->IsAvailable())
603 return true;
604
605 int64_t start = 0;
606 int64_t end = 0;
607 gpu_timer_->GetStartEndTimestamps(&start, &end);
608 DCHECK(start == end);
609
610 const uint64_t nano_seconds = start * base::Time::kNanosecondsPerMicrosecond;
611 return MarkAsCompleted(nano_seconds);
612 }
613
614 void TimeStampQuery::Destroy(bool have_context) {
615 if (gpu_timer_.get()) {
616 gpu_timer_->Destroy(have_context);
617 gpu_timer_.reset();
618 }
619 }
620
621 TimeStampQuery::~TimeStampQuery() {}
622
508 QueryManager::QueryManager( 623 QueryManager::QueryManager(
509 GLES2Decoder* decoder, 624 GLES2Decoder* decoder,
510 FeatureInfo* feature_info) 625 FeatureInfo* feature_info)
511 : decoder_(decoder), 626 : decoder_(decoder),
512 use_arb_occlusion_query2_for_occlusion_query_boolean_( 627 use_arb_occlusion_query2_for_occlusion_query_boolean_(
513 feature_info->feature_flags( 628 feature_info->feature_flags(
514 ).use_arb_occlusion_query2_for_occlusion_query_boolean), 629 ).use_arb_occlusion_query2_for_occlusion_query_boolean),
515 use_arb_occlusion_query_for_occlusion_query_boolean_( 630 use_arb_occlusion_query_for_occlusion_query_boolean_(
516 feature_info->feature_flags( 631 feature_info->feature_flags(
517 ).use_arb_occlusion_query_for_occlusion_query_boolean), 632 ).use_arb_occlusion_query_for_occlusion_query_boolean),
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 break; 681 break;
567 case GL_GET_ERROR_QUERY_CHROMIUM: 682 case GL_GET_ERROR_QUERY_CHROMIUM:
568 query = new GetErrorQuery(this, target, shm_id, shm_offset); 683 query = new GetErrorQuery(this, target, shm_id, shm_offset);
569 break; 684 break;
570 case GL_COMMANDS_COMPLETED_CHROMIUM: 685 case GL_COMMANDS_COMPLETED_CHROMIUM:
571 query = new CommandsCompletedQuery(this, target, shm_id, shm_offset); 686 query = new CommandsCompletedQuery(this, target, shm_id, shm_offset);
572 break; 687 break;
573 case GL_TIME_ELAPSED: 688 case GL_TIME_ELAPSED:
574 query = new TimeElapsedQuery(this, target, shm_id, shm_offset); 689 query = new TimeElapsedQuery(this, target, shm_id, shm_offset);
575 break; 690 break;
691 case GL_TIMESTAMP:
692 query = new TimeStampQuery(this, target, shm_id, shm_offset);
693 break;
576 default: { 694 default: {
577 GLuint service_id = 0; 695 GLuint service_id = 0;
578 glGenQueries(1, &service_id); 696 glGenQueries(1, &service_id);
579 DCHECK_NE(0u, service_id); 697 DCHECK_NE(0u, service_id);
580 query = new AllSamplesPassedQuery( 698 query = new AllSamplesPassedQuery(
581 this, target, shm_id, shm_offset, service_id); 699 this, target, shm_id, shm_offset, service_id);
582 break; 700 break;
583 } 701 }
584 } 702 }
585 std::pair<QueryMap::iterator, bool> result = 703 std::pair<QueryMap::iterator, bool> result =
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
820 } 938 }
821 939
822 bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) { 940 bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) {
823 DCHECK(query); 941 DCHECK(query);
824 if (!RemovePendingQuery(query)) { 942 if (!RemovePendingQuery(query)) {
825 return false; 943 return false;
826 } 944 }
827 return query->End(submit_count); 945 return query->End(submit_count);
828 } 946 }
829 947
948 bool QueryManager::QueryCounter(
949 Query* query, base::subtle::Atomic32 submit_count) {
950 DCHECK(query);
951 return query->QueryCounter(submit_count);
952 }
953
830 } // namespace gles2 954 } // namespace gles2
831 } // namespace gpu 955 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/query_manager.h ('k') | gpu/command_buffer/service/query_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698