Chromium Code Reviews| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| index b62a44f28c75ca4be07817ea19ddbb9e5161c4fe..b95e3458b1cfbbcb48decb7a0f997b79a3cc886a 100644 |
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| @@ -11632,7 +11632,7 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT(uint32 immediate_data_size, |
| break; |
| default: |
| LOCAL_SET_GL_ERROR( |
| - GL_INVALID_OPERATION, "glBeginQueryEXT", |
| + GL_INVALID_ENUM, "glBeginQueryEXT", |
| "unknown query target"); |
| return error::kNoError; |
| } |
| @@ -11703,6 +11703,51 @@ error::Error GLES2DecoderImpl::HandleEndQueryEXT(uint32 immediate_data_size, |
| return error::kNoError; |
| } |
| +error::Error GLES2DecoderImpl::HandleQueryCounterEXT(uint32 immediate_data_size, |
| + const void* cmd_data) { |
| + const gles2::cmds::QueryCounterEXT& c = |
| + *static_cast<const gles2::cmds::QueryCounterEXT*>(cmd_data); |
| + GLuint client_id = static_cast<GLuint>(c.id); |
| + GLenum target = static_cast<GLenum>(c.target); |
| + int32 sync_shm_id = static_cast<int32>(c.sync_data_shm_id); |
| + uint32 sync_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); |
| + uint32 submit_count = static_cast<GLuint>(c.submit_count); |
| + |
| + switch (target) { |
| + case GL_TIMESTAMP: |
| + // TODO(dyen): Also support GL_TIMESTAMP. |
|
piman
2015/07/16 01:05:53
nit: wrong comment?
David Yen
2015/07/16 20:21:12
Done.
|
| + if (!query_manager_->GPUTimingAvailable()) { |
| + LOCAL_SET_GL_ERROR( |
| + GL_INVALID_OPERATION, "glQueryCounterEXT", |
| + "not enabled for timing queries"); |
| + return error::kNoError; |
| + } |
| + break; |
| + default: |
| + LOCAL_SET_GL_ERROR( |
| + GL_INVALID_ENUM, "glQueryCounterEXT", |
| + "unknown query target"); |
| + return error::kNoError; |
| + } |
| + |
| + QueryManager::Query* query = query_manager_->GetQuery(client_id); |
| + if (!query) { |
| + if (!query_manager_->IsValidQuery(client_id)) { |
| + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, |
| + "glQueryCounterEXT", |
| + "id not made by glGenQueriesEXT"); |
| + return error::kNoError; |
| + } |
| + query = query_manager_->CreateQuery( |
| + target, client_id, sync_shm_id, sync_shm_offset); |
| + } |
| + if (!query_manager_->QueryCounter(query, submit_count)) { |
| + return error::kOutOfBounds; |
| + } |
| + |
| + return error::kNoError; |
| +} |
| + |
| bool GLES2DecoderImpl::GenVertexArraysOESHelper( |
| GLsizei n, const GLuint* client_ids) { |
| for (GLsizei ii = 0; ii < n; ++ii) { |