| 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 "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 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 bool Begin() override; | 401 bool Begin() override; |
| 402 bool End(base::subtle::Atomic32 submit_count) override; | 402 bool End(base::subtle::Atomic32 submit_count) override; |
| 403 bool Process(bool did_finish) override; | 403 bool Process(bool did_finish) override; |
| 404 void Destroy(bool have_context) override; | 404 void Destroy(bool have_context) override; |
| 405 | 405 |
| 406 protected: | 406 protected: |
| 407 ~CommandsCompletedQuery() override; | 407 ~CommandsCompletedQuery() override; |
| 408 | 408 |
| 409 private: | 409 private: |
| 410 scoped_ptr<gfx::GLFence> fence_; | 410 scoped_ptr<gfx::GLFence> fence_; |
| 411 base::TimeTicks begin_time_; |
| 411 }; | 412 }; |
| 412 | 413 |
| 413 CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager, | 414 CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager, |
| 414 GLenum target, | 415 GLenum target, |
| 415 int32 shm_id, | 416 int32 shm_id, |
| 416 uint32 shm_offset) | 417 uint32 shm_offset) |
| 417 : Query(manager, target, shm_id, shm_offset) {} | 418 : Query(manager, target, shm_id, shm_offset) {} |
| 418 | 419 |
| 419 bool CommandsCompletedQuery::Begin() { return true; } | 420 bool CommandsCompletedQuery::Begin() { |
| 421 begin_time_ = base::TimeTicks::HighResNow(); |
| 422 return true; |
| 423 } |
| 420 | 424 |
| 421 bool CommandsCompletedQuery::End(base::subtle::Atomic32 submit_count) { | 425 bool CommandsCompletedQuery::End(base::subtle::Atomic32 submit_count) { |
| 422 fence_.reset(gfx::GLFence::Create()); | 426 fence_.reset(gfx::GLFence::Create()); |
| 423 DCHECK(fence_); | 427 DCHECK(fence_); |
| 424 return AddToPendingQueue(submit_count); | 428 return AddToPendingQueue(submit_count); |
| 425 } | 429 } |
| 426 | 430 |
| 427 bool CommandsCompletedQuery::Process(bool did_finish) { | 431 bool CommandsCompletedQuery::Process(bool did_finish) { |
| 428 // Note: |did_finish| guarantees that the GPU has passed the fence but | 432 // Note: |did_finish| guarantees that the GPU has passed the fence but |
| 429 // we cannot assume that GLFence::HasCompleted() will return true yet as | 433 // we cannot assume that GLFence::HasCompleted() will return true yet as |
| 430 // that's not guaranteed by all GLFence implementations. | 434 // that's not guaranteed by all GLFence implementations. |
| 431 // | |
| 432 // TODO(reveman): Add UMA stats to determine how common it is that glFinish() | |
| 433 // needs to be called for these queries to complete. crbug.com/431845 | |
| 434 if (!did_finish && fence_ && !fence_->HasCompleted()) | 435 if (!did_finish && fence_ && !fence_->HasCompleted()) |
| 435 return true; | 436 return true; |
| 436 | 437 |
| 437 return MarkAsCompleted(0); | 438 base::TimeDelta elapsed = base::TimeTicks::HighResNow() - begin_time_; |
| 439 return MarkAsCompleted(elapsed.InMicroseconds()); |
| 438 } | 440 } |
| 439 | 441 |
| 440 void CommandsCompletedQuery::Destroy(bool have_context) { | 442 void CommandsCompletedQuery::Destroy(bool have_context) { |
| 441 if (have_context && !IsDeleted()) { | 443 if (have_context && !IsDeleted()) { |
| 442 fence_.reset(); | 444 fence_.reset(); |
| 443 MarkAsDeleted(); | 445 MarkAsDeleted(); |
| 444 } | 446 } |
| 445 } | 447 } |
| 446 | 448 |
| 447 CommandsCompletedQuery::~CommandsCompletedQuery() {} | 449 CommandsCompletedQuery::~CommandsCompletedQuery() {} |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 745 bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) { | 747 bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) { |
| 746 DCHECK(query); | 748 DCHECK(query); |
| 747 if (!RemovePendingQuery(query)) { | 749 if (!RemovePendingQuery(query)) { |
| 748 return false; | 750 return false; |
| 749 } | 751 } |
| 750 return query->End(submit_count); | 752 return query->End(submit_count); |
| 751 } | 753 } |
| 752 | 754 |
| 753 } // namespace gles2 | 755 } // namespace gles2 |
| 754 } // namespace gpu | 756 } // namespace gpu |
| OLD | NEW |