| 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>(
|
| + (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(
|
|
|