Skip to content

Commit

Permalink
Revert of revert of time elapsed queries through command buffer.
Browse files Browse the repository at this point in the history
The original CL was thought to have caused a crash, but it was found to
be merely changing the callstack for an already existing crash.

Original issue's description:
> Added support for Time Elapsed queries through the command buffer.
>
> This CL adds support for Time Elapsed queries through the command
> buffer.
>
> Since it was easy to support, I have also added support
> for getting the current TimeStamp through GetInteger64(),
> GetInteger()...etc. Note that this is different from getting the
> GPU timestamp using QueryCounter which is asynchronous.
>
> BUG=345227
> TEST=trybots
>
> Committed: https://crrev.com/1b6a2940fcb25df247b9f8b795e84e1ca5742904
> Cr-Commit-Position: refs/heads/master@{#336743}

This reverts commit 6c3e20e.

BUG=345227, 506120
TEST=trybots

Review URL: https://codereview.chromium.org/1225353002

Cr-Commit-Position: refs/heads/master@{#338170}
  • Loading branch information
dyen authored and Commit bot committed Jul 9, 2015
1 parent a6fd7d0 commit 639959f
Show file tree
Hide file tree
Showing 27 changed files with 291 additions and 86 deletions.
1 change: 1 addition & 0 deletions gpu/GLES2/gl2chromium_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,7 @@
#define glEndTransformFeedback GLES2_GET_FUN(EndTransformFeedback)
#define glGetQueryivEXT GLES2_GET_FUN(GetQueryivEXT)
#define glGetQueryObjectuivEXT GLES2_GET_FUN(GetQueryObjectuivEXT)
#define glGetQueryObjectui64vEXT GLES2_GET_FUN(GetQueryObjectui64vEXT)
#define glInsertEventMarkerEXT GLES2_GET_FUN(InsertEventMarkerEXT)
#define glPushGroupMarkerEXT GLES2_GET_FUN(PushGroupMarkerEXT)
#define glPopGroupMarkerEXT GLES2_GET_FUN(PopGroupMarkerEXT)
Expand Down
6 changes: 6 additions & 0 deletions gpu/command_buffer/build_gles2_cmd_buffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -3744,6 +3744,12 @@
'pepper_interface': 'Query',
'extension': "occlusion_query_EXT",
},
'GetQueryObjectui64vEXT': {
'gen_cmd': False,
'client_test': False,
'gl_test_func': 'glGetQueryObjectui64v',
'extension': "disjoint_timer_query_EXT",
},
'BindUniformLocationCHROMIUM': {
'type': 'GLchar',
'extension': True,
Expand Down
7 changes: 7 additions & 0 deletions gpu/command_buffer/client/gles2_c_lib_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -1070,6 +1070,9 @@ void GLES2GetQueryivEXT(GLenum target, GLenum pname, GLint* params) {
void GLES2GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* params) {
gles2::GetGLContext()->GetQueryObjectuivEXT(id, pname, params);
}
void GLES2GetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64* params) {
gles2::GetGLContext()->GetQueryObjectui64vEXT(id, pname, params);
}
void GLES2InsertEventMarkerEXT(GLsizei length, const GLchar* marker) {
gles2::GetGLContext()->InsertEventMarkerEXT(length, marker);
}
Expand Down Expand Up @@ -2357,6 +2360,10 @@ extern const NameToFunc g_gles2_function_table[] = {
"glGetQueryObjectuivEXT",
reinterpret_cast<GLES2FunctionPointer>(glGetQueryObjectuivEXT),
},
{
"glGetQueryObjectui64vEXT",
reinterpret_cast<GLES2FunctionPointer>(glGetQueryObjectui64vEXT),
},
{
"glInsertEventMarkerEXT",
reinterpret_cast<GLES2FunctionPointer>(glInsertEventMarkerEXT),
Expand Down
137 changes: 91 additions & 46 deletions gpu/command_buffer/client/gles2_implementation.cc
Original file line number Diff line number Diff line change
Expand Up @@ -707,6 +707,13 @@ bool GLES2Implementation::GetHelper(GLenum pname, GLint* params) {
return true;
}
break;
// TODO(dyen): Also support GL_GPU_DISJOINT_EXT.
case GL_TIMESTAMP_EXT:
// We convert all GPU timestamps to CPU time.
*params = base::saturated_cast<GLint>(
(base::TraceTicks::Now() - base::TraceTicks()).InMicroseconds()
* base::Time::kNanosecondsPerMicrosecond);
return true;

// Non-cached parameters.
case GL_ALIASED_LINE_WIDTH_RANGE:
Expand Down Expand Up @@ -997,6 +1004,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;
}
Expand Down Expand Up @@ -1058,6 +1070,62 @@ 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;
}

if (query->Active()) {
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;
Expand Down Expand Up @@ -4809,6 +4877,15 @@ void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) {
return;
}
break;
// TODO(dyen): Also support GL_TIMESTAMP.
case GL_TIME_ELAPSED_EXT:
if (!capabilities_.timer_queries) {
SetGLError(
GL_INVALID_OPERATION, "glBeginQueryEXT",
"not enabled for timing queries");
return;
}
break;
default:
SetGLError(
GL_INVALID_OPERATION, "glBeginQueryEXT", "unknown query target");
Expand Down Expand Up @@ -4858,8 +4935,11 @@ 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) {
// We convert all queries to CPU time so we support 64 bits.
*params = 64;
return;
} else if (pname != GL_CURRENT_QUERY_EXT) {
SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname");
return;
}
Expand All @@ -4871,51 +4951,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;
}

if (query->Active()) {
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(
Expand Down
2 changes: 2 additions & 0 deletions gpu/command_buffer/client/gles2_implementation.h
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,8 @@ class GLES2_IMPL_EXPORT GLES2Implementation
bool GetSyncivHelper(
GLsync sync, GLenum pname, GLsizei bufsize, GLsizei* length,
GLint* values);
bool GetQueryObjectValueHelper(
const char* function_name, GLuint id, GLenum pname, GLuint64* params);

void FreeUnusedSharedMemory();
void FreeEverything();
Expand Down
2 changes: 2 additions & 0 deletions gpu/command_buffer/client/gles2_implementation_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,8 @@ void GetQueryivEXT(GLenum target, GLenum pname, GLint* params) override;

void GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* params) override;

void GetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64* params) override;

void InsertEventMarkerEXT(GLsizei length, const GLchar* marker) override;

void PushGroupMarkerEXT(GLsizei length, const GLchar* marker) override;
Expand Down
20 changes: 20 additions & 0 deletions gpu/command_buffer/client/gles2_implementation_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3189,6 +3189,26 @@ TEST_F(GLES2ImplementationTest, BeginEndQueryEXT) {
ClearCommands();
gl_->GetQueryObjectuivEXT(id1, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
EXPECT_EQ(0u, available);

// Test GetQueryObjectui64vEXT fails if unused id
GLuint64 available2 = 0xBDu;
ClearCommands();
gl_->GetQueryObjectui64vEXT(id2, GL_QUERY_RESULT_AVAILABLE_EXT, &available2);
EXPECT_TRUE(NoCommandsWritten());
EXPECT_EQ(0xBDu, available2);
EXPECT_EQ(GL_INVALID_OPERATION, CheckError());

// Test GetQueryObjectui64vEXT fails if bad id
ClearCommands();
gl_->GetQueryObjectui64vEXT(4567, GL_QUERY_RESULT_AVAILABLE_EXT, &available2);
EXPECT_TRUE(NoCommandsWritten());
EXPECT_EQ(0xBDu, available2);
EXPECT_EQ(GL_INVALID_OPERATION, CheckError());

// Test GetQueryObjectui64vEXT CheckResultsAvailable
ClearCommands();
gl_->GetQueryObjectui64vEXT(id1, GL_QUERY_RESULT_AVAILABLE_EXT, &available2);
EXPECT_EQ(0u, available2);
}

TEST_F(GLES2ImplementationManualInitTest, BadQueryTargets) {
Expand Down
3 changes: 3 additions & 0 deletions gpu/command_buffer/client/gles2_interface_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,9 @@ virtual void EndQueryEXT(GLenum target) = 0;
virtual void EndTransformFeedback() = 0;
virtual void GetQueryivEXT(GLenum target, GLenum pname, GLint* params) = 0;
virtual void GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* params) = 0;
virtual void GetQueryObjectui64vEXT(GLuint id,
GLenum pname,
GLuint64* params) = 0;
virtual void InsertEventMarkerEXT(GLsizei length, const GLchar* marker) = 0;
virtual void PushGroupMarkerEXT(GLsizei length, const GLchar* marker) = 0;
virtual void PopGroupMarkerEXT() = 0;
Expand Down
1 change: 1 addition & 0 deletions gpu/command_buffer/client/gles2_interface_stub_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,7 @@ void EndQueryEXT(GLenum target) override;
void EndTransformFeedback() override;
void GetQueryivEXT(GLenum target, GLenum pname, GLint* params) override;
void GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* params) override;
void GetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64* params) override;
void InsertEventMarkerEXT(GLsizei length, const GLchar* marker) override;
void PushGroupMarkerEXT(GLsizei length, const GLchar* marker) override;
void PopGroupMarkerEXT() override;
Expand Down
4 changes: 4 additions & 0 deletions gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -994,6 +994,10 @@ void GLES2InterfaceStub::GetQueryObjectuivEXT(GLuint /* id */,
GLenum /* pname */,
GLuint* /* params */) {
}
void GLES2InterfaceStub::GetQueryObjectui64vEXT(GLuint /* id */,
GLenum /* pname */,
GLuint64* /* params */) {
}
void GLES2InterfaceStub::InsertEventMarkerEXT(GLsizei /* length */,
const GLchar* /* marker */) {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,7 @@ void EndQueryEXT(GLenum target) override;
void EndTransformFeedback() override;
void GetQueryivEXT(GLenum target, GLenum pname, GLint* params) override;
void GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* params) override;
void GetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64* params) override;
void InsertEventMarkerEXT(GLsizei length, const GLchar* marker) override;
void PushGroupMarkerEXT(GLsizei length, const GLchar* marker) override;
void PopGroupMarkerEXT() override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1681,6 +1681,13 @@ void GLES2TraceImplementation::GetQueryObjectuivEXT(GLuint id,
gl_->GetQueryObjectuivEXT(id, pname, params);
}

void GLES2TraceImplementation::GetQueryObjectui64vEXT(GLuint id,
GLenum pname,
GLuint64* params) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetQueryObjectui64vEXT");
gl_->GetQueryObjectui64vEXT(id, pname, params);
}

void GLES2TraceImplementation::InsertEventMarkerEXT(GLsizei length,
const GLchar* marker) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::InsertEventMarkerEXT");
Expand Down
9 changes: 4 additions & 5 deletions gpu/command_buffer/client/query_tracker.cc
Original file line number Diff line number Diff line change
Expand Up @@ -174,18 +174,17 @@ bool QueryTracker::Query::CheckResultsAvailable(
helper->IsContextLost()) {
switch (target()) {
case GL_COMMANDS_ISSUED_CHROMIUM:
result_ = base::saturated_cast<uint32>(info_.sync->result);
result_ = info_.sync->result;
break;
case GL_LATENCY_QUERY_CHROMIUM:
// Disabled DCHECK because of http://crbug.com/419236.
//DCHECK(info_.sync->result >= client_begin_time_us_);
result_ = base::saturated_cast<uint32>(
info_.sync->result - client_begin_time_us_);
result_ = info_.sync->result - client_begin_time_us_;
break;
case GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM:
case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM:
default:
result_ = static_cast<uint32>(info_.sync->result);
result_ = info_.sync->result;
break;
}
state_ = kComplete;
Expand All @@ -201,7 +200,7 @@ bool QueryTracker::Query::CheckResultsAvailable(
return state_ == kComplete;
}

uint32 QueryTracker::Query::GetResult() const {
uint64 QueryTracker::Query::GetResult() const {
DCHECK(state_ == kComplete || state_ == kUninitialized);
return result_;
}
Expand Down
4 changes: 2 additions & 2 deletions gpu/command_buffer/client/query_tracker.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ class GLES2_IMPL_EXPORT QueryTracker {

bool CheckResultsAvailable(CommandBufferHelper* helper);

uint32 GetResult() const;
uint64 GetResult() const;

private:
friend class QueryTracker;
Expand All @@ -152,7 +152,7 @@ class GLES2_IMPL_EXPORT QueryTracker {
int32 token_;
uint32 flush_count_;
uint64 client_begin_time_us_; // Only used for latency query target.
uint32 result_;
uint64 result_;
};

QueryTracker(MappedMemoryManager* manager);
Expand Down
1 change: 1 addition & 0 deletions gpu/command_buffer/cmd_buffer_functions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenumQueryTarget target);
GL_APICALL void GL_APIENTRY glEndTransformFeedback (void);
GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenumQueryTarget target, GLenumQueryParameter pname, GLint* params);
GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLidQuery id, GLenumQueryObjectParameter pname, GLuint* params);
GL_APICALL void GL_APIENTRY glGetQueryObjectui64vEXT (GLidQuery id, GLenumQueryObjectParameter pname, GLuint64* params);
GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar* marker);
GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar* marker);
GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void);
Expand Down
1 change: 1 addition & 0 deletions gpu/command_buffer/common/capabilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ struct GPU_EXPORT Capabilities {
bool texture_rg;
bool render_buffer_format_bgra8888;
bool occlusion_query_boolean;
bool timer_queries;

int major_version;
int minor_version;
Expand Down
Loading

0 comments on commit 639959f

Please sign in to comment.