Index: gpu/command_buffer/client/gles2_implementation.cc |
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc |
index 631cfe32ef56aab184f4a8aea41ea410c80df2e8..bed07ea80a7deff2b5fc3589c8f41b08b3536409 100644 |
--- a/gpu/command_buffer/client/gles2_implementation.cc |
+++ b/gpu/command_buffer/client/gles2_implementation.cc |
@@ -701,6 +701,13 @@ bool GLES2Implementation::GetHelper(GLenum pname, GLint* params) { |
return true; |
} |
break; |
+ case GL_TIMESTAMP_EXT: |
+ // We convert all GPU timestamps to CPU time. |
+ *params = static_cast<GLint>( |
no sievers
2015/06/23 21:45:27
I think this should be a saturated cast because of
David Yen
2015/06/23 23:35:32
Done.
|
+ (base::TraceTicks::Now() - base::TraceTicks()).InMicroseconds() |
+ * base::Time::kNanosecondsPerMicrosecond); |
+ return true; |
+ |
// Non-cached parameters. |
case GL_ALIASED_LINE_WIDTH_RANGE: |
@@ -991,6 +998,11 @@ bool GLES2Implementation::GetInteger64vHelper(GLenum pname, GLint64* params) { |
case GL_MAX_UNIFORM_BLOCK_SIZE: |
*params = capabilities_.max_uniform_block_size; |
return true; |
+ case GL_TIMESTAMP_EXT: |
+ // We convert all GPU timestamps to CPU time. |
+ *params = (base::TraceTicks::Now() - base::TraceTicks()).InMicroseconds() |
+ * base::Time::kNanosecondsPerMicrosecond; |
+ return true; |
default: |
break; |
} |
@@ -1052,6 +1064,63 @@ bool GLES2Implementation::GetSyncivHelper( |
return true; |
} |
+bool GLES2Implementation::GetQueryObjectValueHelper( |
+ const char* function_name, GLuint id, GLenum pname, GLuint64* params) { |
+ GPU_CLIENT_SINGLE_THREAD_CHECK(); |
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryObjectValueHelper(" |
+ << id << ", " |
+ << GLES2Util::GetStringQueryObjectParameter(pname) << ", " |
+ << static_cast<const void*>(params) << ")"); |
+ |
+ QueryTracker::Query* query = query_tracker_->GetQuery(id); |
+ if (!query) { |
+ SetGLError(GL_INVALID_OPERATION, |
+ function_name, "unknown query id"); |
+ return false; |
+ } |
+ |
+ QueryMap::iterator it = current_queries_.find(query->target()); |
+ if (it != current_queries_.end()) { |
+ SetGLError( |
+ GL_INVALID_OPERATION, |
+ function_name, |
+ "query active. Did you to call glEndQueryEXT?"); |
+ return false; |
+ } |
+ |
+ if (query->NeverUsed()) { |
+ SetGLError( |
+ GL_INVALID_OPERATION, |
+ function_name, "Never used. Did you call glBeginQueryEXT?"); |
+ return false; |
+ } |
+ |
+ bool valid_value = false; |
+ switch (pname) { |
+ case GL_QUERY_RESULT_EXT: |
+ if (!query->CheckResultsAvailable(helper_)) { |
+ helper_->WaitForToken(query->token()); |
+ if (!query->CheckResultsAvailable(helper_)) { |
+ FinishHelper(); |
+ CHECK(query->CheckResultsAvailable(helper_)); |
+ } |
+ } |
+ *params = query->GetResult(); |
+ valid_value = true; |
+ break; |
+ case GL_QUERY_RESULT_AVAILABLE_EXT: |
+ *params = query->CheckResultsAvailable(helper_); |
+ valid_value = true; |
+ break; |
+ default: |
+ SetGLErrorInvalidEnum(function_name, pname, "pname"); |
+ break; |
+ } |
+ GPU_CLIENT_LOG(" " << *params); |
+ CheckGLError(); |
+ return valid_value; |
+} |
+ |
GLuint GLES2Implementation::GetMaxValueInBufferCHROMIUMHelper( |
GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) { |
typedef cmds::GetMaxValueInBufferCHROMIUM::Result Result; |
@@ -4864,8 +4933,10 @@ void GLES2Implementation::GetQueryivEXT( |
<< GLES2Util::GetStringQueryTarget(target) << ", " |
<< GLES2Util::GetStringQueryParameter(pname) << ", " |
<< static_cast<const void*>(params) << ")"); |
- |
- if (pname != GL_CURRENT_QUERY_EXT) { |
+ if (pname == GL_QUERY_COUNTER_BITS_EXT) { |
+ *params = 64; |
+ return; |
+ } else if (pname != GL_CURRENT_QUERY_EXT) { |
SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname"); |
return; |
} |
@@ -4882,52 +4953,16 @@ void GLES2Implementation::GetQueryivEXT( |
void GLES2Implementation::GetQueryObjectuivEXT( |
GLuint id, GLenum pname, GLuint* params) { |
- GPU_CLIENT_SINGLE_THREAD_CHECK(); |
- GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" << id << ", " |
- << GLES2Util::GetStringQueryObjectParameter(pname) << ", " |
- << static_cast<const void*>(params) << ")"); |
- |
- QueryTracker::Query* query = query_tracker_->GetQuery(id); |
- if (!query) { |
- SetGLError(GL_INVALID_OPERATION, "glQueryObjectuivEXT", "unknown query id"); |
- return; |
- } |
- |
- QueryMap::iterator it = current_queries_.find(query->target()); |
- if (it != current_queries_.end()) { |
- SetGLError( |
- GL_INVALID_OPERATION, |
- "glQueryObjectuivEXT", "query active. Did you to call glEndQueryEXT?"); |
- return; |
- } |
- |
- if (query->NeverUsed()) { |
- SetGLError( |
- GL_INVALID_OPERATION, |
- "glQueryObjectuivEXT", "Never used. Did you call glBeginQueryEXT?"); |
- return; |
- } |
+ GLuint64 result = 0; |
+ if (GetQueryObjectValueHelper("glQueryObjectuivEXT", id, pname, &result)) |
+ *params = base::saturated_cast<GLuint>(result); |
+} |
- switch (pname) { |
- case GL_QUERY_RESULT_EXT: |
- if (!query->CheckResultsAvailable(helper_)) { |
- helper_->WaitForToken(query->token()); |
- if (!query->CheckResultsAvailable(helper_)) { |
- FinishHelper(); |
- CHECK(query->CheckResultsAvailable(helper_)); |
- } |
- } |
- *params = query->GetResult(); |
- break; |
- case GL_QUERY_RESULT_AVAILABLE_EXT: |
- *params = query->CheckResultsAvailable(helper_); |
- break; |
- default: |
- SetGLErrorInvalidEnum("glQueryObjectuivEXT", pname, "pname"); |
- break; |
- } |
- GPU_CLIENT_LOG(" " << *params); |
- CheckGLError(); |
+void GLES2Implementation::GetQueryObjectui64vEXT( |
+ GLuint id, GLenum pname, GLuint64* params) { |
+ GLuint64 result = 0; |
+ if (GetQueryObjectValueHelper("glQueryObjectui64vEXT", id, pname, &result)) |
+ *params = result; |
} |
void GLES2Implementation::DrawArraysInstancedANGLE( |