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

Unified 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 side-by-side diff with in-line comments
Download patch
« 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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/query_manager.cc
diff --git a/gpu/command_buffer/service/query_manager.cc b/gpu/command_buffer/service/query_manager.cc
index 3de501a449932fe5181ab092d9bb008a4251b1e0..c4b7bfb1d6bf8de0dd2a5448d7a2106c116f180a 100644
--- a/gpu/command_buffer/service/query_manager.cc
+++ b/gpu/command_buffer/service/query_manager.cc
@@ -66,6 +66,7 @@ class AsyncPixelTransfersCompletedQuery
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
+ bool QueryCounter(base::subtle::Atomic32 submit_count) override;
bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
@@ -107,6 +108,12 @@ bool AsyncPixelTransfersCompletedQuery::End(
return AddToPendingTransferQueue(submit_count);
}
+bool AsyncPixelTransfersCompletedQuery::QueryCounter(
+ base::subtle::Atomic32 submit_count) {
+ NOTREACHED();
+ return false;
+}
+
bool AsyncPixelTransfersCompletedQuery::Process(bool did_finish) {
QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>(
shm_id(), shm_offset(), sizeof(*sync));
@@ -143,6 +150,7 @@ class AllSamplesPassedQuery : public QueryManager::Query {
GLuint service_id);
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
+ bool QueryCounter(base::subtle::Atomic32 submit_count) override;
bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
@@ -171,6 +179,11 @@ bool AllSamplesPassedQuery::End(base::subtle::Atomic32 submit_count) {
return AddToPendingQueue(submit_count);
}
+bool AllSamplesPassedQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
+ NOTREACHED();
+ return false;
+}
+
bool AllSamplesPassedQuery::Process(bool did_finish) {
GLuint available = 0;
glGetQueryObjectuiv(
@@ -202,6 +215,7 @@ class CommandsIssuedQuery : public QueryManager::Query {
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
+ bool QueryCounter(base::subtle::Atomic32 submit_count) override;
bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
@@ -228,6 +242,11 @@ bool CommandsIssuedQuery::End(base::subtle::Atomic32 submit_count) {
return MarkAsCompleted(elapsed.InMicroseconds());
}
+bool CommandsIssuedQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
+ NOTREACHED();
+ return false;
+}
+
bool CommandsIssuedQuery::Process(bool did_finish) {
NOTREACHED();
return true;
@@ -249,6 +268,7 @@ class CommandLatencyQuery : public QueryManager::Query {
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
+ bool QueryCounter(base::subtle::Atomic32 submit_count) override;
bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
@@ -271,6 +291,11 @@ bool CommandLatencyQuery::End(base::subtle::Atomic32 submit_count) {
return MarkAsCompleted(now.InMicroseconds());
}
+bool CommandLatencyQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
+ NOTREACHED();
+ return false;
+}
+
bool CommandLatencyQuery::Process(bool did_finish) {
NOTREACHED();
return true;
@@ -295,6 +320,7 @@ class AsyncReadPixelsCompletedQuery
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
+ bool QueryCounter(base::subtle::Atomic32 submit_count) override;
bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
@@ -329,6 +355,12 @@ bool AsyncReadPixelsCompletedQuery::End(base::subtle::Atomic32 submit_count) {
return Process(false);
}
+bool AsyncReadPixelsCompletedQuery::QueryCounter(
+ base::subtle::Atomic32 submit_count) {
+ NOTREACHED();
+ return false;
+}
+
void AsyncReadPixelsCompletedQuery::Complete() {
completed_ = true;
complete_result_ = MarkAsCompleted(1);
@@ -355,6 +387,7 @@ class GetErrorQuery : public QueryManager::Query {
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
+ bool QueryCounter(base::subtle::Atomic32 submit_count) override;
bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
@@ -378,6 +411,11 @@ bool GetErrorQuery::End(base::subtle::Atomic32 submit_count) {
return MarkAsCompleted(manager()->decoder()->GetErrorState()->GetGLError());
}
+bool GetErrorQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
+ NOTREACHED();
+ return false;
+}
+
bool GetErrorQuery::Process(bool did_finish) {
NOTREACHED();
return true;
@@ -402,6 +440,7 @@ class CommandsCompletedQuery : public QueryManager::Query {
// Overridden from QueryManager::Query:
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
+ bool QueryCounter(base::subtle::Atomic32 submit_count) override;
bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
@@ -430,6 +469,11 @@ bool CommandsCompletedQuery::End(base::subtle::Atomic32 submit_count) {
return AddToPendingQueue(submit_count);
}
+bool CommandsCompletedQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
+ NOTREACHED();
+ return false;
+}
+
bool CommandsCompletedQuery::Process(bool did_finish) {
// Note: |did_finish| guarantees that the GPU has passed the fence but
// we cannot assume that GLFence::HasCompleted() will return true yet as
@@ -460,6 +504,7 @@ class TimeElapsedQuery : public QueryManager::Query {
// Overridden from QueryManager::Query:
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
+ bool QueryCounter(base::subtle::Atomic32 submit_count) override;
bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
@@ -487,6 +532,11 @@ bool TimeElapsedQuery::End(base::subtle::Atomic32 submit_count) {
return AddToPendingQueue(submit_count);
}
+bool TimeElapsedQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
+ NOTREACHED();
+ return false;
+}
+
bool TimeElapsedQuery::Process(bool did_finish) {
if (!gpu_timer_->IsAvailable())
return true;
@@ -505,6 +555,71 @@ void TimeElapsedQuery::Destroy(bool have_context) {
TimeElapsedQuery::~TimeElapsedQuery() {}
+class TimeStampQuery : public QueryManager::Query {
+ public:
+ TimeStampQuery(QueryManager* manager,
+ GLenum target,
+ int32 shm_id,
+ uint32 shm_offset);
+
+ // Overridden from QueryManager::Query:
+ bool Begin() override;
+ bool End(base::subtle::Atomic32 submit_count) override;
+ bool QueryCounter(base::subtle::Atomic32 submit_count) override;
+ bool Process(bool did_finish) override;
+ void Destroy(bool have_context) override;
+
+ protected:
+ ~TimeStampQuery() override;
+
+ private:
+ scoped_ptr<gfx::GPUTimer> gpu_timer_;
+};
+
+TimeStampQuery::TimeStampQuery(QueryManager* manager,
+ GLenum target,
+ int32 shm_id,
+ uint32 shm_offset)
+ : Query(manager, target, shm_id, shm_offset),
+ gpu_timer_(manager->CreateGPUTimer(false)) {}
+
+bool TimeStampQuery::Begin() {
+ NOTREACHED();
+ return false;
+}
+
+bool TimeStampQuery::End(base::subtle::Atomic32 submit_count) {
+ NOTREACHED();
+ return false;
+}
+
+bool TimeStampQuery::QueryCounter(base::subtle::Atomic32 submit_count) {
+ gpu_timer_->QueryTimeStamp();
+ return AddToPendingQueue(submit_count);
+}
+
+bool TimeStampQuery::Process(bool did_finish) {
+ if (!gpu_timer_->IsAvailable())
+ return true;
+
+ int64_t start = 0;
+ int64_t end = 0;
+ gpu_timer_->GetStartEndTimestamps(&start, &end);
+ DCHECK(start == end);
+
+ const uint64_t nano_seconds = start * base::Time::kNanosecondsPerMicrosecond;
+ return MarkAsCompleted(nano_seconds);
+}
+
+void TimeStampQuery::Destroy(bool have_context) {
+ if (gpu_timer_.get()) {
+ gpu_timer_->Destroy(have_context);
+ gpu_timer_.reset();
+ }
+}
+
+TimeStampQuery::~TimeStampQuery() {}
+
QueryManager::QueryManager(
GLES2Decoder* decoder,
FeatureInfo* feature_info)
@@ -573,6 +688,9 @@ QueryManager::Query* QueryManager::CreateQuery(
case GL_TIME_ELAPSED:
query = new TimeElapsedQuery(this, target, shm_id, shm_offset);
break;
+ case GL_TIMESTAMP:
+ query = new TimeStampQuery(this, target, shm_id, shm_offset);
+ break;
default: {
GLuint service_id = 0;
glGenQueries(1, &service_id);
@@ -827,5 +945,11 @@ bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) {
return query->End(submit_count);
}
+bool QueryManager::QueryCounter(
+ Query* query, base::subtle::Atomic32 submit_count) {
+ DCHECK(query);
+ return query->QueryCounter(submit_count);
+}
+
} // namespace gles2
} // namespace gpu
« 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