summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authordyen <dyen@chromium.org>2015-08-18 09:15:11 -0700
committerCommit bot <commit-bot@chromium.org>2015-08-18 16:15:43 +0000
commitf2868b4d1159cdd1d8b781f48894b44ed5cdf4a7 (patch)
tree6fc1cf8dc0ec8a76400018579f0f0388875f1859 /gpu
parent9808b390b8a36c9ecb81c10dac9d18125713f57d (diff)
downloadchromium_src-f2868b4d1159cdd1d8b781f48894b44ed5cdf4a7.zip
chromium_src-f2868b4d1159cdd1d8b781f48894b44ed5cdf4a7.tar.gz
chromium_src-f2868b4d1159cdd1d8b781f48894b44ed5cdf4a7.tar.bz2
Implemented GPU Timer Disjoint Value checking on the GLES2 Client.
Now that the GLES2 Decoder supports updating a disjoint value through asynchronous shared memory, the client side can now check that value and update the disjoint state. As long as the server side sets the disjoint state at the right moment with respect to query availabilities, the client will always be able to tell if queries were valid or not. BUG=345227 TEST=trybots Review URL: https://codereview.chromium.org/1271843004 Cr-Commit-Position: refs/heads/master@{#343931}
Diffstat (limited to 'gpu')
-rw-r--r--gpu/GLES2/gl2chromium_autogen.h2
-rwxr-xr-xgpu/command_buffer/build_gles2_cmd_buffer.py10
-rw-r--r--gpu/command_buffer/client/gles2_c_lib_autogen.h7
-rw-r--r--gpu/command_buffer/client/gles2_cmd_helper_autogen.h9
-rw-r--r--gpu/command_buffer/client/gles2_implementation.cc35
-rw-r--r--gpu/command_buffer/client/gles2_implementation_autogen.h2
-rw-r--r--gpu/command_buffer/client/gles2_implementation_unittest.cc59
-rw-r--r--gpu/command_buffer/client/gles2_interface_autogen.h1
-rw-r--r--gpu/command_buffer/client/gles2_interface_stub_autogen.h1
-rw-r--r--gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h1
-rw-r--r--gpu/command_buffer/client/gles2_trace_implementation_autogen.h1
-rw-r--r--gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h6
-rw-r--r--gpu/command_buffer/client/query_tracker.cc41
-rw-r--r--gpu/command_buffer/client/query_tracker.h17
-rw-r--r--gpu/command_buffer/cmd_buffer_functions.txt1
-rw-r--r--gpu/command_buffer/common/gles2_cmd_format_autogen.h42
-rw-r--r--gpu/command_buffer/common/gles2_cmd_format_test_autogen.h13
-rw-r--r--gpu/command_buffer/common/gles2_cmd_ids_autogen.h149
-rw-r--r--gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h2
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc11
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h2
-rw-r--r--gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h2
22 files changed, 339 insertions, 75 deletions
diff --git a/gpu/GLES2/gl2chromium_autogen.h b/gpu/GLES2/gl2chromium_autogen.h
index 2fc96aa..5ce4f26 100644
--- a/gpu/GLES2/gl2chromium_autogen.h
+++ b/gpu/GLES2/gl2chromium_autogen.h
@@ -254,6 +254,8 @@
#define glGetQueryivEXT GLES2_GET_FUN(GetQueryivEXT)
#define glGetQueryObjectuivEXT GLES2_GET_FUN(GetQueryObjectuivEXT)
#define glGetQueryObjectui64vEXT GLES2_GET_FUN(GetQueryObjectui64vEXT)
+#define glSetDisjointValueSyncCHROMIUM \
+ GLES2_GET_FUN(SetDisjointValueSyncCHROMIUM)
#define glInsertEventMarkerEXT GLES2_GET_FUN(InsertEventMarkerEXT)
#define glPushGroupMarkerEXT GLES2_GET_FUN(PushGroupMarkerEXT)
#define glPopGroupMarkerEXT GLES2_GET_FUN(PopGroupMarkerEXT)
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index bb61e18..ed7a323 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -812,6 +812,7 @@ _NAMED_TYPE_INFO = {
'GL_DRAW_BUFFER15',
'GL_DRAW_FRAMEBUFFER_BINDING',
'GL_FRAGMENT_SHADER_DERIVATIVE_HINT',
+ 'GL_GPU_DISJOINT_EXT',
'GL_MAJOR_VERSION',
'GL_MAX_3D_TEXTURE_SIZE',
'GL_MAX_ARRAY_TEXTURE_LAYERS',
@@ -852,6 +853,7 @@ _NAMED_TYPE_INFO = {
'GL_READ_BUFFER',
'GL_READ_FRAMEBUFFER_BINDING',
'GL_SAMPLER_BINDING',
+ 'GL_TIMESTAMP_EXT',
'GL_TEXTURE_BINDING_2D_ARRAY',
'GL_TEXTURE_BINDING_3D',
'GL_TRANSFORM_FEEDBACK_BINDING',
@@ -3886,6 +3888,14 @@ _FUNCTION_INFO = {
'gl_test_func': 'glGetQueryObjectui64v',
'extension': "disjoint_timer_query_EXT",
},
+ 'SetDisjointValueSyncCHROMIUM': {
+ 'type': 'Manual',
+ 'data_transfer_methods': ['shm'],
+ 'client_test': False,
+ 'cmd_args': 'void* sync_data',
+ 'extension': True,
+ 'chromium': True,
+ },
'BindUniformLocationCHROMIUM': {
'type': 'GLchar',
'extension': True,
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h
index 20a745a..0a22a5a 100644
--- a/gpu/command_buffer/client/gles2_c_lib_autogen.h
+++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -1170,6 +1170,9 @@ void GL_APIENTRY GLES2GetQueryObjectui64vEXT(GLuint id,
GLuint64* params) {
gles2::GetGLContext()->GetQueryObjectui64vEXT(id, pname, params);
}
+void GL_APIENTRY GLES2SetDisjointValueSyncCHROMIUM() {
+ gles2::GetGLContext()->SetDisjointValueSyncCHROMIUM();
+}
void GL_APIENTRY GLES2InsertEventMarkerEXT(GLsizei length,
const GLchar* marker) {
gles2::GetGLContext()->InsertEventMarkerEXT(length, marker);
@@ -2469,6 +2472,10 @@ extern const NameToFunc g_gles2_function_table[] = {
reinterpret_cast<GLES2FunctionPointer>(glGetQueryObjectui64vEXT),
},
{
+ "glSetDisjointValueSyncCHROMIUM",
+ reinterpret_cast<GLES2FunctionPointer>(glSetDisjointValueSyncCHROMIUM),
+ },
+ {
"glInsertEventMarkerEXT",
reinterpret_cast<GLES2FunctionPointer>(glInsertEventMarkerEXT),
},
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
index e185306..46eb093 100644
--- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
+++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -2283,6 +2283,15 @@ void EndTransformFeedback() {
}
}
+void SetDisjointValueSyncCHROMIUM(uint32_t sync_data_shm_id,
+ uint32_t sync_data_shm_offset) {
+ gles2::cmds::SetDisjointValueSyncCHROMIUM* c =
+ GetCmdSpace<gles2::cmds::SetDisjointValueSyncCHROMIUM>();
+ if (c) {
+ c->Init(sync_data_shm_id, sync_data_shm_offset);
+ }
+}
+
void InsertEventMarkerEXT(GLuint bucket_id) {
gles2::cmds::InsertEventMarkerEXT* c =
GetCmdSpace<gles2::cmds::InsertEventMarkerEXT>();
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index c57abb9..dcc2bb6 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -724,6 +724,9 @@ bool GLES2Implementation::GetHelper(GLenum pname, GLint* params) {
(base::TraceTicks::Now() - base::TraceTicks()).InMicroseconds()
* base::Time::kNanosecondsPerMicrosecond);
return true;
+ case GL_GPU_DISJOINT_EXT:
+ *params = static_cast<GLint>(query_tracker_->CheckAndResetDisjoint());
+ return true;
// Non-cached parameters.
case GL_ALIASED_LINE_WIDTH_RANGE:
@@ -4917,6 +4920,20 @@ void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) {
return;
}
+ // Extra setups some targets might need.
+ switch (target) {
+ case GL_TIME_ELAPSED_EXT:
+ if (!query_tracker_->SetDisjointSync(this)) {
+ SetGLError(GL_OUT_OF_MEMORY,
+ "glBeginQueryEXT",
+ "buffer allocation failed");
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+
if (query_tracker_->BeginQuery(id, target, this))
CheckGLError();
}
@@ -4965,6 +4982,20 @@ void GLES2Implementation::QueryCounterEXT(GLuint id, GLenum target) {
return;
}
+ // Extra setups some targets might need.
+ switch (target) {
+ case GL_TIMESTAMP_EXT:
+ if (!query_tracker_->SetDisjointSync(this)) {
+ SetGLError(GL_OUT_OF_MEMORY,
+ "glQueryCounterEXT",
+ "buffer allocation failed");
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+
if (query_tracker_->QueryCounter(id, target, this))
CheckGLError();
}
@@ -5004,6 +5035,10 @@ void GLES2Implementation::GetQueryObjectui64vEXT(
*params = result;
}
+void GLES2Implementation::SetDisjointValueSyncCHROMIUM() {
+ query_tracker_->SetDisjointSync(this);
+}
+
void GLES2Implementation::DrawArraysInstancedANGLE(
GLenum mode, GLint first, GLsizei count, GLsizei primcount) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h
index 06ac948..0fe57a1 100644
--- a/gpu/command_buffer/client/gles2_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -811,6 +811,8 @@ void GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* params) override;
void GetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64* params) override;
+void SetDisjointValueSyncCHROMIUM() override;
+
void InsertEventMarkerEXT(GLsizei length, const GLchar* marker) override;
void PushGroupMarkerEXT(GLsizei length, const GLchar* marker) override;
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
index 2580c8c..329a92e 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
@@ -544,6 +544,10 @@ class GLES2ImplementationTest : public testing::Test {
return gl_->query_tracker_->GetQuery(id);
}
+ QueryTracker* GetQueryTracker() {
+ return gl_->query_tracker_.get();
+ }
+
struct ContextInitOptions {
ContextInitOptions()
: bind_generates_resource_client(true),
@@ -2209,6 +2213,42 @@ TEST_F(GLES2ImplementationTest, GetIntegerCacheRead) {
EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError());
}
+TEST_F(GLES2ImplementationTest, GetIntegerDisjointValue) {
+ ExpectedMemoryInfo mem = GetExpectedMappedMemory(sizeof(DisjointValueSync));
+ gl_->SetDisjointValueSyncCHROMIUM();
+ ASSERT_EQ(mem.id, GetQueryTracker()->DisjointCountSyncShmID());
+ ASSERT_EQ(mem.offset, GetQueryTracker()->DisjointCountSyncShmOffset());
+ DisjointValueSync* disjoint_sync =
+ reinterpret_cast<DisjointValueSync*>(mem.ptr);
+
+ ClearCommands();
+ GLint disjoint_value = -1;
+ gl_->GetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint_value);
+ EXPECT_TRUE(NoCommandsWritten());
+ EXPECT_EQ(0, disjoint_value);
+
+ // After setting disjoint, it should be true.
+ disjoint_value = -1;
+ disjoint_sync->SetDisjointCount(1);
+ gl_->GetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint_value);
+ EXPECT_TRUE(NoCommandsWritten());
+ EXPECT_EQ(1, disjoint_value);
+
+ // After checking disjoint, it should be false again.
+ disjoint_value = -1;
+ gl_->GetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint_value);
+ EXPECT_TRUE(NoCommandsWritten());
+ EXPECT_EQ(0, disjoint_value);
+
+ // Check for errors.
+ ExpectedMemoryInfo result1 =
+ GetExpectedResultMemory(sizeof(cmds::GetError::Result));
+ EXPECT_CALL(*command_buffer(), OnFlush())
+ .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR)))
+ .RetiresOnSaturation();
+ EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError());
+}
+
TEST_F(GLES2ImplementationTest, GetIntegerCacheWrite) {
struct PNameValue {
GLenum pname;
@@ -3258,6 +3298,21 @@ TEST_F(GLES2ImplementationManualInitTest, BadQueryTargets) {
EXPECT_EQ(nullptr, GetQuery(id));
}
+TEST_F(GLES2ImplementationTest, SetDisjointSync) {
+ struct SetDisjointSyncCmd {
+ cmds::SetDisjointValueSyncCHROMIUM disjoint_sync;
+ };
+ SetDisjointSyncCmd expected_disjoint_sync_cmd;
+ const void* commands = GetPut();
+ gl_->SetDisjointValueSyncCHROMIUM();
+ expected_disjoint_sync_cmd.disjoint_sync.Init(
+ GetQueryTracker()->DisjointCountSyncShmID(),
+ GetQueryTracker()->DisjointCountSyncShmOffset());
+
+ EXPECT_EQ(0, memcmp(&expected_disjoint_sync_cmd, commands,
+ sizeof(expected_disjoint_sync_cmd)));
+}
+
TEST_F(GLES2ImplementationTest, QueryCounterEXT) {
GLuint expected_ids[2] = { 1, 2 }; // These must match what's actually genned.
struct GenCmds {
@@ -3274,6 +3329,10 @@ TEST_F(GLES2ImplementationTest, QueryCounterEXT) {
GLuint id2 = ids[1];
ClearCommands();
+ // Make sure disjoint value is synchronized already.
+ gl_->SetDisjointValueSyncCHROMIUM();
+ ClearCommands();
+
// Test QueryCounterEXT fails if id = 0.
gl_->QueryCounterEXT(0, GL_TIMESTAMP_EXT);
EXPECT_TRUE(NoCommandsWritten());
diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h
index d246617..7665d02 100644
--- a/gpu/command_buffer/client/gles2_interface_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_autogen.h
@@ -604,6 +604,7 @@ virtual void GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* params) = 0;
virtual void GetQueryObjectui64vEXT(GLuint id,
GLenum pname,
GLuint64* params) = 0;
+virtual void SetDisjointValueSyncCHROMIUM() = 0;
virtual void InsertEventMarkerEXT(GLsizei length, const GLchar* marker) = 0;
virtual void PushGroupMarkerEXT(GLsizei length, const GLchar* marker) = 0;
virtual void PopGroupMarkerEXT() = 0;
diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
index 4d9d9bd..076af55 100644
--- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
@@ -585,6 +585,7 @@ 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 SetDisjointValueSyncCHROMIUM() override;
void InsertEventMarkerEXT(GLsizei length, const GLchar* marker) override;
void PushGroupMarkerEXT(GLsizei length, const GLchar* marker) override;
void PopGroupMarkerEXT() override;
diff --git a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
index 0f62e31..61ab8a1 100644
--- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
@@ -793,6 +793,7 @@ void GLES2InterfaceStub::GetQueryObjectuivEXT(GLuint /* id */,
void GLES2InterfaceStub::GetQueryObjectui64vEXT(GLuint /* id */,
GLenum /* pname */,
GLuint64* /* params */) {}
+void GLES2InterfaceStub::SetDisjointValueSyncCHROMIUM() {}
void GLES2InterfaceStub::InsertEventMarkerEXT(GLsizei /* length */,
const GLchar* /* marker */) {}
void GLES2InterfaceStub::PushGroupMarkerEXT(GLsizei /* length */,
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
index a94ac76..0156c84 100644
--- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
@@ -585,6 +585,7 @@ 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 SetDisjointValueSyncCHROMIUM() override;
void InsertEventMarkerEXT(GLsizei length, const GLchar* marker) override;
void PushGroupMarkerEXT(GLsizei length, const GLchar* marker) override;
void PopGroupMarkerEXT() override;
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
index 94378c7..99c17ba 100644
--- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
@@ -1700,6 +1700,12 @@ void GLES2TraceImplementation::GetQueryObjectui64vEXT(GLuint id,
gl_->GetQueryObjectui64vEXT(id, pname, params);
}
+void GLES2TraceImplementation::SetDisjointValueSyncCHROMIUM() {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu",
+ "GLES2Trace::SetDisjointValueSyncCHROMIUM");
+ gl_->SetDisjointValueSyncCHROMIUM();
+}
+
void GLES2TraceImplementation::InsertEventMarkerEXT(GLsizei length,
const GLchar* marker) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::InsertEventMarkerEXT");
diff --git a/gpu/command_buffer/client/query_tracker.cc b/gpu/command_buffer/client/query_tracker.cc
index c85c6bb..a258f93 100644
--- a/gpu/command_buffer/client/query_tracker.cc
+++ b/gpu/command_buffer/client/query_tracker.cc
@@ -214,7 +214,12 @@ uint64 QueryTracker::Query::GetResult() const {
}
QueryTracker::QueryTracker(MappedMemoryManager* manager)
- : query_sync_manager_(manager) {
+ : query_sync_manager_(manager),
+ mapped_memory_(manager),
+ disjoint_count_sync_shm_id_(-1),
+ disjoint_count_sync_shm_offset_(0),
+ disjoint_count_sync_(nullptr),
+ local_disjoint_count_(0) {
}
QueryTracker::~QueryTracker() {
@@ -226,6 +231,10 @@ QueryTracker::~QueryTracker() {
delete removed_queries_.front();
removed_queries_.pop_front();
}
+ if (disjoint_count_sync_) {
+ mapped_memory_->Free(disjoint_count_sync_);
+ disjoint_count_sync_ = nullptr;
+ }
}
QueryTracker::Query* QueryTracker::CreateQuery(GLuint id, GLenum target) {
@@ -354,5 +363,35 @@ bool QueryTracker::QueryCounter(GLuint id, GLenum target,
return true;
}
+bool QueryTracker::SetDisjointSync(GLES2Implementation* gl) {
+ if (!disjoint_count_sync_) {
+ // Allocate memory for disjoint value sync.
+ int32_t shm_id = -1;
+ uint32_t shm_offset;
+ void* mem = mapped_memory_->Alloc(sizeof(*disjoint_count_sync_),
+ &shm_id,
+ &shm_offset);
+ if (mem) {
+ disjoint_count_sync_shm_id_ = shm_id;
+ disjoint_count_sync_shm_offset_ = shm_offset;
+ disjoint_count_sync_ = static_cast<DisjointValueSync*>(mem);
+ disjoint_count_sync_->Reset();
+ gl->helper()->SetDisjointValueSyncCHROMIUM(shm_id, shm_offset);
+ }
+ }
+ return disjoint_count_sync_ != nullptr;
+}
+
+bool QueryTracker::CheckAndResetDisjoint() {
+ if (disjoint_count_sync_) {
+ const uint32_t disjoint_count = disjoint_count_sync_->GetDisjointCount();
+ if (local_disjoint_count_ != disjoint_count) {
+ local_disjoint_count_ = disjoint_count;
+ return true;
+ }
+ }
+ return false;
+}
+
} // namespace gles2
} // namespace gpu
diff --git a/gpu/command_buffer/client/query_tracker.h b/gpu/command_buffer/client/query_tracker.h
index 45f5681..986b9f2 100644
--- a/gpu/command_buffer/client/query_tracker.h
+++ b/gpu/command_buffer/client/query_tracker.h
@@ -169,6 +169,16 @@ class GLES2_IMPL_EXPORT QueryTracker {
bool BeginQuery(GLuint id, GLenum target, GLES2Implementation* gl);
bool EndQuery(GLenum target, GLES2Implementation* gl);
bool QueryCounter(GLuint id, GLenum target, GLES2Implementation* gl);
+ bool SetDisjointSync(GLES2Implementation* gl);
+ bool CheckAndResetDisjoint();
+
+ int32_t DisjointCountSyncShmID() const {
+ return disjoint_count_sync_shm_id_;
+ }
+
+ uint32_t DisjointCountSyncShmOffset() const {
+ return disjoint_count_sync_shm_offset_;
+ }
private:
typedef base::hash_map<GLuint, Query*> QueryIdMap;
@@ -180,6 +190,13 @@ class GLES2_IMPL_EXPORT QueryTracker {
QueryList removed_queries_;
QuerySyncManager query_sync_manager_;
+ // The shared memory used for synchronizing timer disjoint values.
+ MappedMemoryManager* mapped_memory_;
+ int32_t disjoint_count_sync_shm_id_;
+ uint32_t disjoint_count_sync_shm_offset_;
+ DisjointValueSync* disjoint_count_sync_;
+ uint32_t local_disjoint_count_;
+
DISALLOW_COPY_AND_ASSIGN(QueryTracker);
};
diff --git a/gpu/command_buffer/cmd_buffer_functions.txt b/gpu/command_buffer/cmd_buffer_functions.txt
index 27e8d06..370d049 100644
--- a/gpu/command_buffer/cmd_buffer_functions.txt
+++ b/gpu/command_buffer/cmd_buffer_functions.txt
@@ -241,6 +241,7 @@ 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 glSetDisjointValueSyncCHROMIUM (void);
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);
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
index a316183..4b76c2ef 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -11319,6 +11319,48 @@ static_assert(sizeof(EndTransformFeedback) == 4,
static_assert(offsetof(EndTransformFeedback, header) == 0,
"offset of EndTransformFeedback header should be 0");
+struct SetDisjointValueSyncCHROMIUM {
+ typedef SetDisjointValueSyncCHROMIUM ValueType;
+ static const CommandId kCmdId = kSetDisjointValueSyncCHROMIUM;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(uint32_t _sync_data_shm_id, uint32_t _sync_data_shm_offset) {
+ SetHeader();
+ sync_data_shm_id = _sync_data_shm_id;
+ sync_data_shm_offset = _sync_data_shm_offset;
+ }
+
+ void* Set(void* cmd,
+ uint32_t _sync_data_shm_id,
+ uint32_t _sync_data_shm_offset) {
+ static_cast<ValueType*>(cmd)
+ ->Init(_sync_data_shm_id, _sync_data_shm_offset);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ uint32_t sync_data_shm_id;
+ uint32_t sync_data_shm_offset;
+};
+
+static_assert(sizeof(SetDisjointValueSyncCHROMIUM) == 12,
+ "size of SetDisjointValueSyncCHROMIUM should be 12");
+static_assert(offsetof(SetDisjointValueSyncCHROMIUM, header) == 0,
+ "offset of SetDisjointValueSyncCHROMIUM header should be 0");
+static_assert(
+ offsetof(SetDisjointValueSyncCHROMIUM, sync_data_shm_id) == 4,
+ "offset of SetDisjointValueSyncCHROMIUM sync_data_shm_id should be 4");
+static_assert(
+ offsetof(SetDisjointValueSyncCHROMIUM, sync_data_shm_offset) == 8,
+ "offset of SetDisjointValueSyncCHROMIUM sync_data_shm_offset should be 8");
+
struct InsertEventMarkerEXT {
typedef InsertEventMarkerEXT ValueType;
static const CommandId kCmdId = kInsertEventMarkerEXT;
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
index 7166d5a..e362eab 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -3862,6 +3862,19 @@ TEST_F(GLES2FormatTest, EndTransformFeedback) {
CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
}
+TEST_F(GLES2FormatTest, SetDisjointValueSyncCHROMIUM) {
+ cmds::SetDisjointValueSyncCHROMIUM& cmd =
+ *GetBufferAs<cmds::SetDisjointValueSyncCHROMIUM>();
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<uint32_t>(11), static_cast<uint32_t>(12));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::SetDisjointValueSyncCHROMIUM::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<uint32_t>(11), cmd.sync_data_shm_id);
+ EXPECT_EQ(static_cast<uint32_t>(12), cmd.sync_data_shm_offset);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
TEST_F(GLES2FormatTest, InsertEventMarkerEXT) {
cmds::InsertEventMarkerEXT& cmd = *GetBufferAs<cmds::InsertEventMarkerEXT>();
void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11));
diff --git a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
index 9a956ec..448dc8e 100644
--- a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
@@ -245,80 +245,81 @@
OP(BeginTransformFeedback) /* 486 */ \
OP(EndQueryEXT) /* 487 */ \
OP(EndTransformFeedback) /* 488 */ \
- OP(InsertEventMarkerEXT) /* 489 */ \
- OP(PushGroupMarkerEXT) /* 490 */ \
- OP(PopGroupMarkerEXT) /* 491 */ \
- OP(GenVertexArraysOESImmediate) /* 492 */ \
- OP(DeleteVertexArraysOESImmediate) /* 493 */ \
- OP(IsVertexArrayOES) /* 494 */ \
- OP(BindVertexArrayOES) /* 495 */ \
- OP(SwapBuffers) /* 496 */ \
- OP(GetMaxValueInBufferCHROMIUM) /* 497 */ \
- OP(EnableFeatureCHROMIUM) /* 498 */ \
- OP(MapBufferRange) /* 499 */ \
- OP(UnmapBuffer) /* 500 */ \
- OP(ResizeCHROMIUM) /* 501 */ \
- OP(GetRequestableExtensionsCHROMIUM) /* 502 */ \
- OP(RequestExtensionCHROMIUM) /* 503 */ \
- OP(GetProgramInfoCHROMIUM) /* 504 */ \
- OP(GetUniformBlocksCHROMIUM) /* 505 */ \
- OP(GetTransformFeedbackVaryingsCHROMIUM) /* 506 */ \
- OP(GetUniformsES3CHROMIUM) /* 507 */ \
- OP(GetTranslatedShaderSourceANGLE) /* 508 */ \
- OP(PostSubBufferCHROMIUM) /* 509 */ \
- OP(TexImageIOSurface2DCHROMIUM) /* 510 */ \
- OP(CopyTextureCHROMIUM) /* 511 */ \
- OP(CopySubTextureCHROMIUM) /* 512 */ \
- OP(CompressedCopyTextureCHROMIUM) /* 513 */ \
- OP(DrawArraysInstancedANGLE) /* 514 */ \
- OP(DrawElementsInstancedANGLE) /* 515 */ \
- OP(VertexAttribDivisorANGLE) /* 516 */ \
- OP(GenMailboxCHROMIUM) /* 517 */ \
- OP(ProduceTextureCHROMIUMImmediate) /* 518 */ \
- OP(ProduceTextureDirectCHROMIUMImmediate) /* 519 */ \
- OP(ConsumeTextureCHROMIUMImmediate) /* 520 */ \
- OP(CreateAndConsumeTextureCHROMIUMImmediate) /* 521 */ \
- OP(BindUniformLocationCHROMIUMBucket) /* 522 */ \
- OP(GenValuebuffersCHROMIUMImmediate) /* 523 */ \
- OP(DeleteValuebuffersCHROMIUMImmediate) /* 524 */ \
- OP(IsValuebufferCHROMIUM) /* 525 */ \
- OP(BindValuebufferCHROMIUM) /* 526 */ \
- OP(SubscribeValueCHROMIUM) /* 527 */ \
- OP(PopulateSubscribedValuesCHROMIUM) /* 528 */ \
- OP(UniformValuebufferCHROMIUM) /* 529 */ \
- OP(BindTexImage2DCHROMIUM) /* 530 */ \
- OP(ReleaseTexImage2DCHROMIUM) /* 531 */ \
- OP(TraceBeginCHROMIUM) /* 532 */ \
- OP(TraceEndCHROMIUM) /* 533 */ \
- OP(AsyncTexSubImage2DCHROMIUM) /* 534 */ \
- OP(AsyncTexImage2DCHROMIUM) /* 535 */ \
- OP(WaitAsyncTexImage2DCHROMIUM) /* 536 */ \
- OP(WaitAllAsyncTexImage2DCHROMIUM) /* 537 */ \
- OP(DiscardFramebufferEXTImmediate) /* 538 */ \
- OP(LoseContextCHROMIUM) /* 539 */ \
- OP(InsertSyncPointCHROMIUM) /* 540 */ \
- OP(WaitSyncPointCHROMIUM) /* 541 */ \
- OP(DrawBuffersEXTImmediate) /* 542 */ \
- OP(DiscardBackbufferCHROMIUM) /* 543 */ \
- OP(ScheduleOverlayPlaneCHROMIUM) /* 544 */ \
- OP(SwapInterval) /* 545 */ \
- OP(FlushDriverCachesCHROMIUM) /* 546 */ \
- OP(MatrixLoadfCHROMIUMImmediate) /* 547 */ \
- OP(MatrixLoadIdentityCHROMIUM) /* 548 */ \
- OP(GenPathsCHROMIUM) /* 549 */ \
- OP(DeletePathsCHROMIUM) /* 550 */ \
- OP(IsPathCHROMIUM) /* 551 */ \
- OP(PathCommandsCHROMIUM) /* 552 */ \
- OP(PathParameterfCHROMIUM) /* 553 */ \
- OP(PathParameteriCHROMIUM) /* 554 */ \
- OP(PathStencilFuncCHROMIUM) /* 555 */ \
- OP(StencilFillPathCHROMIUM) /* 556 */ \
- OP(StencilStrokePathCHROMIUM) /* 557 */ \
- OP(CoverFillPathCHROMIUM) /* 558 */ \
- OP(CoverStrokePathCHROMIUM) /* 559 */ \
- OP(StencilThenCoverFillPathCHROMIUM) /* 560 */ \
- OP(StencilThenCoverStrokePathCHROMIUM) /* 561 */ \
- OP(BlendBarrierKHR) /* 562 */
+ OP(SetDisjointValueSyncCHROMIUM) /* 489 */ \
+ OP(InsertEventMarkerEXT) /* 490 */ \
+ OP(PushGroupMarkerEXT) /* 491 */ \
+ OP(PopGroupMarkerEXT) /* 492 */ \
+ OP(GenVertexArraysOESImmediate) /* 493 */ \
+ OP(DeleteVertexArraysOESImmediate) /* 494 */ \
+ OP(IsVertexArrayOES) /* 495 */ \
+ OP(BindVertexArrayOES) /* 496 */ \
+ OP(SwapBuffers) /* 497 */ \
+ OP(GetMaxValueInBufferCHROMIUM) /* 498 */ \
+ OP(EnableFeatureCHROMIUM) /* 499 */ \
+ OP(MapBufferRange) /* 500 */ \
+ OP(UnmapBuffer) /* 501 */ \
+ OP(ResizeCHROMIUM) /* 502 */ \
+ OP(GetRequestableExtensionsCHROMIUM) /* 503 */ \
+ OP(RequestExtensionCHROMIUM) /* 504 */ \
+ OP(GetProgramInfoCHROMIUM) /* 505 */ \
+ OP(GetUniformBlocksCHROMIUM) /* 506 */ \
+ OP(GetTransformFeedbackVaryingsCHROMIUM) /* 507 */ \
+ OP(GetUniformsES3CHROMIUM) /* 508 */ \
+ OP(GetTranslatedShaderSourceANGLE) /* 509 */ \
+ OP(PostSubBufferCHROMIUM) /* 510 */ \
+ OP(TexImageIOSurface2DCHROMIUM) /* 511 */ \
+ OP(CopyTextureCHROMIUM) /* 512 */ \
+ OP(CopySubTextureCHROMIUM) /* 513 */ \
+ OP(CompressedCopyTextureCHROMIUM) /* 514 */ \
+ OP(DrawArraysInstancedANGLE) /* 515 */ \
+ OP(DrawElementsInstancedANGLE) /* 516 */ \
+ OP(VertexAttribDivisorANGLE) /* 517 */ \
+ OP(GenMailboxCHROMIUM) /* 518 */ \
+ OP(ProduceTextureCHROMIUMImmediate) /* 519 */ \
+ OP(ProduceTextureDirectCHROMIUMImmediate) /* 520 */ \
+ OP(ConsumeTextureCHROMIUMImmediate) /* 521 */ \
+ OP(CreateAndConsumeTextureCHROMIUMImmediate) /* 522 */ \
+ OP(BindUniformLocationCHROMIUMBucket) /* 523 */ \
+ OP(GenValuebuffersCHROMIUMImmediate) /* 524 */ \
+ OP(DeleteValuebuffersCHROMIUMImmediate) /* 525 */ \
+ OP(IsValuebufferCHROMIUM) /* 526 */ \
+ OP(BindValuebufferCHROMIUM) /* 527 */ \
+ OP(SubscribeValueCHROMIUM) /* 528 */ \
+ OP(PopulateSubscribedValuesCHROMIUM) /* 529 */ \
+ OP(UniformValuebufferCHROMIUM) /* 530 */ \
+ OP(BindTexImage2DCHROMIUM) /* 531 */ \
+ OP(ReleaseTexImage2DCHROMIUM) /* 532 */ \
+ OP(TraceBeginCHROMIUM) /* 533 */ \
+ OP(TraceEndCHROMIUM) /* 534 */ \
+ OP(AsyncTexSubImage2DCHROMIUM) /* 535 */ \
+ OP(AsyncTexImage2DCHROMIUM) /* 536 */ \
+ OP(WaitAsyncTexImage2DCHROMIUM) /* 537 */ \
+ OP(WaitAllAsyncTexImage2DCHROMIUM) /* 538 */ \
+ OP(DiscardFramebufferEXTImmediate) /* 539 */ \
+ OP(LoseContextCHROMIUM) /* 540 */ \
+ OP(InsertSyncPointCHROMIUM) /* 541 */ \
+ OP(WaitSyncPointCHROMIUM) /* 542 */ \
+ OP(DrawBuffersEXTImmediate) /* 543 */ \
+ OP(DiscardBackbufferCHROMIUM) /* 544 */ \
+ OP(ScheduleOverlayPlaneCHROMIUM) /* 545 */ \
+ OP(SwapInterval) /* 546 */ \
+ OP(FlushDriverCachesCHROMIUM) /* 547 */ \
+ OP(MatrixLoadfCHROMIUMImmediate) /* 548 */ \
+ OP(MatrixLoadIdentityCHROMIUM) /* 549 */ \
+ OP(GenPathsCHROMIUM) /* 550 */ \
+ OP(DeletePathsCHROMIUM) /* 551 */ \
+ OP(IsPathCHROMIUM) /* 552 */ \
+ OP(PathCommandsCHROMIUM) /* 553 */ \
+ OP(PathParameterfCHROMIUM) /* 554 */ \
+ OP(PathParameteriCHROMIUM) /* 555 */ \
+ OP(PathStencilFuncCHROMIUM) /* 556 */ \
+ OP(StencilFillPathCHROMIUM) /* 557 */ \
+ OP(StencilStrokePathCHROMIUM) /* 558 */ \
+ OP(CoverFillPathCHROMIUM) /* 559 */ \
+ OP(CoverStrokePathCHROMIUM) /* 560 */ \
+ OP(StencilThenCoverFillPathCHROMIUM) /* 561 */ \
+ OP(StencilThenCoverStrokePathCHROMIUM) /* 562 */ \
+ OP(BlendBarrierKHR) /* 563 */
enum CommandId {
kStartPoint = cmd::kLastCommonId, // All GLES2 commands start after this.
diff --git a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
index aa7d230..0196461 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
@@ -3801,6 +3801,7 @@ std::string GLES2Util::GetStringGLState(uint32_t value) {
{GL_DRAW_FRAMEBUFFER_BINDING, "GL_DRAW_FRAMEBUFFER_BINDING"},
{GL_FRAGMENT_SHADER_DERIVATIVE_HINT,
"GL_FRAGMENT_SHADER_DERIVATIVE_HINT"},
+ {GL_GPU_DISJOINT_EXT, "GL_GPU_DISJOINT_EXT"},
{GL_MAJOR_VERSION, "GL_MAJOR_VERSION"},
{GL_MAX_3D_TEXTURE_SIZE, "GL_MAX_3D_TEXTURE_SIZE"},
{GL_MAX_ARRAY_TEXTURE_LAYERS, "GL_MAX_ARRAY_TEXTURE_LAYERS"},
@@ -3847,6 +3848,7 @@ std::string GLES2Util::GetStringGLState(uint32_t value) {
{GL_READ_BUFFER, "GL_READ_BUFFER"},
{GL_READ_FRAMEBUFFER_BINDING, "GL_READ_FRAMEBUFFER_BINDING"},
{GL_SAMPLER_BINDING, "GL_SAMPLER_BINDING"},
+ {GL_TIMESTAMP_EXT, "GL_TIMESTAMP_EXT"},
{GL_TEXTURE_BINDING_2D_ARRAY, "GL_TEXTURE_BINDING_2D_ARRAY"},
{GL_TEXTURE_BINDING_3D, "GL_TEXTURE_BINDING_3D"},
{GL_TRANSFORM_FEEDBACK_BINDING, "GL_TRANSFORM_FEEDBACK_BINDING"},
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 2de670a..1f72f24 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -11890,6 +11890,17 @@ error::Error GLES2DecoderImpl::HandleQueryCounterEXT(uint32 immediate_data_size,
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleSetDisjointValueSyncCHROMIUM(
+ uint32 immediate_data_size, const void* cmd_data) {
+ const gles2::cmds::SetDisjointValueSyncCHROMIUM& c =
+ *static_cast<const gles2::cmds::SetDisjointValueSyncCHROMIUM*>(cmd_data);
+ int32 sync_shm_id = static_cast<int32>(c.sync_data_shm_id);
+ uint32 sync_shm_offset = static_cast<uint32>(c.sync_data_shm_offset);
+
+ query_manager_->SetDisjointSync(sync_shm_id, sync_shm_offset);
+ return error::kNoError;
+}
+
bool GLES2DecoderImpl::GenVertexArraysOESHelper(
GLsizei n, const GLuint* client_ids) {
for (GLsizei ii = 0; ii < n; ++ii) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
index 9a92d60..997d425 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
@@ -371,6 +371,8 @@ TEST_P(GLES2DecoderTest3, EndTransformFeedbackValidArgs) {
decoder_->set_unsafe_es3_apis_enabled(false);
EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
}
+// TODO(gman): SetDisjointValueSyncCHROMIUM
+
// TODO(gman): InsertEventMarkerEXT
// TODO(gman): PushGroupMarkerEXT
diff --git a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
index 3b06b56..958e67a 100644
--- a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
@@ -277,6 +277,7 @@ static const GLenum valid_g_l_state_table_es3[] = {
GL_DRAW_BUFFER15,
GL_DRAW_FRAMEBUFFER_BINDING,
GL_FRAGMENT_SHADER_DERIVATIVE_HINT,
+ GL_GPU_DISJOINT_EXT,
GL_MAJOR_VERSION,
GL_MAX_3D_TEXTURE_SIZE,
GL_MAX_ARRAY_TEXTURE_LAYERS,
@@ -317,6 +318,7 @@ static const GLenum valid_g_l_state_table_es3[] = {
GL_READ_BUFFER,
GL_READ_FRAMEBUFFER_BINDING,
GL_SAMPLER_BINDING,
+ GL_TIMESTAMP_EXT,
GL_TEXTURE_BINDING_2D_ARRAY,
GL_TEXTURE_BINDING_3D,
GL_TRANSFORM_FEEDBACK_BINDING,