| 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 2f4c1e6557a23788d1de333bd063e49f470be3ef..3811ac8d9674c527329011fcb7d38a9cbe118248 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -2023,7 +2023,8 @@ 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, feature_info_->feature_flags(
|
| + ).use_arb_occlusion_query2_for_occlusion_query_boolean));
|
|
|
| util_.set_num_compressed_texture_formats(
|
| validators_->compressed_texture_format.GetValues().size());
|
| @@ -7931,11 +7932,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;
|
| }
|
|
|
| @@ -7947,8 +7944,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]);
|
| }
|
| }
|
| @@ -7958,7 +7954,7 @@ bool GLES2DecoderImpl::ProcessPendingQueries() {
|
| if (query_manager_.get() == NULL) {
|
| return false;
|
| }
|
| - if (!query_manager_->ProcessPendingQueries(this)) {
|
| + if (!query_manager_->ProcessPendingQueries()) {
|
| current_decoder_error_ = error::kOutOfBounds;
|
| }
|
| return query_manager_->HavePendingQueries();
|
| @@ -7971,9 +7967,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_) {
|
| @@ -7989,31 +7991,28 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT(
|
|
|
| QueryManager::Query* query = query_manager_->GetQuery(client_id);
|
| if (!query) {
|
| + // TODO(gman): Decide if we need this check.
|
| + //
|
| // Checks id was made by glGenQueries
|
| - IdAllocatorInterface* id_allocator =
|
| - group_->GetIdAllocator(id_namespaces::kQueries);
|
| - if (!id_allocator->InUse(client_id)) {
|
| - SetGLError(GL_INVALID_OPERATION,
|
| - "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;
|
| - }
|
| -
|
| - if (!query->IsInitialized()) {
|
| - query->Initialize(target, sync_shm_id, sync_shm_offset);
|
| - } else if (query->target() != target) {
|
| + //
|
| + // From the POV of OpenGL ES 2.0 you need to call glGenQueriesEXT
|
| + // for all Query ids but from the POV of the command buffer service maybe
|
| + // you don't.
|
| + //
|
| + // The client can enforce this. I don't think the service cares.
|
| + //
|
| + // IdAllocatorInterface* id_allocator =
|
| + // group_->GetIdAllocator(id_namespaces::kQueries);
|
| + // if (!id_allocator->InUse(client_id)) {
|
| + // SetGLError(GL_INVALID_OPERATION,
|
| + // "glBeginQueryEXT: id not made by glGenQueriesEXT");
|
| + // return error::kNoError;
|
| + // }
|
| + query = query_manager_->CreateQuery(
|
| + target, client_id, sync_shm_id, sync_shm_offset);
|
| + }
|
| +
|
| + if (query->target() != target) {
|
| SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT: target does not match");
|
| return error::kNoError;
|
| } else if (query->shm_id() != sync_shm_id ||
|
| @@ -8022,11 +8021,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;
|
| }
|
|
|
| @@ -8044,10 +8043,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;
|
| }
|
|
|
|
|