| 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 96440a022ffe9486057a2b4b56c283532762dfe9..c87e3ead9b7f7b72fda1fa09592ef6cdc3fcc8af 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -2022,7 +2022,7 @@ bool GLES2DecoderImpl::Initialize(
|
| vertex_attrib_manager_.reset(new VertexAttribManager());
|
| vertex_attrib_manager_->Initialize(group_->max_vertex_attribs());
|
|
|
| - query_manager_.reset(new QueryManager());
|
| + query_manager_.reset(new QueryManager(this));
|
|
|
| util_.set_num_compressed_texture_formats(
|
| validators_->compressed_texture_format.GetValues().size());
|
| @@ -3160,14 +3160,14 @@ bool GLES2DecoderImpl::CreateShaderHelper(GLenum type, GLuint client_id) {
|
|
|
| void GLES2DecoderImpl::DoFinish() {
|
| glFinish();
|
| - if (!query_manager_->ProcessPendingQueries(this)) {
|
| + if (!query_manager_->ProcessPendingQueries()) {
|
| current_decoder_error_ = error::kOutOfBounds;
|
| }
|
| }
|
|
|
| void GLES2DecoderImpl::DoFlush() {
|
| glFlush();
|
| - if (!query_manager_->ProcessPendingQueries(this)) {
|
| + if (!query_manager_->ProcessPendingQueries()) {
|
| current_decoder_error_ = error::kOutOfBounds;
|
| }
|
| }
|
| @@ -5232,7 +5232,7 @@ error::Error GLES2DecoderImpl::DoDrawArrays(bool instanced,
|
| } else {
|
| glDrawArraysInstancedANGLE(mode, first, count, primcount);
|
| }
|
| - if (!query_manager_->ProcessPendingQueries(this)) {
|
| + if (!query_manager_->ProcessPendingQueries()) {
|
| current_decoder_error_ = error::kOutOfBounds;
|
| }
|
| if (textures_set) {
|
| @@ -5345,7 +5345,7 @@ error::Error GLES2DecoderImpl::DoDrawElements(bool instanced,
|
| } else {
|
| glDrawElementsInstancedANGLE(mode, count, type, indices, primcount);
|
| }
|
| - if (!query_manager_->ProcessPendingQueries(this)) {
|
| + if (!query_manager_->ProcessPendingQueries()) {
|
| current_decoder_error_ = error::kOutOfBounds;
|
| }
|
| if (textures_set) {
|
| @@ -7938,11 +7938,7 @@ bool GLES2DecoderImpl::GenQueriesEXTHelper(
|
| return false;
|
| }
|
| }
|
| - scoped_array<GLuint> service_ids(new GLuint[n]);
|
| - glGenQueriesARB(n, service_ids.get());
|
| - for (GLsizei ii = 0; ii < n; ++ii) {
|
| - query_manager_->CreateQuery(client_ids[ii], service_ids[ii]);
|
| - }
|
| + // NOTE: We don't generate Query objects here. Only in BeginQueryEXT
|
| return true;
|
| }
|
|
|
| @@ -7954,8 +7950,7 @@ void GLES2DecoderImpl::DeleteQueriesEXTHelper(
|
| if (query == current_query_) {
|
| current_query_ = NULL;
|
| }
|
| - GLuint service_id = query->service_id();
|
| - glDeleteQueriesARB(1, &service_id);
|
| + query->Destroy(true);
|
| query_manager_->RemoveQuery(client_ids[ii]);
|
| }
|
| }
|
| @@ -7968,9 +7963,15 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT(
|
| int32 sync_shm_id = static_cast<int32>(c.sync_data_shm_id);
|
| uint32 sync_shm_offset = static_cast<uint32>(c.sync_data_shm_offset);
|
|
|
| - if (!feature_info_->feature_flags().occlusion_query_boolean) {
|
| - SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT: not enabled");
|
| - return error::kNoError;
|
| + switch (target) {
|
| + case GL_COMMANDS_ISSUED_CHROMIUM:
|
| + break;
|
| + default:
|
| + if (!feature_info_->feature_flags().occlusion_query_boolean) {
|
| + SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT: not enabled");
|
| + return error::kNoError;
|
| + }
|
| + break;
|
| }
|
|
|
| if (current_query_) {
|
| @@ -7994,23 +7995,12 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT(
|
| "glBeginQueryEXT: id not made by glGenQueriesEXT");
|
| return error::kNoError;
|
| }
|
| - // Makes object and assoicates with memory.
|
| - GLuint service_id = 0;
|
| - glGenQueriesARB(1, &service_id);
|
| - DCHECK_NE(0u, service_id);
|
| - query = query_manager_->CreateQuery(client_id, service_id);
|
| - }
|
|
|
| - QuerySync* sync = GetSharedMemoryAs<QuerySync*>(
|
| - sync_shm_id, sync_shm_offset, sizeof(*sync));
|
| - if (!sync) {
|
| - DLOG(ERROR) << "Invalid shared memory referenced by query";
|
| - return error::kOutOfBounds;
|
| + query = query_manager_->CreateQuery(
|
| + target, client_id, sync_shm_id, sync_shm_offset);
|
| }
|
|
|
| - if (!query->IsInitialized()) {
|
| - query->Initialize(target, sync_shm_id, sync_shm_offset);
|
| - } else if (query->target() != target) {
|
| + if (query->target() != target) {
|
| SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT: target does not match");
|
| return error::kNoError;
|
| } else if (query->shm_id() != sync_shm_id ||
|
| @@ -8019,11 +8009,11 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT(
|
| return error::kInvalidArguments;
|
| }
|
|
|
| - query_manager_->RemovePendingQuery(query);
|
| + if (!query_manager_->BeginQuery(query)) {
|
| + return error::kOutOfBounds;
|
| + }
|
|
|
| - glBeginQueryARB(target, query->service_id());
|
| current_query_ = query;
|
| -
|
| return error::kNoError;
|
| }
|
|
|
| @@ -8041,10 +8031,12 @@ error::Error GLES2DecoderImpl::HandleEndQueryEXT(
|
| "glEndQueryEXT: target does not match active query");
|
| return error::kNoError;
|
| }
|
| - glEndQueryARB(target);
|
| - query_manager_->AddPendingQuery(current_query_, submit_count);
|
| - current_query_ = NULL;
|
|
|
| + if (!query_manager_->EndQuery(current_query_, submit_count)) {
|
| + return error::kOutOfBounds;
|
| + }
|
| +
|
| + current_query_ = NULL;
|
| return error::kNoError;
|
| }
|
|
|
|
|