Chromium Code Reviews| 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( |