Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |