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

Side by Side Diff: ui/gl/gpu_timing.cc

Issue 1233233002: Added support for TimeStamp queries using QueryCounterEXT. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed unit test 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) 2015 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2015 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 "ui/gl/gpu_timing.h" 5 #include "ui/gl/gpu_timing.h"
6 6
7 #include "base/time/time.h" 7 #include "base/time/time.h"
8 #include "ui/gl/gl_bindings.h" 8 #include "ui/gl/gl_bindings.h"
9 #include "ui/gl/gl_context.h" 9 #include "ui/gl/gl_context.h"
10 #include "ui/gl/gl_version_info.h" 10 #include "ui/gl/gl_version_info.h"
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 DCHECK(context); 306 DCHECK(context);
307 const GLVersionInfo* version_info = context->GetVersionInfo(); 307 const GLVersionInfo* version_info = context->GetVersionInfo();
308 DCHECK(version_info); 308 DCHECK(version_info);
309 if (version_info->is_es3 && // glGetInteger64v is supported under ES3. 309 if (version_info->is_es3 && // glGetInteger64v is supported under ES3.
310 context->HasExtension("GL_EXT_disjoint_timer_query")) { 310 context->HasExtension("GL_EXT_disjoint_timer_query")) {
311 timer_type_ = GPUTiming::kTimerTypeDisjoint; 311 timer_type_ = GPUTiming::kTimerTypeDisjoint;
312 } else if (context->HasExtension("GL_ARB_timer_query")) { 312 } else if (context->HasExtension("GL_ARB_timer_query")) {
313 timer_type_ = GPUTiming::kTimerTypeARB; 313 timer_type_ = GPUTiming::kTimerTypeARB;
314 } else if (context->HasExtension("GL_EXT_timer_query")) { 314 } else if (context->HasExtension("GL_EXT_timer_query")) {
315 timer_type_ = GPUTiming::kTimerTypeEXT; 315 timer_type_ = GPUTiming::kTimerTypeEXT;
316 force_time_elapsed_query_ = true;
316 } 317 }
317 } 318 }
318 319
319 GPUTimingImpl::~GPUTimingImpl() { 320 GPUTimingImpl::~GPUTimingImpl() {
320 } 321 }
321 322
322 uint32_t GPUTimingImpl::GetDisjointCount() { 323 uint32_t GPUTimingImpl::GetDisjointCount() {
323 if (timer_type_ == GPUTiming::kTimerTypeDisjoint) { 324 if (timer_type_ == GPUTiming::kTimerTypeDisjoint) {
324 GLint disjoint_value = 0; 325 GLint disjoint_value = 0;
325 glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint_value); 326 glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint_value);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 queries_.back().get())->EndQuery(this, result); 369 queries_.back().get())->EndQuery(this, result);
369 } else { 370 } else {
370 // Simply end the query and reset the current offset 371 // Simply end the query and reset the current offset
371 DCHECK(GetLastElapsedQuery().get()); 372 DCHECK(GetLastElapsedQuery().get());
372 GetLastElapsedQuery()->EndQuery(this, result); 373 GetLastElapsedQuery()->EndQuery(this, result);
373 DCHECK(GetLastElapsedQuery().get() == nullptr); 374 DCHECK(GetLastElapsedQuery().get() == nullptr);
374 } 375 }
375 } 376 }
376 377
377 scoped_refptr<QueryResult> GPUTimingImpl::DoTimeStampQuery() { 378 scoped_refptr<QueryResult> GPUTimingImpl::DoTimeStampQuery() {
378 DCHECK(timer_type_ == GPUTiming::kTimerTypeDisjoint || 379 DCHECK(timer_type_ != GPUTiming::kTimerTypeInvalid);
379 timer_type_ == GPUTiming::kTimerTypeARB);
380 380
381 if (force_time_elapsed_query_) { 381 if (force_time_elapsed_query_) {
382 // Replace with elapsed timer queries instead. 382 // Replace with elapsed timer queries instead.
383 scoped_refptr<QueryResult> result = BeginElapsedTimeQuery(); 383 scoped_refptr<QueryResult> result = BeginElapsedTimeQuery();
384 EndElapsedTimeQuery(result); 384 EndElapsedTimeQuery(result);
385 return result; 385 return result;
386 } 386 }
387 387
388 queries_.push_back(new TimeStampTimerQuery(next_timer_query_id_++)); 388 queries_.push_back(new TimeStampTimerQuery(next_timer_query_id_++));
389 return static_cast<TimeStampTimerQuery*>(queries_.back().get())->DoQuery(); 389 return static_cast<TimeStampTimerQuery*>(queries_.back().get())->DoQuery();
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 if (have_context) { 469 if (have_context) {
470 if (!end_requested_) { 470 if (!end_requested_) {
471 DCHECK(gpu_timing_client_->gpu_timing_); 471 DCHECK(gpu_timing_client_->gpu_timing_);
472 DCHECK(elapsed_timer_result_.get()); 472 DCHECK(elapsed_timer_result_.get());
473 gpu_timing_client_->gpu_timing_->EndElapsedTimeQuery( 473 gpu_timing_client_->gpu_timing_->EndElapsedTimeQuery(
474 elapsed_timer_result_); 474 elapsed_timer_result_);
475 } 475 }
476 } 476 }
477 } 477 }
478 478
479 void GPUTimer::QueryTimeStamp() {
480 DCHECK(!end_requested_);
piman 2015/07/16 01:05:53 We can QueryCounter multiple times on the same que
David Yen 2015/07/16 20:21:12 Ah yes, GPUTimer has originally always been one us
481 DCHECK(gpu_timing_client_->gpu_timing_);
482 DCHECK(!time_stamp_result_.get() && !elapsed_timer_result_.get());
piman 2015/07/16 01:05:53 same here.
David Yen 2015/07/16 20:21:12 Done.
483 end_requested_ = true;
484 time_stamp_result_ = gpu_timing_client_->gpu_timing_->DoTimeStampQuery();
485 }
486
479 void GPUTimer::Start() { 487 void GPUTimer::Start() {
488 DCHECK(!end_requested_);
piman 2015/07/16 01:05:53 Is this valid? It looks like for the GL_TIME_ELAPS
David Yen 2015/07/16 20:21:12 Done.
480 DCHECK(gpu_timing_client_->gpu_timing_); 489 DCHECK(gpu_timing_client_->gpu_timing_);
490 DCHECK(!time_stamp_result_.get() && !elapsed_timer_result_.get());
piman 2015/07/16 01:05:53 Same here wrt !elapsed_timer_result_.get()
David Yen 2015/07/16 20:21:12 Done.
481 if (!use_elapsed_timer_) 491 if (!use_elapsed_timer_)
482 time_stamp_result_ = gpu_timing_client_->gpu_timing_->DoTimeStampQuery(); 492 time_stamp_result_ = gpu_timing_client_->gpu_timing_->DoTimeStampQuery();
483 493
484 elapsed_timer_result_ = 494 elapsed_timer_result_ =
485 gpu_timing_client_->gpu_timing_->BeginElapsedTimeQuery(); 495 gpu_timing_client_->gpu_timing_->BeginElapsedTimeQuery();
486 } 496 }
487 497
488 void GPUTimer::End() { 498 void GPUTimer::End() {
499 DCHECK(!end_requested_);
489 DCHECK(elapsed_timer_result_.get()); 500 DCHECK(elapsed_timer_result_.get());
490 end_requested_ = true; 501 end_requested_ = true;
491 gpu_timing_client_->gpu_timing_->EndElapsedTimeQuery(elapsed_timer_result_); 502 gpu_timing_client_->gpu_timing_->EndElapsedTimeQuery(elapsed_timer_result_);
492 } 503 }
493 504
494 bool GPUTimer::IsAvailable() { 505 bool GPUTimer::IsAvailable() {
495 if (!end_requested_) 506 if (!end_requested_)
496 return false; 507 return false;
497 if (!end_available_) { 508 if (!end_available_) {
498 DCHECK(elapsed_timer_result_.get()); 509 scoped_refptr<QueryResult> result =
499 if (elapsed_timer_result_->IsAvailable()) { 510 elapsed_timer_result_.get() ?
500 end_available_ = true; 511 elapsed_timer_result_ :
512 time_stamp_result_;
513
514 DCHECK(result.get());
515 if (result->IsAvailable()) {
516 end_available_ = true;
piman 2015/07/16 01:05:53 nit: indent looks wrong
David Yen 2015/07/16 20:21:12 No longer relevant as this section has been rewrit
501 } else { 517 } else {
502 gpu_timing_client_->gpu_timing_->UpdateQueryResults(); 518 gpu_timing_client_->gpu_timing_->UpdateQueryResults();
503 end_available_ = elapsed_timer_result_->IsAvailable(); 519 end_available_ = result->IsAvailable();
504 } 520 }
505 } 521 }
506 return end_available_; 522 return end_available_;
507 } 523 }
508 524
509 void GPUTimer::GetStartEndTimestamps(int64* start, int64* end) { 525 void GPUTimer::GetStartEndTimestamps(int64* start, int64* end) {
510 DCHECK(start && end); 526 DCHECK(start && end);
511 DCHECK(elapsed_timer_result_.get()); 527 DCHECK(elapsed_timer_result_.get() || time_stamp_result_.get());
512 DCHECK(IsAvailable()); 528 DCHECK(IsAvailable());
513 if (time_stamp_result_.get()) { 529 const int64_t time_stamp = time_stamp_result_.get() ?
514 DCHECK(time_stamp_result_->IsAvailable()); 530 time_stamp_result_->GetStartValue() :
515 const int64_t time_stamp = time_stamp_result_->GetStartValue(); 531 elapsed_timer_result_->GetStartValue();
516 *start = time_stamp; 532 const int64_t elapsed_time = elapsed_timer_result_.get() ?
517 *end = time_stamp + elapsed_timer_result_->GetDelta(); 533 elapsed_timer_result_->GetDelta() :
518 } else { 534 0;
519 // Use estimation from elasped timer results. 535
520 *start = elapsed_timer_result_->GetStartValue(); 536 *start = time_stamp;
521 *end = elapsed_timer_result_->GetEndValue(); 537 *end = time_stamp + elapsed_time;
522 }
523 } 538 }
524 539
525 int64 GPUTimer::GetDeltaElapsed() { 540 int64 GPUTimer::GetDeltaElapsed() {
526 DCHECK(elapsed_timer_result_.get());
527 DCHECK(IsAvailable()); 541 DCHECK(IsAvailable());
528 return elapsed_timer_result_->GetDelta(); 542 if (elapsed_timer_result_.get())
543 return elapsed_timer_result_->GetDelta();
544 return 0;
529 } 545 }
530 546
531 GPUTimer::GPUTimer(scoped_refptr<GPUTimingClient> gpu_timing_client, 547 GPUTimer::GPUTimer(scoped_refptr<GPUTimingClient> gpu_timing_client,
532 bool use_elapsed_timer) 548 bool use_elapsed_timer)
533 : use_elapsed_timer_(use_elapsed_timer), 549 : use_elapsed_timer_(use_elapsed_timer),
534 gpu_timing_client_(gpu_timing_client) { 550 gpu_timing_client_(gpu_timing_client) {
535 } 551 }
536 552
537 GPUTimingClient::GPUTimingClient(GPUTimingImpl* gpu_timing) 553 GPUTimingClient::GPUTimingClient(GPUTimingImpl* gpu_timing)
538 : gpu_timing_(gpu_timing) { 554 : gpu_timing_(gpu_timing) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 612
597 void GPUTimingClient::ForceTimeElapsedQuery() { 613 void GPUTimingClient::ForceTimeElapsedQuery() {
598 DCHECK(gpu_timing_); 614 DCHECK(gpu_timing_);
599 gpu_timing_->ForceTimeElapsedQuery(); 615 gpu_timing_->ForceTimeElapsedQuery();
600 } 616 }
601 617
602 GPUTimingClient::~GPUTimingClient() { 618 GPUTimingClient::~GPUTimingClient() {
603 } 619 }
604 620
605 } // namespace gfx 621 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698