diff options
24 files changed, 343 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, diff --git a/mojo/gpu/mojo_gles2_impl_autogen.cc b/mojo/gpu/mojo_gles2_impl_autogen.cc index 8f1b9d0c..a61befb 100644 --- a/mojo/gpu/mojo_gles2_impl_autogen.cc +++ b/mojo/gpu/mojo_gles2_impl_autogen.cc @@ -1296,6 +1296,9 @@ void MojoGLES2Impl::GetQueryObjectui64vEXT(GLuint id, GLuint64* params) { NOTREACHED() << "Unimplemented GetQueryObjectui64vEXT."; } +void MojoGLES2Impl::SetDisjointValueSyncCHROMIUM() { + NOTREACHED() << "Unimplemented SetDisjointValueSyncCHROMIUM."; +} void MojoGLES2Impl::InsertEventMarkerEXT(GLsizei length, const GLchar* marker) { NOTREACHED() << "Unimplemented InsertEventMarkerEXT."; } diff --git a/mojo/gpu/mojo_gles2_impl_autogen.h b/mojo/gpu/mojo_gles2_impl_autogen.h index 13690f7..074b144 100644 --- a/mojo/gpu/mojo_gles2_impl_autogen.h +++ b/mojo/gpu/mojo_gles2_impl_autogen.h @@ -609,6 +609,7 @@ class MojoGLES2Impl : public gpu::gles2::GLES2Interface { 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; |